Použití rozhraní SQL Assessment API pro SQL Server v Linuxu

Platí pro:SQL Server v Linuxu

SQL Assessment API poskytuje mechanismus pro vyhodnocení konfigurace SQL Server pro nejlepší postupy. Rozhraní API se dodává se sadou pravidel obsahující osvědčené postupy doporučené týmem SQL Serveru. Tato sada pravidel je rozšířena o vydání nových verzí. Je užitečné zajistit, aby konfigurace SQL Serveru byla v souladu s doporučenými osvědčenými postupy.

Pravidla od Microsoft jsou dostupná na GitHub. Můžete zobrazit celou sadu pravidel v úložišti ukázek .

V tomto článku použijte PowerShell k provozu SQL Assessment API pro SQL Server on Linux a kontejnery.

Požadavky

  1. Ujistěte se, že nainstalujte PowerShell na Linuxu.

  2. Nainstalujte modul PowerShell SqlServer z galerie PowerShell, běží pod uživatelem mssql.

    su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
    

Nastavení posouzení

SQL Assessment API poskytuje výstup ve formátu JSON. Pro konfiguraci SQL Assessment API vyplňte následující kroky:

  1. Vytvořte si přihlášení pro hodnocení SQL Server pomocí SQL Authentication v instanci, kterou chcete hodnotit. Použijte následující Transact-SQL skript k vytvoření přihlášení a silného hesla. Vaše heslo by mělo postupovat podle výchozích zásad hesel SQL Serveru . Ve výchozím nastavení musí heslo obsahovat alespoň osm znaků a musí obsahovat znaky ze tří z následujících čtyř sad: velká písmena, malá písmena, číslice se základem 10 a symboly. Hesla můžou mít délku až 128 znaků. Používejte hesla, která jsou co nejdéle a složitá.

    USE [master];
    GO
    
    CREATE LOGIN [assessmentLogin]
        WITH PASSWORD = N'<password>';
    
    GRANT CONTROL SERVER TO [assessmentLogin];
    GO
    

    Povolení CONTROL SERVER funguje u většiny hodnocení. Nicméně některá hodnocení mohou vyžadovat oprávnění správce systému . Pokud tyto testy neprovádíte, použijte CONTROL SERVER oprávnění.

  2. Uložte přihlašovací údaje pro připojení k instanci. Nahraďte <password> ho heslem, které jste použili v předchozím kroku.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Zabezpečte nové ověřovací údaje posouzení tím, že zajistíte, aby k těmto údajům měl přístup pouze uživatel mssql.

    chmod 600 /var/opt/mssql/secrets/assessment
    chown mssql:mssql /var/opt/mssql/secrets/assessment
    

Stažení skriptu pro posouzení

Následující ukázkový skript volá SQL Assessment API pomocí přihlašovacích údajů, které jste vytvořili v předchozích krocích. Skript generuje výstup JSON v adresáři /var/opt/mssql/log/assessments .

Poznámka

Rozhraní SQL Assessment API může také generovat výstup ve formátech CSV a XML.

Tento skript je k dispozici ke stažení z GitHubu.

Tento soubor můžete uložit jako /opt/mssql/bin/runassessment.ps1.

[CmdletBinding()] param ()

$Error.Clear()

# Create output directory if not exists

$outDir = '/var/opt/mssql/log/assessments'
if (-not ( Test-Path $outDir )) { mkdir $outDir }
$outPath = Join-Path $outDir 'assessment-latest'

$errorPath = Join-Path $outDir 'assessment-latest-errors'
if ( Test-Path $errorPath ) { remove-item $errorPath }

function ConvertTo-LogOutput {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        $input
    )
    process {
        switch ($input) {
            { $_ -is [System.Management.Automation.WarningRecord] } {
                $result = @{
                    'TimeStamp' = $(Get-Date).ToString("O");
                    'Warning'   = $_.Message
                }
            }
            default {
                $result = @{
                    'TimeStamp'      = $input.TimeStamp;
                    'Severity'       = $input.Severity;
                    'TargetType'     = $input.TargetType;
                    'ServerName'     = $serverName;
                    'HostName'       = $hostName;
                    'TargetName'     = $input.TargetObject.Name;
                    'TargetPath'     = $input.TargetPath;
                    'CheckId'        = $input.Check.Id;
                    'CheckName'      = $input.Check.DisplayName;
                    'Message'        = $input.Message;
                    'RulesetName'    = $input.Check.OriginName;
                    'RulesetVersion' = $input.Check.OriginVersion.ToString();
                    'HelpLink'       = $input.HelpLink
                }

                if ( $input.TargetType -eq 'Database') {
                    $result['AvailabilityGroup'] = $input.TargetObject.AvailabilityGroupName
                }
            }
        }

        $result
    }
}

