Sdílet prostřednictvím


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

platí pro:SQL Server – Linux

rozhraní SQL Assessment API poskytuje mechanismus pro vyhodnocení konfigurace SQL Serveru pro osvědčené 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.

Sada odeslaných pravidel společnosti Microsoft je k dispozici na GitHubu. Můžete zobrazit celou sadu pravidel v úložišti ukázek .

V tomto článku se podíváme na dva způsoby spuštění rozhraní SQL Assessment API pro SQL Server v Linuxu a kontejnerech:

Rozšíření SQL Assessment pro Azure Data Studio (názorný náhled)

Rozšíření SQL Assessment pro Azure Data Studio (Preview) poskytuje mechanismus pro vyhodnocení konfigurace SQL Serveru pro osvědčené postupy.

S touto verzí Preview můžete:

  • Posouzení SQL Serveru, databáze Azure SQL nebo služby Azure SQL Managed Instance a jejích databází s využitím integrovaných pravidel
  • Získání seznamu všech předdefinovaných pravidel použitelných pro instanci a její databáze
  • Export výsledků posouzení a seznamu použitelných pravidel jako skriptu pro uložení do tabulky SQL
  • Vytváření sestav HTML o výsledcích posouzení

snímek obrazovky znázorňující rozšíření pro hodnocení SQL v Azure Data Studio

Spusťte posouzení SQL

  • Po instalaci rozšíření SQL Assessment rozbalte seznam serverů, klikněte pravým tlačítkem na server nebo databázi, kterou chcete posoudit, a vyberte Spravovat.
  • Potom v části Obecné vyberte sql Assessment. Na kartě Posouzení vyberte Spustit posouzení a proveďte posouzení vybraného SQL Serveru nebo Azure SQL databáze. Jakmile budou výsledky k dispozici, můžete použít funkce filtrování a řazení.
  • Výběrem Exportovat ve scriptu získáte výsledky ve formátu pro vložení do tabulky. Můžete také vybrat Vytvořit sestavu HTML a uložit výsledky posouzení jako soubor HTML. Některá pravidla posouzení jsou určená pro konkrétní konfigurace SQL Serveru a některá pro jiné. Totéž platí pro pravidla databáze. Existují například pravidla, která platí jenom pro SQL Server 2016 (13.x) nebo tempdb databázi.
  • Tlačítko Zobrazit platná pravidla zobrazí pravidla posouzení, která se používají k hodnocení vašich serverů a databází po výběru možnosti Spustit hodnocení. Pokud chcete zobrazit informace o SQL Serveru a rozhraní SQL Assessment API, vyberte Informace. Výsledky relace posouzení si můžete prohlédnout na kartě Historie.

SQL Assessment API pomocí PowerShellu

Druhou možností je použít PowerShell ke spuštění skriptu rozhraní SQL Assessment API.

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í

Výstup rozhraní SQL Assessment API je k dispozici ve formátu JSON. Abyste mohli rozhraní SQL Assessment API nakonfigurovat následujícím způsobem, musíte provést následující kroky:

  1. V instanci, kterou chcete posoudit, vytvořte přihlášení pro posouzení SQL Serveru pomocí ověřování SQL. K vytvoření přihlášení a silného hesla můžete použít následující skript Transact-SQL (T-SQL). 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>';
    
    ALTER SERVER ROLE [CONTROL SERVER] ADD MEMBER [assessmentLogin];
    GO
    

    Role CONTROL SERVER funguje pro většinu hodnocení. Existuje však několik posouzení, která mohou potřebovat oprávnění správce systému . Pokud tato pravidla nepoužíváte, doporučujeme použít CONTROL SERVER oprávnění.

  2. Přihlašovací údaje pro přihlášení do systému uložte následujícím způsobem a znovu nahraďte <password> 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ásleduje ukázkový skript, který volá rozhraní SQL Assessment API pomocí přihlašovacích údajů vytvořených v předchozích krocích. Skript vygeneruje výstupní soubor ve formátu JSON v tomto umístění: /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ých prostředích a zobrazí se chyba handshake prelogin, přidejte příznak -TrustServerCertificate do příkazů na řádcích kódu $serverName, $hostName a Get-SqlInstance.

Proveďte posouzení

  1. Ujistěte se, že skript je vlastněn a je spustitelný pro mssql.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Vytvořte složku protokolu a přiřaďte uživateli mssql ve složce příslušná oprávnění:

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Teď můžete vytvořit první posouzení, ale ujistěte se, že to uděláte jako mssql uživatel, aby se následná posouzení mohly spouštět automaticky prostřednictvím cron nebo systemd bezpečněji.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Po dokončení příkazu se výstup vygeneruje ve formátu JSON. Tento výstup je možné integrovat s libovolným nástrojem, který podporuje parsování souborů JSON. Jedním z takových příkladů nástrojů je Red Hat Insights .