PowerShell을 사용하여 상시 암호화 키 순환Rotate Always Encrypted Keys using PowerShell

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 문서에서는 SqlServer PowerShell 모듈을 사용하여 상시 암호화 키를 순환하는 단계를 제공합니다.This article provides the steps to rotate keys for Always Encrypted using the SqlServer PowerShell module. 상시 암호화에 SqlServer PowerShell 모듈을 사용 시작하는 방법은 PowerShell을 사용하여 상시 암호화 구성을 참조하세요.For information about how to start using the SqlServer PowerShell module for Always Encrypted, see Configure Always Encrypted using PowerShell.

상시 암호화 키 순환은 기존 키를 새 키로 교체하는 프로세스입니다.Rotating Always Encrypted Keys is the process of replacing an existing key with a new one. 키가 손상된 경우 또는 암호화 키를 정기적으로 순환하도록 요구하는 조직의 정책이나 규정 준수 규칙을 준수하기 위해 키를 순환해야 할 수 있습니다.You may need to rotate a key if it has been compromised, or in order to comply with your organization’s policies or compliance regulations that mandate cryptographic keys must be rotated on a regular basis.

상시 암호화는 두 가지 유형의 키를 사용하므로 열 마스터 키 순환과 열 암호화 키 순환이라는 두 개의 상위 수준 키 순환 워크플로가 있습니다.Always Encrypted uses two types of keys, so there are two high-level key rotation workflows; rotating column master keys, and rotating column encryption keys.

  • 열 암호화 키 순환 - 현재 키로 암호화된 데이터의 암호를 해독하고 새 열 암호화 키를 사용하여 데이터를 다시 암호화합니다.Column encryption key rotation - involves decrypting data that is encrypted with the current key, and re-encrypting the data using the new column encryption key. 열 암호화 키를 순환하려면 키와 데이터베이스 둘 다에 액세스해야 하므로 열 암호화 키 순환은 역할이 구분되지 않는 경우에만 수행할 수 있습니다.Because rotating a column encryption key requires access to both the keys and the database, column encryption key rotation con only be performed without role separation.
  • 열 마스터 키 순환 - 현재 열 마스터 키로 보호된 열 암호화 키의 암호를 해독하고 새 열 마스터 키를 사용하여 다시 암호화한 다음 두 유형의 키에 대한 메타데이터를 모두 업데이트합니다.Column master key rotation - involves decrypting column encryption keys that are protected with the current column master key, re-encrypting them using the new column master key, and updating the metadata for both types of keys. 열 마스터 키 순환은 역할 구분에 관계없이 완료할 수 있습니다(SqlServer PowerShell 모듈 사용 시).Column master key rotation can be completed with or without role separation (when using the SqlServer PowerShell module).

역할 구분을 사용하지 않는 열 마스터 키 순환Column Master Key Rotation without Role Separation

이 섹션에서 설명하는 열 마스터 키 순환 방법은 보안 관리자와 DBA 간의 역할 구분을 지원하지 않습니다.The method of rotating a column master key described in this section does not support role separation between a Security Administrator and a DBA. 아래 단계 중 일부에서는 물리적 키에 대한 작업을 키 메타데이터에 대한 작업과 결합하므로, 이 워크플로는 DevOps 모델을 사용하는 조직이나 데이터베이스가 클라우드에서 호스트되고 클라우드 관리자(온-프레미스 DBA 아님)가 중요한 데이터에 액세스할 수 없도록 제한하는 것이 주요 목표인 경우에 권장됩니다.Some of the below steps combine operations on the physical keys with operations on key metadata so this workflow is recommended for organizations using the DevOps model, or when your database is hosted in the cloud and the primary goal is to restrict cloud administrators (but not on-premises DBAs) from accessing sensitive data. 잠재적인 악의적 사용자가 DBA에 포함되거나 또는 DBA가 중요한 데이터에 쉽게 액세스해서는 안 될 경우에는 권장되지 않습니다.It is not recommended if potential adversaries include DBAs, or if DBAs should simply not have access to sensitive data.

태스크Task 아티클Article 일반 텍스트 키/키 저장소 액세스Accesses plaintext keys/keystore 데이터베이스 액세스Accesses database
1단계.Step 1. 키 저장소에 새 열 마스터 키를 만듭니다.Create a new column master key in a key store.