function Get-TargetsRecursive {

    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        [Microsoft.SqlServer.Management.Smo.Server] $server
    )

    $server
    $server.Databases
}

function Get-ConfSetting {
    [CmdletBinding()]
    param (
        $confFile,
        $section,
        $name,
        $defaultValue = $null
    )

    $inSection = $false

    switch -regex -file $confFile {
        "^\s*\[\s*(.+?)\s*\]" {
            $inSection = $matches[1] -eq $section
        }
        "^\s*$($name)\s*=\s*(.+?)\s*$" {
            if ($inSection) {
                return $matches[1]
            }
        }
    }

    return $defaultValue
}

try {
    Write-Verbose "Acquiring credentials"

    $login, $pwd = Get-Content '/var/opt/mssql/secrets/assessment' -Encoding UTF8NoBOM -TotalCount 2
    $securePassword = ConvertTo-SecureString $pwd -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential ($login, $securePassword)
    $securePassword.MakeReadOnly()

    Write-Verbose "Acquired credentials"

    $serverInstance = '.'

    if (Test-Path /var/opt/mssql/mssql.conf) {
        $port = Get-ConfSetting /var/opt/mssql/mssql.conf network tcpport

        if (-not [string]::IsNullOrWhiteSpace($port)) {
            Write-Verbose "Using port $($port)"
            $serverInstance = "$($serverInstance),$($port)"
        }
    }

    # IMPORTANT: If the script is run in trusted environments and there is a prelogin handshake error,
    # add -TrustServerCertificate flag in the commands for $serverName, $hostName and Get-SqlInstance lines below.
    $serverName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT @@SERVERNAME")[0]
    $hostName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT HOST_NAME()")[0]

    # Invoke assessment and store results.
    # Replace 'ConvertTo-Json' with 'ConvertTo-Csv' to change output format.
    # Available output formats: JSON, CSV, XML.
    # Encoding parameter is optional.

    Get-SqlInstance -ServerInstance $serverInstance -Credential $credential -ErrorAction Stop
    | Get-TargetsRecursive
    | ForEach-Object { Write-Verbose "Invoke assessment on $($_.Urn)"; $_ }
    | Invoke-SqlAssessment 3>&1
    | ConvertTo-LogOutput
    | ConvertTo-Json -AsArray
    | Set-Content $outPath -Encoding UTF8NoBOM
}
finally {
    Write-Verbose "Error count: $($Error.Count)"

    if ($Error) {
        $Error
        | ForEach-Object { @{ 'TimeStamp' = $(Get-Date).ToString("O"); 'Message' = $_.ToString() } }
        | ConvertTo-Json -AsArray
        | Set-Content $errorPath -Encoding UTF8NoBOM
    }
}

Poznámka

Když tento skript spustíte v důvěryhodném prostředí a zobrazí se chyba handshake při předběžném přihlášení, přidejte do příkazů na řádcích $serverName, $hostName a Get-SqlInstance v kódu příznak -TrustServerCertificate.

Proveďte posouzení

  1. Ujistěte se, že mssql uživatel vlastní skript a může ho spustit.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Vytvořte složku log a dejte uživateli mssql oprávnění pro tuto složku.

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Nyní můžete vytvořit své první hodnocení jako uživatel.mssql Provádění hodnocení tímto uživatelem je bezpečnější, zvláště když pozdější hodnocení spouštíte automaticky přes cron nebo systemd.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Po dokončení příkazu vytvoří výstup ve formátu JSON. Tento výstup můžete použít s jakýmkoli nástrojem, který podporuje parsování JSON souborů, včetně Visual Studio Code.