次の方法で共有


PowerShell を使用して Always Encrypted キーをプロビジョニングする

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この記事では、 SqlServer PowerShell モジュールを使用し、Always Encrypted のキーを与える手順について説明します。 PowerShell を使用し、Always Encrypted キーを与えることができますが、そのとき、 役割の分離を指定することも、指定しないこともできます。キー ストアの実際の暗号鍵にアクセスするユーザーとデータベースにアクセスするユーザーを制御できます。

推奨されるベスト プラクティスを含む (上位)、Always Encrypted のキー管理の概要については、「Always Encrypted のキー管理の概要」を参照してください。 Always Encrypted に SqlServer PowerShell を使用する方法については、「 PowerShell を使用した Always Encrypted の構成」を参照してください。

ロールを分離しないキー プロビジョニング

このセクションで説明するキーのプロビジョニング方法では、セキュリティ管理者と DBA の間での役割の分離はサポートされていません。 このセクションの一部の手順では、物理キーに対する操作とキー メタデータに対する操作を組み合わせます。 そのため、この方法によるキーのプロビジョニングは、DevOps モデルを使用している組織の場合、またはデータベースがクラウドでホストされていて、(オンプレミスの DBA ではなく) クラウドの管理者の機密データへのアクセスを制限することが主な目的の場合に、お勧めします。 潜在的な対立関係に DBA が含まれる場合、または DBA に機密データへのアクセスを許可するべきではない場合は、この方法は推奨されません。

プレーンテキスト キーまたはキー ストア (次の表の 「 プレーンテキスト キー/キー ストアへのアクセス 」列で識別される) へのアクセスを含む手順を実行する前に、PowerShell 環境が、データベースをホストしているコンピューターとは異なるセキュリティで保護されたコンピューター上で実行されていることを確認してください。 詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。

タスク [アーティクル] プレーンテキストのキー/キー ストアへのアクセス データベースへのアクセス
ステップ 1. キー ストアで列マスター キーを作成します。

注意: SqlServer PowerShell モジュールでは、この手順はサポートされていません。 コマンドラインからこのタスクを実行するには、選択したキー ストアに固有のツールを使用します。
Always Encrypted の列マスター キーを作成して保存する はい いいえ
ステップ 2. PowerShell 環境を起動し、SqlServer の PowerShell モジュールをインポートします。 PowerShell を使用した Always Encrypted の構成 いいえ いいえ
手順 3. サーバーとデータベースに接続します。 データベースに接続する いいえ はい
ステップ 4: 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリ (PowerShell) に存在するオブジェクトです。 キー ストアに固有のコマンドレットを使用します。 New-SqlAzureKeyVaultColumnMasterKeySettings

新しい-SqlCertificateStoreColumnMasterKeySettings

新しい-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings (SQLのCSPカラムマスターキー設定の新規作成)
いいえ いいえ
ステップ 5: データベースの列マスター キーに関するメタデータを作成します。

手記: 列マスター キーの生成に使用されるキーまたは証明書の有効性は確認されません。
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey

注: このコマンドレットでは、 CREATE COLUMN MASTER KEY ステートメントを発行してキー メタデータを作成します。
いいえ はい
ステップ 6. 列マスター キーが Azure Key Vault に保存されている場合、Azure に対して認証します。 Connect-AzAccount (接続-AzAccount) はい いいえ
手順 7. 列マスター キーが Azure Key Vault に格納されている場合は、Azure Key Vault のアクセス トークンを取得します。 Get-AzAccessToken の取得 いいえ いいえ
手順 8. 新しい列暗号化キーを生成し、それを列マスター キーで暗号化し、データベースで列の暗号化キー メタデータを作成します。 新しい SqlColumnEncryptionKey

注: 内部で列の暗号化キーを生成し、暗号化するコマンドレットのバリエーションを使用します。

手記: このコマンドレットでは、キー メタデータを作成するために CREATE COLUMN ENCRYPTION KEY ステートメントを発行します。
はい はい

役割を分離しない Windows 証明書ストア (例)

このスクリプトは、Windows 証明書ストアの証明書である列マスター キーを生成し、列の暗号化キーを生成して暗号化し、SQL Server データベースでキー メタデータを作成する方法を端から端まで例示しています。

# 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

ロールを分離しない Azure Key Vault (例)

このスクリプトは、Azure Key Vault でキー コンテナーをプロビジョニングして構成し、そのキー コンテナーで列マスター キーを生成し、列の暗号化キーを生成して暗号化し、Azure SQL データベースでキー メタデータを作成する方法を端から端まで例示しています。

# 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

役割を分離しない CNG/KSP (例)

