Aracılığıyla paylaş


PowerShell kullanarak Always Encrypted anahtarları sağlama

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu makalede, SqlServer PowerShell modülünü kullanarak Always Encrypted için anahtar sağlama adımları sağlanır. PowerShell'i kullanarak hem hem de rol ayrımıolmadan Always Encrypted anahtarları sağlayabilir, böylece anahtar deposundaki gerçek şifreleme anahtarlarına kimlerin erişimi olduğu ve veritabanına kimlerin erişimi olduğu üzerinde denetim sağlayabilirsiniz.

Bazı üst düzey en iyi uygulama önerileri de dahil olmak üzere Always Encrypted anahtar yönetimine genel bakış için bkz. Always Encryptediçin anahtar yönetimine genel bakış . Always Encrypted için SqlServer PowerShell modülünü kullanmaya başlama hakkında bilgi için bkz. PowerShellkullanarak Always Encrypted'ı yapılandırma .

Rol ayrımı olmadan Anahtar Temini

Bu bölümde açıklanan anahtar sağlama yöntemi, Güvenlik Yöneticileri ile DTA'lar arasındaki rol ayrımını desteklemez. Bu bölümdeki adımlardan bazıları, fiziksel anahtarlardaki işlemleri anahtar meta verilerindeki işlemlerle birleştirir. Bu nedenle, anahtarları sağlamanın bu yöntemi DevOps modelini kullanan kuruluşlar için önerilir veya veritabanı bulutta barındırılıyorsa ve birincil hedef bulut yöneticilerinin (şirket içi DTA'ların değil) hassas verilere erişmesini kısıtlamaktır. Olası saldırganlar arasında DBA'lar varsa veya DBA'ların hassas verilere erişimi olmaması gerekiyorsa, bu önerilmez.

Düz metin anahtarlarına veya anahtar deposuna (aşağıdaki tabloda yer alan Accesses düz metin anahtarları/anahtar deposu sütununda tanımlanan) erişimi içeren adımları çalıştırmadan önce, PowerShell ortamının veritabanınızı barındıran bir bilgisayardan farklı güvenli bir makinede çalıştığından emin olun. Daha fazla bilgi için bkz. anahtar yönetimi için güvenlik konuları.

Görev Makale Düz metin anahtarlarına/anahtar deposuna erişir Veritabanına erişir
Adım 1. Anahtar deposunda bir sütun ana anahtarı oluşturun.

Not: SqlServer PowerShell modülü bu adımı desteklemez. Bu görevi bir komut satırından gerçekleştirmek için, seçtiğiniz anahtar deposuna özgü araçları kullanın.
Always Encrypted için sütun ana anahtarları oluşturma ve depolama Evet Hayır
Adım 2. Bir PowerShell ortamı başlatın ve SqlServer PowerShell modülünü içeri aktarın. PowerShell kullanarak Always Encrypted'ı Yapılandırma Hayır Hayır
Adım 3. Sunucunuza ve veritabanınıza bağlanın. Veritabanına bağlanma Hayır Evet
Adım 4. Sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. Anahtar deponuza özgü komut kümesini kullanın. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Hayır Hayır
Adım 5. Veritabanınızdaki sütun ana anahtarıyla ilgili meta verileri oluşturun.

Not: Sütun ana anahtarını oluşturmak için kullanılan anahtarların veya sertifikaların geçerliliğini doğrulamayız.
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey)

Not: Kapakların altında, cmdlet anahtar meta verileri oluşturmak için CREATE COLUMN MASTER KEY deyimini verir.
Hayır Evet
Adım 6. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure'da kimlik doğrulaması yapma. Bağlan-AzAccount Evet Hayır
Adım 7. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure Key Vault için bir erişim belirteci alın. Get-AzAccessToken Hayır Hayır
8. Adım. Yeni bir sütun şifreleme anahtarı oluşturun, bunu sütun ana anahtarıyla şifreleyin ve veritabanında sütun şifreleme anahtarı meta verileri oluşturun. New-SqlColumnEncryptionKey

Not: Dahili olarak bir sütun şifreleme anahtarı oluşturan ve şifreleyen cmdlet'in bir türevini kullanın.

Not: Arka planda, cmdlet anahtar meta verileri oluşturmak için CREATE COLUMN ENCRYPTION KEY ifadesini çalıştırır.
Evet Evet

Rol ayrımı olmadan Windows Sertifika Deposu (örnek)

