Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:Linux üzerinde SQL Server
SQL Değerlendirme API, SQL Server'ın yapılandırmasını en iyi uygulamalar için değerlendirmek için bir mekanizma sağlar. API, SQL Server ekibi tarafından önerilen en iyi yöntemleri içeren bir kural kümesiyle teslim edilir. Bu kural kümesi, yeni sürümlerin yayımlanmasıyla geliştirilmiştir. SQL Server yapılandırmanızın önerilen en iyi yöntemlerle uyumlu olduğundan emin olmak yararlı olur.
Microsoft tarafından gönderilen kural seti GitHub'da mevcut. tüm kural kümesiniörnekleri deposundagörüntüleyebilirsiniz.
Bu makalede, Linux üzerinde SQL Server ve konteynerlerde SQL Değerlendirme API'sini çalıştırmak için PowerShell kullanın.
Önkoşullar
SqlServerkullanıcısı olarak çalışan PowerShell Galerisi'ndenmssqlPowerShell modülünü yükleyin.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
Değerlendirmeyi ayarlama
SQL Değerlendirme API, JSON formatında çıktı sağlar. SQL Değerlendirme API'sini yapılandırmak için aşağıdaki adımları tamamlayın:
Değerlendirmek istediğiniz örnekte SQL Authentication kullanarak SQL Server değerlendirmeleri için bir giriş oluşturun. Aşağıdaki Transact-SQL betiklerini kullanarak bir giriş ve güçlü bir şifre oluşturun. Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOCONTROL SERVERizni, çoğu değerlendirmede işe yarar. Ancak, bazı değerlendirmeler sistem yöneticisi ayrıcalıkları gerektirebilir. Bu değerlendirmeleri çalıştırmıyorsanız,CONTROL SERVERizinlerini kullanın.Örneke bağlanmak için kimlik bilgilerini sakla. Önceki adımda kullandığınız şifreyi değiştirin
<password>.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentKimlik bilgilerine yalnızca
mssqlkullanıcının erişebilmesini sağlayarak yeni değerlendirme kimlik bilgilerinin güvenliğini sağlayın.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Değerlendirme betiğini indirme
Aşağıdaki örnek betik, önceki adımlarda oluşturduğunuz kimlik bilgilerini kullanarak SQL Değerlendirme API'sini çağırır. Betik, /var/opt/mssql/log/assessments dizininde JSON çıktısı oluşturur.
Not
SQL Değerlendirme API'si, CSV ve XML biçimlerinde de çıkış oluşturabilir.
Bu betik, GitHubüzerinden indirilebilir.
Bu dosyayı /opt/mssql/bin/runassessment.ps1olarak kaydedebilirsiniz.
[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
}
}
Not
Bu betiği güvenilir ortamlarda çalıştırdığınızda ve oturum açma öncesi bir el sıkışma hatası alırsanız, kodda $serverName, $hostName ve Get-SqlInstance satırlarının komutlarına -TrustServerCertificate bayrağını ekleyin.
Değerlendirmeyi çalıştırma
Kullanıcının scripte sahip olduğundan ve çalıştırabileceğinden emin
mssqlolun.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Bir log klasörü oluşturun ve kullanıcıya klasör için izinler verin
mssql.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Artık ilk değerlendirmenizi kullanıcı
mssqlolarak oluşturabilirsiniz. Bu kullanıcı olarak değerlendirmeler yapmak daha güvenlidir, özellikle sonraki değerlendirmeleri otomatik olarak veyacronsystemdüzerinden çalıştırdığınızda.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Komut bittiğinde, çıktıyı JSON formatında oluşturur. Bu çıktıyı, JSON dosyalarını ayrıştırmayı destekleyen herhangi bir araçla, Visual Studio Code dahil olmak üzere, kullanabilirsiniz.
İlgili içerik
- SQL Değerlendirme API'si
- Azure VM'lerinde SQL Server için SQL en iyi yöntemler değerlendirmesi
- SQL Server için Güvenlik açığı değerlendirmesi