PowerShell을 사용하여 Always Encrypted 키 프로비전
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance
이 문서는 SqlServer PowerShell 모듈을 사용하여 Always Encrypted에 대한 키 프로비전 단계에 대한 방법을 안내합니다. PowerShell을 사용하여 역할 분리와 관계없이 Always Encrypted 키를 프로비전하여 키 저장소의 실제 암호화 키에 대한 액세스 권한이나 데이터베이스에 대한 액세스 권한이 있는 사용자를 제어할 수 있습니다.
일부 높은 수준의 모범 사례 권장 사항을 비롯한 Always Encrypted 키 관리의 개요는 Always Encrypted를 위한 키 관리 개요를 참조하세요. Always Encrypted용 SqlServer PowerShell 모듈 사용을 시작하는 방법에 대한 자세한 내용은 PowerShell을 사용하여 Always Encrypted 구성을 참조하세요.
역할 구분 없이 키 프로비전
이 섹션에서는 보안 관리자 및 DBA 간에 역할 구분을 지원하지 않는 키 프로비전 방법에 대해 설명합니다. 아래 단계 중 일부는 물리적 키에 대한 작업을 키 메타데이터에 대한 작업과 결합합니다. 따라서 이 키 프로비전 방법은 데이터베이스가 클라우드에 호스트되고 중요한 데이터에 액세스하지 못하도록 클라우드 관리자(온-프레미스 DBA는 아님) 제한을 주된 목표로 하는 경우 또는 DevOps 모델을 사용하는 조직에 권장됩니다. 잠재적인 악의적 사용자가 DBA에 포함되거나 DBA가 중요한 데이터에 액세스하면 안 되는 경우에는 권장되지 않습니다.
아래 표의 일반 텍스트 키 또는 키 저장소에 액세스(아래 테이블의 열에 일반 텍스트 키/키 저장소에 액세스로 식별됨)를 포함하는 단계를 실행하기 전에 PowerShell 환경이 데이터베이스를 호스팅하는 컴퓨터와 다른 보안 컴퓨터에서 실행되는지 확인합니다. 자세한 내용은 키 관리에 대한 보안 고려 사항을 참조하세요.
Task | 아티클 | 일반 텍스트 키/키 저장소에 액세스 | 데이터베이스 액세스 |
---|---|---|---|
1단계. 키 저장소에 열 마스터 키를 만듭니다. 참고: SqlServer PowerShell 모듈은 이 단계를 지원하지 않습니다. 명령줄에서 이 작업을 수행하려면 선택한 키 저장소에 특정한 도구를 사용해야 합니다. |
Always Encrypted용 열 마스터 키 만들기 및 저장 | 예 | 아니요 |
2단계. PowerShell 세션을 시작하고 SqlServer PowerShell 모듈을 가져옵니다. | PowerShell을 사용하여 상시 암호화 구성 | 아니요 | 아니요 |
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 소프트웨어 키 저장소 공급자를 사용하는 키 저장소를 활용합니다. 하드웨어 보안 모듈과 같은 다른 저장소를 사용하도록 예제를 수정할 수 있습니다. 그러려면 디바이스에 대한 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
역할 구분이 있는 키 프로비전
이 섹션에서는 보안 관리자가 데이터베이스에 액세스할 수 없고 데이터베이스 관리자가 키 저장소 또는 일반 텍스트 키에 액세스할 수 없는 암호화를 구성하는 단계를 제공합니다.
보안 관리자
아래 표의 일반 텍스트 키 또는 키 저장소에 액세스(아래 테이블의 열에 일반 텍스트 키/키 저장소에 액세스로 식별됨)를 포함하는 단계를 실행하기 전에 다음을 확인합니다.
- PowerShell 환경이 데이터베이스를 호스팅하는 컴퓨터와 다른 보안 컴퓨터에서 실행되는지 확인합니다.
- 조직의 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을 사용하여 상시 암호화 구성 | 아니요 | 아니요 |
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
다음 단계
- PowerShell로 Always Encrypted를 사용하여 열 암호화 구성
- PowerShell을 사용하여 Always Encrypted 키 순환
- Always Encrypted를 사용하여 애플리케이션 개발
참고 항목
- Always Encrypted
- Always Encrypted를 위한 키 관리 개요
- Always Encrypted용 열 마스터 키 만들기 및 저장
- PowerShell을 사용하여 상시 암호화 구성
- SQL Server Management Studio를 사용하여 Always Encrypted 키 프로비저닝
- CREATE COLUMN MASTER KEY(Transact-SQL)
- CREATE COLUMN MASTER KEY(Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY(Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY(Transact-SQL)
- DROP COLUMN ENCRYPTION KEY(Transact-SQL)
- sys.column_master_keys(Transact-SQL)
- sys.column_encryption_keys(Transact-SQL)