Enclave 사용 키 프로비전
적용 대상: SQL Server 2019(15.x) 이상 - Windows만 해당 Azure SQL 데이터베이스
이 문서에서는 보안 Enclave를 사용하여 Always Encrypted에 사용되는 서버 쪽 보안 Enclave 내에서 계산을 지원하는 Enclave 사용 키를 프로비전하는 방법을 설명합니다.
Always Encrypted 키를 관리하기 위한 일반적인 지침 및 프로세스는 Enclave 사용 키를 프로비전할 때 적용됩니다. 이 문서에서는 보안 Enclave를 사용한 Always Encrypted와 관련된 세부 정보를 다룹니다.
SQL Server Management Studio 또는 PowerShell을 사용하여 Enclave 사용 열 마스터 키를 프로비전하려면 새 키가 Enclave 계산을 지원하는지 확인합니다. 이렇게 하면 도구(SSMS 또는 PowerShell)가 데이터베이스의 열 마스터 키 메타데이터의 CREATE COLUMN MASTER KEY
를 설정하는 ENCLAVE_COMPUTATIONS
문을 생성합니다. 자세한 정보는 CREATE COLUMN MASTER KEY(Transact-SQL)를 참조하세요.
또한 이 도구는 열 마스터 키를 사용하여 열 마스터 속성에 디지털 서명하고 데이터베이스 메타데이터에 서명을 저장합니다. 이 서명은 ENCLAVE_COMPUTATIONS
설정을 사용한 악의적인 변조를 방지합니다. SQL 클라이언트 드라이버는 Enclave 사용을 허용하기 전에 서명을 확인합니다. 이렇게 하면 보안 관리자가 Enclave 내에서 계산할 수 있는 열 데이터를 제어할 수 있습니다.
ENCLAVE_COMPUTATIONS
는 변경할 수 없습니다. 즉 메타데이터에서 열 마스터 키를 정의한 후에는 변경할 수 없습니다. 지정된 열 마스터 키가 암호화하는 열 암호화 키를 사용하여 enclave 계산을 사용하도록 설정하려면 열 마스터 키를 순환하여 enclave 사용 열 마스터 키로 바꾸어야 합니다. Enclave 사용 키 순환을 참조하세요.
참고 항목
현재 SSMS와 PowerShell은 모두 Azure Key Vault 또는 Windows 인증서 저장소에 저장된 Enclave 사용 열 마스터 키를 지원합니다. 하드웨어 보안 모듈(CNG 또는 CAPI 사용)은 지원되지 않습니다.
Enclave 사용 열 암호화 키를 만들려면 enclave 사용 열 마스터 키를 선택하여 새 키를 암호화해야 합니다.
다음 섹션에서는 SSMS 및 PowerShell을 사용하여 Enclave 사용 키를 프로비전하는 방법에 대해 자세히 설명합니다.
SQL Server Management Studio를 사용하여 Enclave 사용 키 프로비저닝
SQL Server Management Studio에서는 다음을 프로비저닝할 수 있습니다.
- 새 열 마스터 키 대화 상자를 사용하는 Enclave 사용 열 마스터 키
- 새 열 암호화 키 대화 상자를 사용하는 Enclave 사용 열 암호화 키
또한 Always Encrypted 마법사를 사용하면 Enclave 사용 열 마스터 키와 Enclave 사용 열 암호화 키를 만들 수 있습니다.
SSMS(SQL Server Management Studio)의 최신 GA(일반 공급) 버전을 설치했는지 확인합니다.
새 열 마스터 키 대화 상자를 사용하는 enclave 사용 열 마스터 키 프로비전
Enclave 사용 열 마스터 키를 프로비전하려면 새 열 마스터 키 대화 상자를 사용하여 열 마스터 키 프로비전의 단계를 수행합니다. Enclave 계산 허용을 선택해야 합니다. 아래 스크린샷을 참조하세요.
참고 항목
Enclave 계산 허용 확인란은 데이터베이스에 대해 보안 Enclave가 구성된 경우에만 표시됩니다. SQL Server를 사용하는 경우 SQL Server에서 보안 Enclave 구성을 참조하세요. Azure SQL 데이터베이스를 사용하는 경우 Azure SQL 데이터베이스에 대해 항상 보안 Enclave로 암호화 사용을 참조하세요.
팁
열 마스터 키가 enclave를 사용하도록 설정되어 있는지 확인하려면 개체 탐색기에서 해당 키를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 키가 엔클레이브를 활성화한 경우 Enclave 계산: 허용됨이 키의 속성을 표시하는 창에 나타납니다. 또는 sys.column_master_keys(Transact-SQL) 보기를 사용할 수 있습니다.
새 열 암호화 키 대화 상자를 사용하는 enclave 사용 열 암호화 키 프로비전
Enclave 사용 열 암호화 키를 프로비전하려면 새 열 암호화 키 대화 상자를 사용하여 열 암호화 키 프로비전의 단계를 수행합니다. 열 마스터 키를 선택하는 경우 enclave를 사용하도록 설정되어 있는지 확인합니다.
팁
열 암호화 키가 enclave를 사용하도록 설정되어 있는지 확인하려면 개체 탐색기에서 해당 키를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 키가 엔클레이브를 활성화한 경우 Enclave 계산: 허용됨이 키의 속성을 표시하는 창에 나타납니다.
PowerShell을 사용하여 Enclave 사용 키 프로비전
PowerShell을 사용하여 Enclave 사용 키를 프로비전하려면 SqlServer PowerShell 모듈 버전 22 이상이 필요합니다.
일반적으로 PowerShell을 사용하여 Always Encrypted 키 프로비전에 설명된 Always Encrypted에 대한 PowerShell 키 프로비저닝 워크플로(역할 분리 포함 및 제외)도 Enclave 사용 키에도 적용됩니다. 이 섹션에서는 enclave 사용 키와 관련된 세부 정보를 설명합니다.
SqlServer PowerShell 모듈은 프로비저닝 프로세스 도중 Enclave 사용 열 마스터 키를 지정할 수 있도록 New-SqlCertificateStoreColumnMasterKeySettings 및 New-SqlAzureKeyVaultColumnMasterKeySettings cmdlet을 -AllowEnclaveComputations
매개 변수로 확장합니다. cmdlet은 열 마스터 키의 속성을 포함하는 로컬 개체를 만듭니다(Azure Key Vault 또는 Windows 인증서 저장소에 저장됨). 지정된 경우 -AllowEnclaveComputations
속성은 키를 로컬 개체에서 enclave 사용으로 표시합니다. 또한 cmdlet이 참조된 열 마스터 키(Azure Key Vault 또는 Windows 인증서 저장소)에 액세스하여 키의 속성에 디지털 서명하도록 합니다. 새 enclave 사용 열 마스터 키에 대한 설정 개체를 만들면 New-SqlColumnMasterKey cmdlet의 후속 호출에서 이를 사용하여 데이터베이스에서 새 키를 설명하는 메타데이터 개체를 만들 수 있습니다.
Enclave 사용 열 암호화 키를 프로비전하는 것은 Enclave 사용이 아닌 열 암호화 키를 프로비전하는 것과 다르지 않습니다. 새 열 암호화 키를 암호화하는 데 사용되는 열 마스터 키가 Enclave 사용인지 확인해야 합니다.
참고 항목
SqlServer PowerShell 모듈은 현재 하드웨어 보안 모듈(CNG 또는 CAPI 사용)에 저장된 Enclave 사용 키 프로비저닝을 지원하지 않습니다.
예제: Windows 인증서 저장소를 이용하여 Enclave 사용 키 프로비전
아래 엔드투엔드 예제에서는 Windows 인증서 저장소에 열 마스터 키를 저장하여 enclave 사용 키를 프로비전하는 방법을 보여줍니다. 스크립트는 역할 구분 없이 Windows 인증서 저장소의 예제를 기반으로 합니다(예제). 두 예제에서 -AllowEnclaveComputations
워크플로 간의 유일한 차이점인 New-SqlCertificateStoreColumnMasterKeySettings cmdlet에서 매개 변수를 사용하는 것이 중요합니다.
# 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" -MinimumVersion 22.0.50
# 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
# using the -AllowEnclaveComputations parameter.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations
# 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를 사용하여 enclave 사용 키 프로비전
아래 엔드투엔드 예제에서는 열 마스터 키를 Azure Key Vault의 키 볼트에 저장하여 Enclave 사용 키를 프로비전하는 방법을 보여 줍니다. 스크립트는 역할 분리 없이 Azure Key Vault의 예제를 기반으로 합니다(예). Enclave 사용 키에 대한 워크플로와 Enclave 사용이 지원되지 않는 키 간의 두 가지 차이점을 유의해야 합니다.
- 아래 스크립트에서 New-SqlCertificateStoreColumnMasterKeySettings는
-AllowEnclaveComputations
매개 변수를 사용하여 새 열 마스터 키를 enclave 사용으로 지정합니다. - 아래 스크립트는 Get-AzAccessToken cmdlet을 사용하여 키 자격 증명 모음에 대한 액세스 토큰을 가져옵니다. 이 작업은 열 마스터 키의 속성에 서명하기 위해 New-SqlAzureKeyVaultColumnMasterKeySettings가 Azure Key Vault에 액세스할 수 있어야 하므로 필요합니다.
# Create a column master key in Azure Key Vault.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
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.
$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
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.ID -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken
# 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 -KeyVaultAccessToken $keyVaultAccessToken
다음 단계
- 보안 Enclave를 사용하여 Transact-SQL문 실행
- 보안 enclave를 사용한 Always Encrypted를 이용하여 내부 열 암호화 구성을 참조하세요.
- 기존 암호화된 열에 관해 보안 Enclave를 사용한 Always Encrypted 사용
- 보안 enclave를 사용한 Always Encrypted를 이용하여 애플리케이션 개발