참고: SqlServer PowerShell 모듈은 이 단계를 지원하지 않습니다.Note: The SqlServer PowerShell module does not support this step. 명령줄에서 이 작업을 수행하려면 키 저장소와 관련된 도구를 사용해야 합니다.To accomplish this task from the command-line, you need to use tools that are specific for your key store.
열 마스터 키 만들기 및 저장(상시 암호화)Create and Store Column Master Keys (Always Encrypted) Yes 아니요No
2단계.Step 2. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다.Start a PowerShell environment and import the SqlServer module SqlServer 모듈 가져오기Import the SqlServer module 아니오No 아니요No
3단계.Step 3. 서버 및 데이터베이스에 연결합니다.Connect to your server and database. 데이터베이스에 연결Connecting to a Database 아니오No Yes
4단계.Step 4. 새 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다.Create a SqlColumnMasterKeySettings object that contains information about the location of your new column master key. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다.SqlColumnMasterKeySettings is an object that exists in memory (in PowerShell). 개체를 만들려면 키 저장소에 관련된 cmdlet을 사용해야 합니다.To create it, you need to use the cmdlet that is specific to your key store. New-SqlAzureKeyVaultColumnMasterKeySettingsNew-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettingsNew-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettingsNew-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettingsNew-SqlCspColumnMasterKeySettings
아니요No 아니오No
5단계.Step 5. 데이터베이스에 새 열 마스터 키에 대한 메타데이터를 만듭니다.Create the metadata about your new column master key in your database. New-SqlColumnMasterKeyNew-SqlColumnMasterKey

참고: 내부적으로 이 cmdlet은 CREATE COLUMN MASTER KEY(TRANSACT-SQL) 문을 실행하여 키 메타데이터를 만듭니다.Note: under the covers, this cmdlet issues the CREATE COLUMN MASTER KEY (Transact-SQL) statement to create key metadata.
아니요No Yes
6단계.Step 6. 현재 열 마스터 키 또는 새 열 마스터 키가 Azure 주요 자격 증명 모음에 저장된 경우 Azure에 인증합니다.Authenticate to Azure, if your current column master key or your new column master key is stored in Azure Key Vault Add-SqlAzureAuthenticationContextAdd-SqlAzureAuthenticationContext Yes 아니요No
7단계.Step 7. 이전 열 마스터 키로 현재 보호된 열 암호화 키를 각각 새 열 마스터 키로 암호화하여 순환을 시작합니다.Start the rotation, by encrypting each of the column encryption keys, which is currently protected with the old column master key, using the new column master key. 이 단계를 수행하면 영향을 받는 각 열 암호화 키(순환되는 이전 열 마스터 키와 연결됨)가 이전 열 마스터 키와 새 열 마스터 키 둘 다로 암호화되며 데이터베이스 메타데이터에 두 개의 암호화된 값이 포함됩니다.After this step each impacted column encryption key (associated with the old column master key, being rotated), is encrypted with both the old and the new column master key, and has two encrypted values in the database metadata. Invoke-SqlColumnMasterKeyRotationInvoke-SqlColumnMasterKeyRotation Yes Yes
8단계.Step 8. 데이터베이스의 암호화된 열을 쿼리하며 이전 열 마스터 키로 보호된 모든 응용 프로그램의 관리자와 협력하여 응용 프로그램이 새 열 마스터 키에 액세스할 수 있도록 합니다.Coordinate with the administrators of all applications that query encrypted columns in the database (and are protected with the old column master key), so that they can ensure the applications can access the new column master key. 열 마스터 키 만들기 및 저장(Always Encrypted)Create and Store Column Master Keys (Always Encrypted) Yes 아니요No
9단계.Step 9. 순환을 완료합니다.Complete the rotation

참고: 이 단계를 실행하기 전에 암호화된 열을 쿼리하며 이전 열 마스터 키로 보호된 모든 응용 프로그램이 새 열 마스터 키를 사용하도록 구성되었는지 확인합니다.Note: before executing this step, make sure all applications that query encrypted columns that are protected with the old column master key, have been configured to use the new column master key. 이 단계를 중간에 수행하면 해당 응용 프로그램 중 일부가 데이터 암호를 해독하지 못할 수 있습니다.If you perform this step prematurely, some of those applications may not be able to decrypt the data. 이전 열 마스터 키로 만든 데이터베이스에서 암호화된 값을 제거하여 순환을 완료합니다.Complete the rotation by removing the encrypted values from the database that were created with the old column master key. 이렇게 하면 이전 열 마스터 키와 이 키가 보호하는 열 암호화 키 간의 연결이 제거됩니다.This removes the association between the old column master key and the column encryption keys it protects.
Complete-SqlColumnMasterKeyRotationComplete-SqlColumnMasterKeyRotation 아니요No Yes
10단계.Step 10. 이전 열 마스터 키에서 메타데이터를 제거합니다.Remove the metadata from the old column master key. Remove-SqlColumnMasterKeyRemove-SqlColumnMasterKey 아니요No Yes

