Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:Program SQL Server w systemie Linux
SQL Assessment API zapewnia mechanizm oceny konfiguracji SQL Server w celu uzyskania najlepszych praktyk. Interfejs API jest dostarczany z zestawem reguł zawierającym najlepsze rozwiązania zalecane przez zespół programu SQL Server. Ten zestaw reguł został rozszerzony o wydanie nowych wersji. Warto upewnić się, że konfiguracja programu SQL Server jest zgodna z zalecanymi najlepszymi rozwiązaniami.
Zestaw reguł dostarczony przez Microsoft jest dostępny na GitHub. Można wyświetlić cały zestaw reguł w repozytorium przykładów .
W tym artykule użyj PowerShell do uruchomienia SQL Assessment API dla SQL Server on Linux oraz kontenerów.
Warunki wstępne
Upewnij się, że zainstalujesz program PowerShell w systemie Linux.
Zainstaluj moduł PowerShell
SqlServerz galerii programu PowerShell, uruchamiając jako użytkownikmssql.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
Konfigurowanie oceny
SQL Assessment API dostarcza wyniki w formacie JSON. Aby skonfigurować SQL Assessment API, wykonaj następujące kroki:
Utworz logowanie do ocen SQL Server z użyciem uwierzytelniania SQL w instancji, którą chcesz ocenić. Użyj poniższego skryptu Transact-SQL, aby utworzyć login i silne hasło. Hasło powinno być zgodne z domyślnymi zasadami haseł programu SQL Server. Domyślnie hasło musi mieć długość co najmniej ośmiu znaków i zawierać znaki z trzech z następujących czterech zestawów: wielkie litery, małe litery, cyfry podstawowe-10 i symbole. Hasła mogą mieć długość maksymalnie 128 znaków. Używaj haseł, które są tak długie i złożone, jak to możliwe.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOUprawnienie
CONTROL SERVERdziała w przypadku większości ocen. Jednak niektóre oceny mogą wymagać uprawnień administratora systemu . Jeśli nie przeprowadzasz tych ocen, użyj uprawnieńCONTROL SERVER.Zapisz dane uwierzytelniające do łączenia się z instancją. Zastąp
<password>hasłem użytym w poprzednim kroku.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentZabezpiecz nowe poświadczenia oceny, upewniając się, że tylko użytkownik
mssqlmoże uzyskiwać dostęp do poświadczeń.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Pobieranie skryptu oceny
Poniższy przykładowy skrypt wywołuje SQL Assessment API, używając poświadczeń uwierzytelniających utworzonych w poprzednich krokach. Skrypt generuje wyjście JSON w katalogu /var/opt/mssql/log/assessments .
Notatka
Interfejs API oceny SQL może również generować dane wyjściowe w formatach CSV i XML.
Ten skrypt jest dostępny do pobrania z witryny GitHub.
Możesz zapisać ten plik 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
}
}
Notatka
Gdy uruchamiasz ten skrypt w zaufanych środowiskach i pojawia się błąd wstępnego uzgadniania połączenia przed logowaniem, dodaj flagę -TrustServerCertificate do poleceń dla wierszy $hostName, $serverName i Get-SqlInstance w kodzie.
Uruchom ocenę
Upewnij się, że
mssqlużytkownik posiada skrypt i potrafi go wykonać.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Utwórz folder logów i nadaj użytkownikowi
mssqluprawnienia do tego folderu.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Możesz teraz utworzyć swoją pierwszą ocenę jako użytkownik.
mssqlPrzeprowadzanie ocen przez tego użytkownika jest bezpieczniejsze, zwłaszcza gdy późniejsze oceny wykonujesz automatycznie przezcronlubsystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Po zakończeniu polecenia tworzy wyjście w formacie JSON. Możesz użyć tego wyniku z dowolnym narzędziem wspierającym parsowanie plików JSON, w tym z Visual Studio Code.