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가 중요한 데이터에 액세스하면 안 되는 경우에는 권장되지 않습니다.

일반 텍스트 키 또는 키 저장소(아래 표의 Accesses 일반 텍스트 키/키 저장소 열에서 식별됨)에 대한 액세스와 관련된 단계를 실행하기 전에 PowerShell 환경이 데이터베이스를 호스트하는 컴퓨터와 다른 보안 컴퓨터에서 실행되도록 합니다. 자세한 내용은 키 관리에 대한 보안 고려 사항을 참조하세요.

Task 아티클 일반 텍스트 키/키 저장소에 액세스 데이터베이스에 액세스
1단계 키 저장소에 열 마스터 키를 만듭니다.

참고: SqlServer PowerShell 모듈은 이 단계를 지원하지 않습니다. 명령줄에서 이 작업을 수행하려면 선택한 키 저장소와 관련된 도구를 사용합니다.
Always Encrypted에 대한 열 마스터 키 만들기 및 저장 없음
2단계. PowerShell 환경을 시작하고 SqlServer PowerShell 모듈을 가져옵니다. PowerShell을 사용하여 Always Encrypted 구성 없음 없음
3단계: 서버 및 데이터베이스에 연결합니다. 데이터베이스에 연결 없음
4단계. 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다. 키 저장소와 관련된 cmdlet을 사용합니다. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
없음 없음
5단계. 데이터베이스의 열 마스터 키에 대한 메타데이터를 만듭니다. New-SqlColumnMasterKey

참고: 내부적으로 cmdlet은 CREATE COLUMN MASTER KEY(Transact-SQL) 문을 실행하여 키 메타데이터를 만듭니다.
없음
6단계 열 마스터 키가 Azure 주요 자격 증명 모음에 저장된 경우 Azure에 인증합니다. Connect-AzAccount 없음
7단계 열 마스터 키가 Azure Key Vault에 저장된 경우 Azure Key Vault에 대한 액세스 토큰을 가져옵니다. Get-AzAccessToken 없음 없음
8단계: 새 열 암호화 키를 생성하고 열 마스터 키로 암호화하고 데이터베이스에 열 암호화 키 메타데이터를 만듭니다. New-SqlColumnEncryptionKey

참고: 내부적으로 열 암호화 키를 생성하고 암호화하는 cmdlet 변형을 사용합니다.

참고: 이 cmdlet은 아래에 CREATE COLUMN ENCRYPTION KEY(Transact-SQL) 문을 실행하여 키 메타데이터를 만듭니다.

역할 구분이 없는 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"
$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"
$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(예)

아래 스크립트는 CNG(Cryptography Next Generation) API를 구현하는 키 스토리지에 열 마스터 키 생성, 열 암호화 키 생성 및 암호화, SQL Server 데이터베이스에 키 메타데이터 생성에 대한 엔드투엔드 예제입니다.

이 예제에서는 Microsoft Software Key Storage 공급자를 사용하는 키 저장소를 활용합니다. 하드웨어 보안 모듈과 같은 다른 저장소를 사용하도록 예제를 수정하도록 선택할 수 있습니다. 이를 위해 디바이스에 대한 CNG를 구현하는 KSP(키 저장소 공급자)가 컴퓨터에 제대로 설치되어 있는지 확인해야 합니다. 디바이스의 KSP 이름으로 바꾸어 Microsoft Software Key Storage Provider 야 합니다.

# 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"
$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

역할 구분이 있는 키 프로비전

이 섹션에서는 보안 관리자가 데이터베이스에 액세스할 수 없고 데이터베이스 관리자가 키 저장소 또는 일반 텍스트 키에 액세스할 수 없는 암호화를 구성하는 단계를 제공합니다.

보안 관리자

일반 텍스트 키 또는 키 저장소(아래 표의 Accesses 일반 텍스트 키/키 저장소 열에서 식별됨)에 대한 액세스와 관련된 단계를 실행하기 전에 다음을 확인합니다.

  1. PowerShell 환경은 데이터베이스를 호스팅하는 컴퓨터와 다른 보안 컴퓨터에서 실행됩니다.
  2. 조직의 DBA는 컴퓨터에 액세스할 수 없습니다(역할 분리의 목적을 무찌르는 것).

자세한 내용은 키 관리에 대한 보안 고려 사항을 참조하세요.

Task 아티클 일반 텍스트 키/키 저장소에 액세스 데이터베이스에 액세스
1단계 키 저장소에 열 마스터 키를 만듭니다.

참고: SqlServer 모듈은 이 단계를 지원하지 않습니다. 명령줄에서 이 작업을 수행하려면 키 저장소의 유형과 관련된 도구를 사용해야 합니다.
Always Encrypted에 대한 열 마스터 키 만들기 및 저장 없음
2단계. PowerShell 세션을 시작하고 SqlServer 모듈을 가져옵니다. SqlServer 모듈 가져오기 없음 없음
3단계: 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다. SqlColumnMasterKeySettings 는 메모리(PowerShell)에 있는 개체입니다. 키 저장소와 관련된 cmdlet을 사용합니다. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
없음 없음
4단계. 열 마스터 키가 Azure 주요 자격 증명 모음에 저장된 경우 Azure에 인증합니다. Connect-AzAccount 없음
5단계. 열 마스터 키가 Azure Key Vault에 저장된 경우 Azure Key Vault에 대한 액세스 토큰을 가져옵니다. Get-AzAccessToken 없음 없음
6단계 열 암호화 키를 생성하고 열 마스터 키로 암호화하여 열 암호화 키의 암호화된 값을 생성합니다. New-SqlColumnEncryptionKeyEncryptedValue 없음
7단계 열 마스터 키의 위치(공급자 이름 및 열 마스터 키의 키 경로) 및 DBA에 열 암호화 키의 암호화된 값을 제공합니다. 아래 예제를 참조하세요. 없음 없음

DBA

DBA는 보안 관리자로부터 받은 정보(위의 7단계)를 사용하여 데이터베이스에서 Always Encrypted 키 메타데이터를 만들고 관리합니다.

Task 아티클 일반 텍스트 키에 액세스 데이터베이스에 액세스
1단계 보안 관리자로부터 열 마스터 키의 위치와 열 암호화 키의 암호화된 값을 가져옵니다. 아래 예제를 참조하세요. 없음 없음
2단계. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다. PowerShell을 사용하여 Always Encrypted 구성 없음 없음
3단계: 서버 및 데이터베이스에 연결합니다. 데이터베이스에 연결 없음
4단계. 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다. SqlColumnMasterKeySettings는 메모리에 존재하는 개체입니다. New-SqlColumnMasterKeySettings 없음 없음
5단계. 데이터베이스의 열 마스터 키에 대한 메타데이터 만들기 New-SqlColumnMasterKey
참고: 내부적으로 cmdlet은 CREATE COLUMN MASTER KEY(Transact-SQL) 문을 실행하여 열 마스터 키 메타데이터를 만듭니다.
없음
6단계 데이터베이스에서 열 암호화 키 메타데이터를 만듭니다. New-SqlColumnEncryptionKey
참고: DBA는 열 암호화 키 메타데이터만 만드는 cmdlet의 변형을 사용합니다.
내부적으로 cmdlet은 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"
$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

다음 단계

참고 항목