下のスクリプトは、Cryptography Next Generation API (CNG) を実装するキー ストアで列マスター キーを生成し、列の暗号化キーを生成して暗号化し、SQL Server データベースでキー メタデータを作成する方法を端から端まで例示しています。

この例では、Microsoft Software Key Storage Provider を使用するキー ストアを使用します。 ハードウェア セキュリティ モジュールなど、別のストアを使用するように例を変更することもできます。 そのためには、デバイスに CNG を実装するキー ストア プロバイダー (KSP) がコンピューターに適切にインストールされていることを確認する必要があります。 Microsoft Software Key Storage Provider をデバイスの KSP 名に置き換える必要があります。

# 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

役割の分離を指定したキーのプロビジョニング

このセクションでは、セキュリティ管理者がデータベースにアクセスせず、データベース管理者にキー ストアまたはプレーンテキスト キーへのアクセス許可を与えない暗号化を構成するための手順について説明します。

セキュリティ管理者

プレーンテキスト キーまたはキー ストア (次の表のプレーンテキスト キー/キー ストア列にアクセスする列で識別される) へのアクセス を含む手順を実行する前に、次の点を確認してください。

  • データベースをホストしているコンピューターとは別の安全なコンピューターで PowerShell 環境が実行されています。
  • 組織の DBA に、コンピューターにアクセスする許可が与えられていません (アクセスできると、役割の分離の目的が達成されません)。

詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。

タスク [アーティクル] プレーンテキストのキー/キー ストアへのアクセス データベースへのアクセス
ステップ 1. キー ストアで列マスター キーを作成します。

注意: SqlServer モジュールでは、この手順はサポートされていません。 コマンドラインからこのタスクを実行するには、キー ストアの種類に固有のツールを使用する必要があります。
Always Encrypted の列マスター キーを作成して保存する はい いいえ
ステップ 2. PowerShell セッションを起動し、SqlServer のモジュールをインポートします。 SqlServer モジュールのインポート いいえ いいえ
手順 3. 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリ (PowerShell) に存在するオブジェクトです。 キー ストアに固有のコマンドレットを使用します。 New-SqlAzureKeyVaultColumnMasterKeySettings

新しい-SqlCertificateStoreColumnMasterKeySettings

新しい-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings (SQLのCSPカラムマスターキー設定の新規作成)
いいえ いいえ
ステップ 4: 列マスター キーが Azure Key Vault に保存されている場合、Azure に対して認証します。 Connect-AzAccount (接続-AzAccount) はい いいえ
ステップ 5: 列マスター キーが Azure Key Vault に格納されている場合は、Azure Key Vault のアクセス トークンを取得します。 Get-AzAccessToken の取得 いいえ いいえ
ステップ 6. 列暗号化キーを生成し、それを列マスター キーで暗号化して列の暗号化キーの値を暗号化します。 新しい SqlColumnEncryptionKeyEncryptedValue はい いいえ
手順 7. 列マスター キーの場所 (プロバイダー名と列マスター キーのキー パス) と列暗号化キーの暗号化値を DBA に提供します。 記事の最後にある例を参照してください。 いいえ いいえ

DBA

DBA は、セキュリティ管理者から受け取った (上記の手順 7) 情報を利用し、データベースの Always Encrypted キー メタデータを作成し、管理します。

タスク [アーティクル] プレーンテキストのキーへのアクセス データベースへのアクセス
ステップ 1. 列の暗号化キーの場所と列の暗号化キーの暗号化された値をセキュリティ管理者から取得します。 記事の最後にある例を参照してください。 いいえ いいえ
ステップ 2. PowerShell 環境を起動し、Sql Server のモジュールをインポートします。 PowerShell を使用した Always Encrypted の構成 いいえ いいえ
手順 3. サーバーとデータベースに接続します。 データベースに接続する いいえ はい
ステップ 4: 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリに存在するオブジェクトです。 New-SqlColumnMasterKeySettings いいえ いいえ
ステップ 5: データベースの列マスター キーに関するメタデータを作成します。

手記: 列マスター キーの生成に使用されるキーまたは証明書の有効性は確認されません。
新しい-SqlColumnMasterKey
注: このコマンドレットは背後で CREATE COLUMN MASTER KEY (Transact-SQL) ステートメントを発行し、列マスター キー メタデータを作成します。
いいえ はい
ステップ 6. データベースで列の暗号化キー メタデータを作成します。 New-SqlColumnEncryptionKey
注: DBA は、列の暗号化キー メタデータのみを作成するコマンドレットのバリエーションを使用します。
このコマンドレットは背後で CREATE COLUMN ENCRYPTION KEY (Transact-SQL) ステートメントを発行し、列の暗号化キー メタデータを作成します。
いいえ はい

役割を分離した Windows 証明書ストア (例)

セキュリティ管理者

# 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

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