Bu betik, Windows Sertifika Deposu'nda sertifika olan bir sütun ana anahtarı oluşturmaya, sütun şifreleme anahtarı oluşturup şifrelemeye ve SQL Server veritabanında anahtar meta verileri oluşturmaya yönelik uçtan uca bir örnektir.

# Create a column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange

# Import the SqlServer module.
Import-Module "SqlServer"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName  -InputObject $database -ColumnMasterKey $cmkName

Rol ayrımı olmadan Azure Key Vault (örnek)

Bu betik, Azure Key Vault'ta anahtar kasası sağlama ve yapılandırma, kasada bir sütun ana anahtarı oluşturma, sütun şifreleme anahtarı oluşturup şifreleme ve Azure SQL veritabanında anahtar meta verileri oluşturmaya yönelik uçtan uca bir örnektir.

# Create a column master key in Azure Key Vault.
Import-Module Az
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"

# Connect to your database (Azure SQL database).
Import-Module "SqlServer"

$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Authentication = Active Directory Integrated; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.Key.Kid

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings -KeyVaultAccessToken $keyVaultAccessToken

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken

Rol ayrımı olmadan CNG/KSP (örnek)

Aşağıdaki betik, Şifreleme Yeni Nesil API'si (CNG) uygulayan bir anahtar deposunda sütun ana anahtarı oluşturmaya, sütun şifreleme anahtarı oluşturup şifrelemeye ve SQL Server veritabanında anahtar meta verileri oluşturmaya yönelik uçtan uca bir örnektir.

Örnek, Microsoft Yazılım Anahtarı Depolama Sağlayıcısı'nı kullanan anahtar depoyu kullanır. Örneği, donanım güvenlik modülü gibi farklı bir depolama birimi kullanacak şekilde değiştirmeyi seçebilirsiniz. Bunun için cihazınız için CNG'yi uygulayan anahtar deposu sağlayıcısının (KSP) makinenize yüklendiğinden ve doğru şekilde yüklendiğinden emin olmanız gerekir. Microsoft Software Key Storage Provider cihazınızın KSP adıyla değiştirmeniz gerekir.

# Create a column master key in a key store that has a CNG provider, a.k.a key store provider (KSP).
$cngProviderName = "Microsoft Software Key Storage Provider" # If you have an HSM, you can use a KSP for your HSM instead of a Microsoft KSP
$cngAlgorithmName = "RSA"
$cngKeySize = 2048 # Recommended key size for Always Encrypted column master keys
$cngKeyName = "AlwaysEncryptedKey" # Name identifying your new key in the KSP
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty("Length", [System.BitConverter]::GetBytes($cngKeySize), [System.Security.Cryptography.CngPropertyOptions]::None);
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
$cngKey = [System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $cngKeyName, $cngKeyParams)

# Import the SqlServer module.
Import-Module "SqlServer"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $cngKeyName

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName

Rol ayrımı ile anahtar sağlama

Bu bölümde, güvenlik yöneticilerinin veritabanına erişimi olmayan ve veritabanı yöneticilerinin anahtar deposuna veya düz metin anahtarlarına erişimi olmayan şifrelemeyi yapılandırma adımları sağlanır.

Güvenlik yöneticisi

Düz metin anahtarlarına veya anahtar deposuna erişim içeren adımları çalıştırmadan önce (aşağıdaki tabloda yer alan Accesses düz metin anahtarları/anahtar deposu sütununda tanımlanır) şunlardan emin olun:

  • PowerShell ortamı, veritabanınızı barındıran bir bilgisayardan farklı olan güvenli bir makinede çalışır.
  • Kuruluşunuzdaki DTA'ların makineye erişimi yoktur (bu, rol ayrımının amacını yenebilir).

Daha fazla bilgi için bkz. anahtar yönetimi için güvenlik konuları.

Görev Makale Düz metin anahtarlarına/anahtar deposuna erişir Veritabanına erişir
Adım 1. Anahtar deposunda bir sütun ana anahtarı oluşturun.