참고

순환 후에 이전 열 마스터 키를 영구적으로 삭제하지 않는 것이 좋습니다.It is highly recommended you do not permanently delete the old column master key after the rotation. 대신, 이전 열 마스터 키를 현재 키 저장소에 유지하거나 다른 안전한 장소에 보관해야 합니다.Instead, you should keep the old column master key in its current key store or archive it in another secure place. 백업 파일에서 새 열 마스터 키가 구성되기 전의 시점으로 데이터베이스를 복원하는 경우 데이터에 액세스하려면 이전 키가 필요합니다.If you restore your database from a backup file to a point in time before the new column master key was configured, you will need the old key to access the data.

역할 구분을 사용하지 않는 열 마스터 키 순환(Windows 인증서 예제)Rotating a Column Master Key without Role Separation (Windows Certificate Example)

아래 스크립트는 기존 열 마스터 키(CMK1)를 새 열 마스터 키(CMK2)로 대체하는 종단 간 예제입니다.The below script is an end-to-end example that replaces an existing column master key (CMK1) with a new column master key (CMK2).

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

# 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"
$connection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
$connection.ConnectionString = $connStr
$connection.Connect()
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($connection)
$database = $server.Databases[$databaseName]

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

# Create metadata for your new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings

# Initiate the rotation from the current column master key to the new column master key.
$oldCmkName = "CMK1"
Invoke-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -TargetColumnMasterKeyName $newCmkName -InputObject $database

# Complete the rotation of the old column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key metadata.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

역할 구분을 사용하는 열 마스터 키 순환Column Master Key Rotation with Role Separation

이 섹션에서 설명하는 열 마스터 키 순환 워크플로는 보안 관리자와 DBA를 구분합니다.The column master key rotation workflow described in this section ensures the separation between a Security Administrator and a DBA.

중요

아래 표에서 일반 텍스트 키/키 저장소 액세스= 인 단계(일반 텍스트 키 또는 키 저장소에 액세스하는 단계)를 실행하기 전에 데이터베이스를 호스트하는 컴퓨터와 다른 보안 컴퓨터에서 PowerShell 환경이 실행하는지 확인합니다.Before executing any steps where Accesses plaintext keys/keystore=Yes in the table below (steps that access plaintext keys or the key store), make sure that the PowerShell environment runs on a secure machine that is different from a computer hosting your database. 자세한 내용은 키 관리에 대한 보안 고려 사항을 참조하세요.For more information, see Security Considerations for Key Management.

1부: DBAPart 1: DBA

DBA가 순환할 열 마스터 키 및 현재 열 마스터 키와 연결된 영향을 받는 열 암호화 키에 대한 메타데이터를 검색합니다.A DBA retrieves metadata about the column master key to be rotated, and about the impacted column encryption keys, which associated with the current column master key. DBA는 이 모든 정보를 보안 관리자와 공유합니다.The DBA shares all this information with a Security Administrator.

태스크Task 아티클Article 일반 텍스트 키/키 저장소 액세스Accesses plaintext keys/keystore 데이터베이스 액세스Accesses database
1단계.Step 1. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다.Start a PowerShell environment and import the SqlServer module. SqlServer 모듈 가져오기Import the SqlServer module 아니요No 없음None
2단계.Step 2. 서버 및 데이터베이스에 연결합니다.Connect to your server and a database. 데이터베이스에 연결Connect to a Database 아니요No Yes
3단계.Step 3. 이전 열 마스터 키에 대한 메타데이터를 검색합니다.Retrieve the metadata about old column master key. Get-SqlColumnMasterKeyGet-SqlColumnMasterKey 아니요No Yes
4단계.Step 4. 암호화된 값을 포함하여 이전 열 마스터 키로 보호된 열 암호화 키에 대한 메타데이터를 검색합니다.Retrieve the metadata about column encryption keys, protected by the old column master key, including their encrypted values. Get-SqlColumnEncryptionKeyGet-SqlColumnEncryptionKey 아니요No Yes
5단계.Step 5. 열 마스터 키의 위치(열 마스터 키의 공급자 이름 및 키 경로)와 이전 열 마스터 키로 보호된 해당 열 암호화 키의 암호화된 값을 공유합니다.Share the location of the column master key (the provider name and a key path of the column master key) and the encrypted values of the corresponding column encryption keys, protected with the old column master key. 다음 예를 참조하십시오.See the examples below. 아니요No 아니요No

