Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
Ujistěte se, že nainstalujte PowerShell na Linuxu.
Nainstalujte modul PowerShell
SqlServerz galerie PowerShell, běží pod uživatelemmssql.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:
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]; GOPovolení
CONTROL SERVERfunguje 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žijteCONTROL SERVERoprávnění.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/assessmentZabezpeč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í
Ujistěte se, že
mssqluživatel vlastní skript a může ho spustit.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Vytvořte složku log a dejte uživateli
mssqloprá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/Nyní můžete vytvořit své první hodnocení jako uživatel.
mssqlProvádění hodnocení tímto uživatelem je bezpečnější, zvláště když pozdější hodnocení spouštíte automaticky přescronnebosystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"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.