Not: SqlServer modülü bu adımı desteklemez. Bu görevi bir komut satırından gerçekleştirmek için, anahtar deponuzun türüne özgü araçları kullanmanız gerekir.
Always Encrypted için sütun ana anahtarları oluşturma ve depolama Evet Hayır
Adım 2. Bir PowerShell oturumu başlatın ve SqlServer modülünü içeri aktarın. SqlServer modülünü içeri aktarma Hayır Hayır
Adım 3. Sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. Anahtar deponuza özgü komut kümesini kullanın. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Hayır Hayır
Adım 4. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure'da kimlik doğrulaması yapma. Bağlan-AzAccount Evet Hayır
Adım 5. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure Key Vault için bir erişim belirteci alın. Get-AzAccessToken Hayır Hayır
Adım 6. Bir sütun şifreleme anahtarı oluşturun, sütun şifreleme anahtarının şifrelenmiş değerini oluşturmak için bunu sütun ana anahtarıyla şifreleyin. New-SqlColumnEncryptionKeyEncryptedValue Evet Hayır
Adım 7. Sütun ana anahtarının konumunu (sağlayıcı adı ve sütun ana anahtarının anahtar yolu) ve DBA'ya sütun şifreleme anahtarının şifrelenmiş değerini sağlayın. Makalenin sonundaki örneklere bakın. Hayır Hayır

Veritabanı Yöneticisi (DBA)

DTA'lar, veritabanında Always Encrypted anahtar meta verilerini oluşturmak ve yönetmek için Güvenlik Yöneticisi'nden (yukarıdaki 7. adım) aldıkları bilgileri kullanır.

Görev Makale Düz metin anahtarlarına erişir Veritabanına erişir
Adım 1. Güvenlik Yöneticinizden sütun ana anahtarının konumunu ve sütun şifreleme anahtarının şifrelenmiş değerini alın. Makalenin sonundaki örneklere bakın. Hayır Hayır
Adım 2. Bir PowerShell ortamı başlatın ve SqlServer modülünü içeri aktarın. PowerShell kullanarak Always Encrypted'ı Yapılandırma Hayır Hayır
Adım 3. Sunucunuza ve bir veritabanına bağlanın. Veritabanına bağlanma Hayır Evet
Adım 4. Sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte bulunan bir nesnedir. Yeni-SqlSütunAnahtarAyarlaması Hayır Hayır
Adım 5. Veritabanınızdaki sütun ana anahtarıyla ilgili meta verileri oluşturun.

Not: Sütun ana anahtarını oluşturmak için kullanılan anahtarların veya sertifikaların geçerliliğini doğrulamayız.
New-SqlColumnMasterKey
Not: Cmdlet, arka planda sütun anahtar meta verilerini oluşturmak için CREATE COLUMN MASTER KEY (Transact-SQL) deyimini çalıştırır.
Hayır Evet
Adım 6. Veritabanında sütun şifreleme anahtarı meta verilerini oluşturun. New-SqlColumnEncryptionKey
Not: DTA'lar, cmdlet'in yalnızca sütun şifreleme anahtarı meta verilerini oluşturan bir varyasyonunu kullanır.
Cmdlet, kapakların ardında sütun şifreleme anahtarı meta verilerini oluşturmak için CREATE COLUMN ENCRYPTION KEY (Transact-SQL) ifadesini kullanır.
Hayır Evet

Rol ayrımı ile Windows Sertifika Deposu (örnek)

Güvenlik yöneticisi

# Create a column master key in Windows Certificate Store.
$storeLocation = "CurrentUser"
$certPath = "Cert:" + $storeLocation + "\My"
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation $certPath -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange

# Import the SqlServer module
Import-Module "SqlServer"

# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Generate a column encryption key, encrypt it with the column master key to produce an encrypted value of the column encryption key.
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings

# Share the location of the column master key and an encrypted value of the column encryption key with a DBA, via a CSV file on a share drive
$keyDataFile = "Z:\keydata.txt"
"KeyStoreProviderName, KeyPath, EncryptedValue" > $keyDataFile
$cmkSettings.KeyStoreProviderName + ", " + $cmkSettings.KeyPath + ", " + $encryptedValue >> $keyDataFile

# Read the key data back to verify
$keyData = Import-Csv $keyDataFile
$keyData.KeyStoreProviderName
$keyData.KeyPath
$keyData.EncryptedValue

Veritabanı Yöneticisi (DBA)

# Obtain the location of the column master key and the encrypted value of the column encryption key from your Security Administrator, via a CSV file on a share drive.
$keyDataFile = "Z:\keydata.txt"
$keyData = Import-Csv $keyDataFile

# Import the SqlServer module
Import-Module "SqlServer"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyData.KeyStoreProviderName -KeyPath $keyData.KeyPath

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a  column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -EncryptedValue $keyData.EncryptedValue