2부: 보안 관리자Part 2: Security Administrator

보안 관리자가 새 열 마스터 키를 생성하고, 영향을 받는 열 암호화 키를 새 열 마스터 키로 다시 암호화한 다음 새 열 마스터 키에 대한 정보 및 영향을 받는 열 암호화 키에 대해 새로 암호화된 값 집합을 DBA와 공유합니다.The Security Administrator generates a new column master key, re-encrypts the impacted column encryption keys with the new column master key, and shares the information about the new column master key as well as the set of new encrypted values for the impacted column encryption keys, with the DBA.

태스크Task 아티클Article 일반 텍스트 키/키 저장소 액세스Access plaintext keys/keystore 데이터베이스 액세스Accesses database
1단계.Step 1. 이전 열 마스터 키의 위치와 이전 열 마스터 키로 보호된 해당 열 암호화 키의 암호화된 값을 DBA로부터 얻습니다.Obtain the location of the old column master key and the encrypted values of the corresponding column encryption keys, protected with the old column master key, from your DBA. 해당 사항 없음N/A
다음 예를 참조하십시오.See the examples below.
아니요No 아니오No
2단계.Step 2. 키 저장소에 새 열 마스터 키를 만듭니다.Create a new column master key in a key store.

참고: SqlServer 모듈은 이 단계를 지원하지 않습니다.Note: The SqlServer module does not support this step. 명령줄에서 이 태스크를 수행하려면 키 저장소의 유형에 관련된 도구를 사용해야 합니다.To accomplish this task from a command-line, you need to use the tools that are specific the type of your key store.
열 마스터 키 만들기 및 저장(Always Encrypted)Creating and Storing Column Master Keys (Always Encrypted) Yes 아니요No
3단계.Step 3. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다.Start a PowerShell environment and import the SqlServer module. SqlServer 모듈 가져오기Import the SqlServer module 아니오No 아니요No
4단계.Step 4. 이전 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다.Create a SqlColumnMasterKeySettings object that contains information about the location of your old column master key. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다.SqlColumnMasterKeySettings is an object that exists in memory (in PowerShell). New-SqlColumnMasterKeySettingsNew-SqlColumnMasterKeySettings 아니요No 아니오No
5단계.Step 5. 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다.Create a SqlColumnMasterKeySettings object that contains information about the location of your new column master key. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다.SqlColumnMasterKeySettings is an object that exists in memory (in PowerShell). 개체를 만들려면 키 저장소에 관련된 cmdlet을 사용해야 합니다.To create it, you need to use the cmdlet that is specific to your key store. New-SqlAzureKeyVaultColumnMasterKeySettingsNew-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettingsNew-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettingsNew-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettingsNew-SqlCspColumnMasterKeySettings
아니요No 아니요No
6단계.Step 6. 이전(현재) 열 마스터 키 또는 새 열 마스터 키가 Azure 주요 자격 증명 모음에 저장된 경우 Azure에 인증합니다.Authenticate to Azure, if your old (current) column master key or your new column master key is stored in Azure Key Vault. Add-SqlAzureAuthenticationContextAdd-SqlAzureAuthenticationContext Yes 아니요No
7단계.Step 7. 이전 열 마스터 키로 현재 보호된 열 암호화 키의 값을 각각 새 열 마스터 키로 다시 암호화합니다.Re-encrypt each value of the column encryption key, which is currently protected with the old column master key, using the new column master key. New-SqlColumnEncryptionKeyEncryptedValueNew-SqlColumnEncryptionKeyEncryptedValue

참고: 이 cmdlet을 호출할 때 다시 암호화할 열 암호화 키의 값과 함께 이전 열 마스터 키와 새 열 마스터 키 둘 다의 SqlColumnMasterKeySettings 개체를 전달합니다.Note: When calling this cmdlet, pass the SqlColumnMasterKeySettings objects for both the old and the new column master key, along with a value of the column encryption key, to be re-encrypted.
Yes 아니요No
8단계.Step 8. 열 마스터 키의 위치(열 마스터 키의 공급자 이름 및 키 경로)와 열 암호화 키의 새로 암호화된 값 집합을 DBA와 공유합니다.Share the location of the new column master key (the provider name and a key path of the column master key) and the set of new encrypted values of the column encryption keys, with your DBA. 다음 예를 참조하십시오.See the examples below. 아니요No 아니요No

참고

