SQL Assessment-API gebruiken voor SQL Server in Linux

Van toepassing op:SQL Server op Linux

De SQL Assessment API biedt een mechanisme om de configuratie van SQL Server te evalueren voor best practices. De API wordt geleverd met een regelset met aanbevolen procedures van het SQL Server-team. Deze regelset is verbeterd met de release van nieuwe versies. Het is nuttig om te controleren of uw SQL Server-configuratie in overeenstemming is met de aanbevolen procedures.

De door Microsoft uitgebrachte regelset is beschikbaar op GitHub. U kunt de hele regelset bekijken in de opslagplaats met voorbeelden.

Gebruik in dit artikel PowerShell om de SQL Assessment API voor SQL Server on Linux en containers uit te voeren.

Vereiste voorwaarden

  1. Zorg ervoor dat u PowerShell installeert in Linux.

  2. Installeer de SqlServer PowerShell-module vanuit de PowerShell Gallery, terwijl u bent aangemeld als gebruiker mssql.

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

De assessment configureren

De SQL Assessment API levert output in JSON-formaat. Om de SQL Assessment API te configureren, voltooi je de volgende stappen:

  1. Maak een login aan voor SQL Server-assessments met SQL-authenticatie in de instantie die je wilt beoordelen. Gebruik het volgende Transact-SQL script om een login en een sterk wachtwoord aan te maken. Uw wachtwoord moet voldoen aan het standaard SQL Server-wachtwoordbeleid . Standaard moet het wachtwoord ten minste acht tekens lang zijn en tekens bevatten uit drie van de volgende vier sets: hoofdletters, kleine letters, basis-10 cijfers en symbolen. Wachtwoorden mogen maximaal 128 tekens lang zijn. Gebruik wachtwoorden die zo lang en complex mogelijk zijn.

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

    De CONTROL SERVER toestemming werkt voor de meeste beoordelingen. Echter, een paar beoordelingen vereisen mogelijk systeembeheerdersrechten . Als je die beoordelingen niet uitvoert, gebruik dan de machtiging CONTROL SERVER.

  2. Sla de inloggegevens op om verbinding te maken met de instantie. Vervang <password> het door het wachtwoord dat je in de vorige stap gebruikte.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Beveilig de nieuwe evaluatiereferenties door ervoor te zorgen dat alleen de mssql gebruiker toegang heeft tot de referenties.

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

Het evaluatiescript downloaden

Het volgende voorbeeldscript roept de SQL Assessment API aan met behulp van de inloggegevens die je in de voorgaande stappen hebt aangemaakt. Het script genereert JSON-output in de /var/opt/mssql/log/assessments map.

Opmerking

De SQL Assessment-API kan ook uitvoer genereren in CSV- en XML-indelingen.

Dit script is beschikbaar om te downloaden via GitHub.

U kunt dit bestand opslaan als /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
    }
}

Opmerking

Wanneer je dit script uitvoert in vertrouwde omgevingen en je krijgt een prelogin handshake-fout, voeg dan de -TrustServerCertificate vlag toe aan de commando's voor $serverName, $hostName, en Get-SqlInstance regels in de code.

De evaluatie uitvoeren

  1. Zorg dat de mssql gebruiker het script bezit en het kan uitvoeren.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Maak een logmap aan en geef de mssql gebruiker rechten voor die map.

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Je kunt nu je eerste beoordeling maken als gebruiker mssql . Het uitvoeren van assessments als deze gebruiker is veiliger, vooral wanneer je latere assessments automatisch door cron of systemdlaat lopen.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Wanneer het commando klaar is, wordt de uitvoer in JSON-formaat aangemaakt. Je kunt deze uitvoer gebruiken met elk hulpmiddel dat het parsen van JSON-bestanden ondersteunt, inclusief Visual Studio Code.