Бөлісу құралы:


Управление аудитом базы данных SQL с помощью REST API

Применимо к:База данных SQL в Microsoft Fabric

Rest API Fabric можно использовать для просмотра и настройки параметров аудита базы данных SQL программным способом. API настроек аудита SQL — это API уровня базы данных, который работает в отдельных базах данных SQL. Объединяя API с скриптами PowerShell, вы можете согласованно управлять аудитом во всех базах данных в рабочей области.

В этой статье показано, как использовать PowerShell и параметры аудита SQL уровня базы данных REST API для получения и обновления параметров аудита для баз данных SQL в рабочей области Fabric.

Необходимые условия

Аудит конечных точек REST API

API параметров аудита SQL предоставляет две операции управления аудитом в отдельных базах данных SQL:

Операция Метод URI
Получение параметров аудита SQL GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/sqlDatabases/{sqlDatabaseId}/settings/sqlAudit
Обновление параметров аудита SQL PATCH https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/sqlDatabases/{sqlDatabaseId}/settings/sqlAudit

Для операции Get требуется SQLDatabase.Read.All, SQLDatabase.ReadWrite.All, Item.Read.All или Item.ReadWrite.All делегированная область. Для операции обновления требуется SQLDatabase.ReadWrite.All или Item.ReadWrite.All делегированная область. Обе операции поддерживают удостоверения пользователей, принципалы служб и управляемые удостоверения.

Свойства параметров аудита

Объект параметров аудита содержит следующие свойства:

Недвижимость Тип Описание
auditActionsAndGroups строка[] Аудит действий и групп для фиксации. По умолчанию: BATCH_COMPLETED_GROUP, FAILED_DATABASE_AUTHENTICATION_GROUPSUCCESSFUL_DATABASE_AUTHENTICATION_GROUP.
predicateExpression струна Выражение предиката T-SQL, используемое для фильтрации событий аудита. Например, statement not like '[select ]%' исключает инструкции SELECT.
retentionDays целое число Количество дней для хранения журналов аудита. 0 указывает неограниченное хранение.
state струна Состояние аудита: Enabled или Disabled. При первом включении аудита без указания других свойств система использует значения по умолчанию.
storageEndpoint струна (только для чтения) Конечная точка хранилища OneLake, в которой хранятся журналы аудита.

Просмотр параметров аудита для всех баз данных в рабочей области

Следующий скрипт PowerShell содержит список всех баз данных SQL в рабочей области и извлекает конфигурацию аудита для каждой базы данных.

В следующем скрипте замените <your workspace id> на идентификатор рабочей области Fabric. Идентификатор рабочей области можно найти в URL-адресе, это уникальная строка внутри двух / символов после /groups/ окна браузера. Например, 00001111-aaaa-2222-bbbb-3333cccc4444 в https://fabric.microsoft.com/groups/00001111-aaaa-2222-bbbb-3333cccc4444/.

Import-Module Az.Accounts

Connect-AzAccount

$workspaceId = '<your workspace id>'
$baseUri = "https://api.fabric.microsoft.com"

# Obtain an access token
$token = (Get-AzAccessToken -ResourceUrl "https://api.fabric.microsoft.com")
$secureToken = $token.Token | ConvertFrom-SecureString -AsPlainText

$headers = @{
    "Authorization" = "Bearer $secureToken"
    "Content-Type"  = "application/json"
}

# List all SQL databases in the workspace
$databasesUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases"
$databases = @()
$continuationToken = $null

do {
    $url = $databasesUri
    if ($continuationToken) {
        $encoded = [System.Web.HttpUtility]::UrlEncode($continuationToken)
        $url = "$url`?continuationToken=$encoded"
    }
    $response = Invoke-RestMethod -Method GET -Uri $url -Headers $headers
    if ($response.value) { $databases += $response.value }
    $continuationToken = $response.continuationToken
} while ($continuationToken)

Write-Host "Found $($databases.Count) SQL databases."

# Retrieve audit settings for each database
$results = @()

foreach ($db in $databases) {
    try {
        $auditUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases/$($db.id)/settings/sqlAudit"
        $audit = Invoke-RestMethod -Method GET -Uri $auditUri -Headers $headers

        $results += [PSCustomObject]@{
            DatabaseName        = $db.displayName
            DatabaseId          = $db.id
            State               = $audit.state
            RetentionDays       = $audit.retentionDays
            AuditActionsAndGroups = ($audit.auditActionsAndGroups -join "; ")
            PredicateExpression = $audit.predicateExpression
        }
    }
    catch {
        $results += [PSCustomObject]@{
            DatabaseName        = $db.displayName
            DatabaseId          = $db.id
            State               = "ERROR"
            RetentionDays       = ""
            AuditActionsAndGroups = ""
            PredicateExpression = $_.Exception.Message
        }
    }
}

$results | Format-Table -AutoSize

Настройка аудита для всех баз данных в рабочей области

После просмотра текущего состояния аудита используйте следующий сценарий, чтобы настроить аудит согласованно во всех базах данных в рабочей области.

Замените <your workspace id> идентификатором рабочего пространства Fabric. Измените $auditPayload объект в соответствии с требуемой конфигурацией аудита.

Import-Module Az.Accounts

Connect-AzAccount

$workspaceId = '<your workspace id>'
$baseUri = "https://api.fabric.microsoft.com"

# Obtain an access token
$token = (Get-AzAccessToken -ResourceUrl "https://api.fabric.microsoft.com")
$secureToken = $token.Token | ConvertFrom-SecureString -AsPlainText

$headers = @{
    "Authorization" = "Bearer $secureToken"
    "Content-Type"  = "application/json"
}

# Define the audit configuration to apply
$auditPayload = @{
    state                = "Enabled"
    auditActionsAndGroups = @(
        "BATCH_COMPLETED_GROUP",
        "FAILED_DATABASE_AUTHENTICATION_GROUP",
        "SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP"
    )
    retentionDays        = 10
    predicateExpression  = "statement not like '[select ]%'"
} | ConvertTo-Json -Depth 5

# List all SQL databases in the workspace
$databasesUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases"
$databases = @()
$continuationToken = $null

do {
    $url = $databasesUri
    if ($continuationToken) {
        $encoded = [System.Web.HttpUtility]::UrlEncode($continuationToken)
        $url = "$url`?continuationToken=$encoded"
    }
    $response = Invoke-RestMethod -Method GET -Uri $url -Headers $headers
    if ($response.value) { $databases += $response.value }
    $continuationToken = $response.continuationToken
} while ($continuationToken)

Write-Host "Configuring auditing for $($databases.Count) SQL databases..."

foreach ($db in $databases) {
    try {
        $auditUri = "$baseUri/v1/workspaces/$workspaceId/sqlDatabases/$($db.id)/settings/sqlAudit"
        Invoke-RestMethod -Method PATCH -Uri $auditUri -Headers $headers -Body $auditPayload | Out-Null
        Write-Host "[OK] Updated auditing for: $($db.displayName)"
    }
    catch {
        Write-Host "[FAIL] $($db.displayName): $($_.Exception.Message)"
    }
}

Лучшие практики

  • Всегда извлекайте текущие параметры аудита с помощью запроса GET перед обновлением с помощью PATCH, чтобы понять существующую конфигурацию.
  • Обработка сбоев для каждой базы данных. Если обновление одной базы данных завершается ошибкой, продолжайте обработку оставшихся баз данных.
  • Повторите временные сбои отдельно вместо повторного запуска всего скрипта массового обновления.
  • Используйте служебный принципал или управляемую идентификацию для автоматической или запланированной настройки аудита в производственных средах.