순환 후에 이전 열 마스터 키를 영구적으로 삭제하지 않는 것이 좋습니다.It is highly recommended you do not permanently delete the old column master key after the rotation. 대신, 이전 열 마스터 키를 현재 키 저장소에 유지하거나 다른 안전한 장소에 보관해야 합니다.Instead, you should keep the old column master key in its current key store or archive it in another secure place. 백업 파일에서 새 열 마스터 키가 구성되기 전의 시점으로 데이터베이스를 복원하는 경우 데이터에 액세스하려면 이전 키가 필요합니다.If you restore your database from a backup file to a point in time before the new column master key was configured, you will need the old key to access the data.

3부: DBAPart 3: DBA

DBA가 새 열 마스터 키에 대한 메타데이터를 만들고 영향을 받는 열 암호화 키를 업데이트하여 새로 암호화된 값 집합을 추가합니다.The DBA creates metadata for the new column master key and updates the metadata of the impacted column encryption keys, to add the new set of encrypted values. 이 단계에서 DBA는 암호화 열을 쿼리하는 응용 프로그램의 관리자와도 협력합니다. 관리자는 응용 프로그램이 새 열 마스터 키에 액세스할 수 있는지 확인합니다.In this step, the DBA also coordinates with the administrators of the applications querying encryption columns, who ensure the application can access the new column master key. 모든 응용 프로그램이 새 열 마스터 키를 사용하도록 설정되면 DBA가 이전 암호화된 값 집합과 이전 열 마스터 키 메타데이터를 제거합니다.Once all applications are set up to use the new column master key, the DBA removes the old set of encrypted values and the old column master key metadata.

태스크Task 아티클Article 일반 텍스트 키/키 저장소 액세스Access plaintext keys/keystore 데이터베이스 액세스Accesses database
1단계.Step 1. 새 열 마스터 키의 위치와 이전 열 마스터 키로 보호된 해당 열 암호화 키의 새로 암호화된 값 집합을 보안 관리자로부터 얻습니다.Obtain the location of the new column master key and the new set of encrypted values of the corresponding column encryption keys, protected with the old column master key, from your Security Administrator. 다음 예를 참조하십시오.See the examples below. 아니요No 아니오No
2단계.Step 2. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다.Start a PowerShell environment and import the SqlServer module. SqlServer 모듈 가져오기Import the SqlServer module 아니오No 아니요No
3단계.Step 3. 서버 및 데이터베이스에 연결합니다.Connect to your server and a database. 데이터베이스에 연결Connecting to a Database 아니오No Yes
4단계.Step 4. 새 열 마스터 키의 위치에 대한 정보가 포함된 SqlColumnMasterKeySettings 개체를 만듭니다.Create a SqlColumnMasterKeySettings object that contains information about the location of your new column master key. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다.SqlColumnMasterKeySettings is an object that exists in memory (in PowerShell). New-SqlColumnMasterKeySettingsNew-SqlColumnMasterKeySettings 아니요No 아니오No
5단계.Step 5. 데이터베이스에 새 열 마스터 키에 대한 메타데이터를 만듭니다.Create the metadata about your new column master key in your database. New-SqlColumnMasterKeyNew-SqlColumnMasterKey

참고: 내부적으로 이 cmdlet은 CREATE COLUMN MASTER KEY(TRANSACT-SQL) 문을 실행하여 키 메타데이터를 만듭니다.Note: Under the covers this cmdlet issues the CREATE COLUMN MASTER KEY (Transact-SQL) statement to create key metadata.
아니요No Yes
6단계.Step 6. 이전 열 마스터 키로 보호된 열 암호화 키에 대한 메타데이터를 검색합니다.Retrieve the metadata about column encryption keys, protected by the old column master key. Get-SqlColumnEncryptionKeyGet-SqlColumnEncryptionKey 아니요No Yes
7단계.Step 7. 새 열 마스터 키를 사용하여 생성된 새 암호화된 값을 영향을 받는 각 열 암호화 키에 대한 메타데이터에 추가합니다.Add a new encrypted value (produced using the new column master key) to the metadata for each impacted column encryption key. Add-SqlColumnEncryptionKeyValueAdd-SqlColumnEncryptionKeyValue 아니요No Yes
8단계.Step 8. 데이터베이스의 암호화된 열을 쿼리하며 이전 열 마스터 키로 보호된 모든 응용 프로그램의 관리자와 협력하여 응용 프로그램이 새 열 마스터 키에 액세스할 수 있도록 합니다.Coordinate with the administrators of all applications that query encrypted columns in the database (and are protected with the old column master key), so that they can ensure the applications can access the new column master key. 열 마스터 키 만들기 및 저장(Always Encrypted)Creating and Storing Column Master Keys (Always Encrypted) 아니요No 아니요No
9단계.Step 9. 이전 열 마스터 키와 연결된 암호화된 값을 데이터베이스에서 제거하여 순환을 완료합니다.Complete the rotation, by removing the encrypted values associated with the old column master key from the database.

참고: 이 단계를 실행하기 전에 암호화된 열을 쿼리하며 이전 열 마스터 키로 보호된 모든 응용 프로그램이 새 열 마스터 키를 사용하도록 구성되었는지 확인합니다.Note: Before executing this step, make sure all applications that query encrypted columns that are protected with the old column master key, have been configured to use the new column master key. 이 단계를 중간에 수행하면 해당 응용 프로그램 중 일부가 데이터 암호를 해독하지 못할 수 있습니다.If you perform this step prematurely, some of those applications may not be able to decrypt the data.

이 단계에서는 이전 열 마스터 키와 이 키가 보호하는 열 암호화 키 간의 연결을 제거합니다.This step removes an association between the old column master key and the column encryption keys it protects.
Complete-SqlColumnMasterKeyRotationComplete-SqlColumnMasterKeyRotation

또는 Remove-SqlColumnEncryptionKeyValue를 사용할 수 있습니다.Alternatively, you can use Remove-SqlColumnEncryptionKeyValue
아니요No Yes
10단계.Step 10. 이전 열 마스터 키 메타데이터를 데이터베이스에서 제거합니다.Remove the old column master key metadata from the database Remove-SqlColumnMasterKeyRemove-SqlColumnMasterKey 아니요No Yes

역할 구분을 사용하는 열 마스터 키 순환(Windows 인증서 예제)Rotating a Column Master Key with Role Separation (Windows Certificate Example)

아래 스크립트는 Windows 인증서 저장소의 인증서인 새 열 마스터 키를 생성하고 기존(현재) 열 마스터 키를 순환하여 새 열 마스터 키로 대체하는 종단 간 예제입니다.The below script is an end-to-end example for generating a new column master key that is certificate in Windows Certificate store, rotating an existing (current) column master key, to replace it with the new column master key. 스크립트에서는 대상 데이터베이스에 일부 열 암호화 키를 암호화하는 열 마스터 키 CMK1(순환됨)이 들어 있다고 가정합니다.The script assumes, the target database contains the column master key, named CMK1 (to be rotated), which encrypts some column encryption keys.

1부: DBAPart 1: DBA

# 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"
$connection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
$connection.ConnectionString = $connStr
$connection.Connect()
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($connection)
$database = $server.Databases[$databaseName]

# Retrieve the data about the old column master key, which needs to be rotated.
$oldCmkName = "CMK1"
$oldCmk = Get-SqlColumnMasterKey -Name $oldCmkName -InputObject $database


# Share the location of the old column master key with a Security Administrator, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $oldCmkDataFile
$oldCmk.KeyStoreProviderName +", " + $oldCmk.KeyPath >> $oldCmkDataFile


# Find column encryption keys associated with the old column master key and provide the encrypted values of column encryption keys to the Security Administrator, via a CSV file on a share drive.
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
$oldCekValuesFile = "Z:\oldcekvalues.txt"
"CEKName, CEKEncryptedValue" > $oldCekValuesFile 
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {
        # This column encryption has 2 encrypted values - let's check, if it is associated with the old column master key.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {# This column encryption key has 1 encrypted value that was produced using the old column master key
        # Save the name and the encrypted value of the column encryption key in the file.
        $encryptedValue =  "0x" + -join ($ceks[$i].ColumnEncryptionKeyValues[0].EncryptedValue |  foreach {$_.ToString("X2") } )
        $ceks[$i].Name + "," + $encryptedValue >> $oldCekValuesFile
    }
} 

2부: 보안 관리자Part 2: Security Administrator

# Obtain the location of the old column master key and the encrypted values of the corresponding column encryption keys, from your DBA, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
$oldCmkData = Import-Csv $oldCmkDataFile
$oldCekValuesFile = "Z:\oldcekvalues.txt"
$oldCekValues = @(Import-Csv $oldCekValuesFile)

# Create a new 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 old column master key. 
$oldCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $oldCmkData.KeyStoreProviderName -KeyPath $oldCmkData.KeyPath

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation $storeLocation -Thumbprint $cert.Thumbprint


# Prepare a CSV file, you will use to share the encrypted values of column encryption keys, produced using the new column master key.
$newCekValuesFile = "Z:\newcekvalues.txt"
"CEKName, CEKEncryptedValue" > $newCekValuesFile

# Re-encrypt each value with the new column master key and save the new encrypted value in the file.
for($i=0; $i -lt $oldCekValues.Count; $i++){
    # Re-encrypt each value with the new CMK
    $newValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $newCmkSettings -ColumnMasterKeySettings $oldCmkSettings -EncryptedValue $oldCekValues[$i].CEKEncryptedValue
    $oldCekValues[$i].CEKName + ", " + $newValue >> $newCekValuesFile
}

# Share the new column master key data with your DBA, via a CSV file.
$newCmkDataFile = $home + "\newcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $newCmkDataFile
$newCmkSettings.KeyStoreProviderName +", " + $newCmkSettings.KeyPath >> $newCmkDataFile

3부: DBAPart 3: DBA

# Obtain the location of the new column master key and the new encrypted values of the corresponding column encryption keys, from your Security Administrator, via a CSV file on a share drive.
$newCmkDataFile = "Z:\newcmkdata.txt"
$newCmkData = Import-Csv $newCmkDataFile
$newCekValuesFile = "Z:\newcekvalues.txt"
$newCekValues = @(Import-Csv $newCekValuesFile)

# 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"
$connection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
$connection.ConnectionString = $connStr
$connection.Connect()
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($connection)
$database = $server.Databases[$databaseName]

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $newCmkData.KeyStoreProviderName -KeyPath $newCmkData.KeyPath
# Create metadata for the new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings


# Get all CEK objects
$oldCmkName = "CMK1"
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {# This column encryption key has 2 encrypted values. Let's check, if it is associated with the old CMK.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {
        # Find the corresponding new encrypted value, received from the Security Administrator.
        $newValueRow = ($newCekValues| Where-Object {$_.CEKName -eq $ceks[$i].Name }[0])
        # Update the column encryption key metadata object by adding the new encrypted value
        Add-SqlColumnEncryptionKeyValue -ColumnMasterKeyName $newCmkName -Name $ceks[$i].Name -EncryptedValue $newValueRow.CEKEncryptedValue -InputObject $database 
    }
}

# Complete the rotation of the current column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

열 암호화 키 순환Rotating a Column Encryption Key

열 암호화 키를 순환하려면 모든 열에서 순환할 키로 암호화된 데이터의 암호를 해독하고 새 열 암호화 키를 사용하여 데이터를 다시 암호화해야 합니다.Rotating a column encryption key involves decrypting the data in all columns, encrypted with the key to be rotated, and re-encrypting the data using the new column encryption key. 이 순환 워크플로에서는 키와 데이터베이스 둘 다에 액세스해야 하므로 역할 구분을 사용하여 수행할 수 없습니다.This rotation workflow requires access to both the keys and the database, and therefore cannot be performed with role separation. 순환할 키로 암호화된 열을 포함하는 테이블이 크면 열 암호화 키를 순환하는 데 시간이 오래 걸릴 수 있습니다.Note that, rotating a column encryption key can take a very long time, if the tables containing columns encrypted with the key, being rotated, are large. 따라서 조직에서 열 암호화 키 순환을 계획할 때는 주의해야 합니다.Therefore, your organization needs to plan a column encryption key rotation very carefully.

오프라인 또는 온라인 접근 방식을 사용하여 열 암호화 키를 회전할 수 있습니다.You can rotate a column encryption key using an offline or an online approach. 오프라인 방식은 더 빠를 수 있지만 응용 프로그램이 영향을 받는 테이블에 쓸 수 없습니다.The former method is likely to be faster, but your applications cannot write to the impacted tables. 온라인 방식은 시간이 더 오래 걸릴 수 있지만 영향을 받는 테이블을 응용 프로그램에 사용할 수 없는 시간 간격을 제한할 수 있습니다.The latter approach will likely to take longer, but you can limit the time interval, during which the impacted tables are not available to applications. 자세한 내용은 PowerShell을 사용하여 열 암호화 구성Set-SqlColumnEncryption 을 참조하세요.Please, see Configure Column Encryption using PowerShell and Set-SqlColumnEncryption for more details.

태스크Task 아티클Article 일반 텍스트 키/키 저장소 액세스Accesses plaintext keys/keystore 데이터베이스 액세스Accesses database
1단계.Step 1. PowerShell 환경을 시작하고 SqlServer 모듈을 가져옵니다.Start a PowerShell environment and import the SqlServer module. SqlServer 모듈 가져오기Import the SqlServer module 아니오No 아니오No
2단계.Step 2. 서버 및 데이터베이스에 연결합니다.Connect to your server and a database. 데이터베이스에 연결Connecting to a Database 아니오No Yes
3단계.Step 3. 열 마스터 키(순환할 열 암호화 키 보호)가 Azure 주요 자격 증명 모음에 저장된 경우 Azure에 인증합니다.Authenticate to Azure, if your column master key (protecting the column encryption key, to be rotated), is stored in Azure Key Vault. Add-SqlAzureAuthenticationContextAdd-SqlAzureAuthenticationContext Yes 아니오No
4단계.Step 4. 새 열 암호화 키를 생성하고 열 마스터 키로 암호화하고 데이터베이스에 열 암호화 키 메타데이터를 만듭니다.Generate a new column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. New-SqlColumnEncryptionKeyNew-SqlColumnEncryptionKey

참고: 내부적으로 열 암호화 키를 생성하고 암호화하는 cmdlet 변형을 사용합니다.Note: Use a variation of the cmdlet that internally generates and encrypts a column encryption key.
내부적으로 이 cmdlet은 CREATE COLUMN ENCRYPTION KEY(Transact-SQL) 문을 실행하여 키 메타데이터를 만듭니다.Under the covers this cmdlet issues the CREATE COLUMN ENCRYPTION KEY (Transact-SQL) statement to create the key metadata.
Yes Yes
5단계.Step 5. 이전 열 암호화 키로 암호화된 열을 모두 찾습니다.Find all columns encrypted with the old column encryption key. SMO(SQL Server 관리 개체) 프로그래밍 가이드SQL Server Management Objects (SMO) Programming Guide 아니요No Yes
6단계.Step 6. 영향을 받는 각 열에 대한 SqlColumnEncryptionSettings 개체를 만듭니다.Create a SqlColumnEncryptionSettings object for each impacted column. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다.SqlColumnMasterKeySettings is an object that exists in memory (in PowerShell). 열에 대한 대상 암호화 체계를 지정합니다.It specifies the target encryption scheme for a column. 이 경우 개체는 영향을 받는 열을 새 열 암호화 키로 암호화하도록 지정해야 합니다.In this case, the object should specify the impacted column should be encrypted using the new column encryption key. New-SqlColumnEncryptionSettingsNew-SqlColumnEncryptionSettings 아니오No 아니요No
7단계.Step 7. 5단계에서 확인된 열을 새 열 암호화 키로 다시 암호화합니다.Re-encrypt the columns, identified in step 5, using the new column encryption key. Set-SqlColumnEncryptionSet-SqlColumnEncryption

참고: 이 단계는 시간이 오래 걸릴 수 있습니다.Note: This step may take a long time. 선택한 접근 방식(온라인 또는 오프라인)에 따라 응용 프로그램이 전체 작업 또는 그 일부를 통해 테이블에 액세스할 수 없게 됩니다.Your applications mill not be able to access the tables through the entire operation or a portion of it, depending on the approach (online vs. offline), you select.
Yes Yes
8단계.Step 8. 이전 열 암호화 키에 대한 메타데이터를 제거합니다.Remove the metadata for the old column encryption key. Remove-SqlColumnEncryptionKeyRemove-SqlColumnEncryptionKey 아니요No Yes

예제 - 열 암호화 키 순환Example - Rotating a Column Encryption Key

아래 스크립트는 열 암호화 키 순환을 보여 줍니다.The below script demonstrates rotating a column encryption key. 스크립트에서는 대상 데이터베이스에 CEK1(순환됨)이라는 열 암호화 키로 암호화된 일부 열이 있다고 가정합니다. 이 키는 CMK1이라는 열 마스터 키를 사용하여 보호됩니다(열 마스터 키는 Azure 주요 자격 증명 모음에 저장되지 않음).The script assumes, the target database contains some columns encrypted with a column encryption key, named CEK1 (to be rotated), which is protected using a column master key, named CMK1 (the column master key is not stored in Azure Key Vault).

# 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"
$connection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
$connection.ConnectionString = $connStr
$connection.Connect()
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($connection)
$database = $server.Databases[$databaseName]

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


# Find all columns encrypted with the old column encryption key, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$oldCekName = "CEK1"
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
    $columns = $tables[$i].Columns
    for($j=0; $j -lt $columns.Count; $j++) {
        if($columns[$j].isEncrypted -and $columns[$j].ColumnEncryptionKeyName -eq $oldCekName) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType $columns[$j].EncryptionType -EncryptionKey $newCekName
        }
     }
}

# Re-encrypt all columns, currently encrypted with the old column encryption key, using the new column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -UseOnlineApproach -MaxDowntimeInSeconds 120 -LogFileDirectory .

# Remove the old column encryption key metadata.
Remove-SqlColumnEncryptionKey -Name $oldCekName -InputObject $database

다음 단계Next Steps

추가 리소스Additional Resources