PowerShell을 사용하여 열 암호화 인플레이스 구성
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance
이 문서에서는 Set-SqlColumnEncryption cmdlet(SqlServer PowerShell 모듈)을 사용하여 데이터베이스 열에 대한 대상 Always Encrypted 구성을 설정하는 단계를 제공합니다. Set-SqlColumnEncryption cmdlet은 대상 데이터베이스의 스키마와 선택한 열에 저장된 데이터를 모두 수정합니다. 열에 저장된 데이터는 열에 대해 지정된 대상 암호화 설정 및 현재 암호화 구성에 따라 암호화, 다시 암호화 또는 암호 해독할 수 있습니다. Enclave를 사용하여 현재 위치 암호화 작업을 트리거하려면 Set-SqlColumnEncryption은 증명 프로토콜 및 선택적으로 증명 URL 키워드가 있는 연결 문자열 사용하여 만든 데이터베이스 연결을 사용해야 합니다.
필수 조건
대상 암호화 구성을 설정하려면 다음을 확인해야 합니다.
- Enclave를 사용하는 열 암호화 키가 데이터베이스에 구성되어 있어야 합니다(열을 암호화 또는 다시 암호화하는 경우). 세부 정보는 보안 Enclave를 사용한 Always Encrypted 키 관리를 참조하세요.
- Always Encrypted를 사용하도록 설정하고 연결 문자열 지정된 증명 속성을 사용하여 데이터베이스에 연결됩니다.
- PowerShell cmdlet을 실행하는 컴퓨터에서 암호화, 다시 암호화 또는 암호 해독하려는 각 열에 대한 열 마스터 키에 액세스할 수 있어야 합니다.
- SqlServer PowerShell 모듈 버전 22.0.50 이상을 사용합니다.
가용성 고려 사항
지금 있는 Set-SqlColumnEncryption cmdlet은 온라인 암호화를 지원하지 않습니다.
오프라인 방식을 사용하면 대상 테이블과 대상 테이블과 관련된 테이블(예: 대상 테이블에 외래 키 관계가 있는 테이블)은 작업 기간에 트랜잭션을 작성할 수 없습니다. 오프라인 접근 방식을 사용할 때 외래 키 제약 조건(CHECK 또는 NOCHECK)의 의미 체계는 항상 유지됩니다.
암호화 프로세스 중에 가동 중지 시간을 감당할 수 없는 경우 온라인 암호화를 지원하는 Transact-SQL에서 현재 위치에서 열 암호화 구성을 사용하는 것이 좋습니다.
보안 고려사항
데이터베이스 열에 대한 암호화를 구성하는 데 사용되는 Set-SqlColumnEncryption cmdlet은 상시 암호화 키와 데이터베이스 열에 저장된 데이터를 둘 다 처리합니다. 따라서 보안 컴퓨터에서 cmdlet을 실행하는 것이 중요합니다. 데이터베이스가 SQL Server에 있는 경우 SQL Server 인스턴스를 호스트하는 컴퓨터 이외의 다른 컴퓨터에서 cmdlet을 실행합니다. 상시 암호화의 주요 목표는 데이터베이스 시스템이 손상된 경우에도 암호화된 중요한 데이터를 안전하게 보호하는 것이므로 SQL Server 컴퓨터에서 키 및/또는 중요한 데이터를 처리하는 PowerShell 스크립트를 실행하면 기능의 이점이 감소하거나 무효화될 수 있습니다.
Task | 아티클 | 일반 텍스트 키/키 저장소에 액세스 | 데이터베이스에 액세스 |
---|---|---|---|
1단계. PowerShell 세션을 시작하고 SqlServer 모듈을 가져옵니다. | SqlServer 모듈 가져오기 | 아니요 | 아니요 |
2단계. 서버 및 데이터베이스에 연결 | 데이터베이스에 연결 | 예 | 예 |
3단계 열 마스터 키(순환할 열 암호화 키 보호)가 Azure Key Vault에 저장된 경우 Azure에ㅂ 인증 | Connect-AzAccount | 예 | 아니요 |
4단계 Azure Key Vault에 대한 액세스 토큰을 가져옵니다. | Get-AzAccessToken | 아니요 | 아니요 |
5단계 SqlColumnEncryptionSettings 개체의 배열을 생성합니다. 각 데이터베이스 열에 대해 하나씩 암호화, 다시 암호화 또는 암호 해독하려고 합니다. SqlColumnMasterKeySettings는 PowerShell의 메모리에 있는 개체입니다. 열의 대상 암호화 체계를 지정합니다. | New-SqlColumnEncryptionSettings | 아니요 | 아니요 |
5단계 이전 단계에서 만든 SqlColumnMasterKeySettings 개체 배열에 지정된 원하는 암호화 구성을 설정합니다. 열은 지정된 대상 설정 및 열의 현재 암호화 구성에 따라 암호화, 다시 암호화 또는 암호 해독됩니다. | Set-SqlColumnEncryption 참고: 이 단계는 시간이 오래 걸릴 수 있습니다. 애플리케이션은 선택한 방법(온라인 및 오프라인)에 따라 전체 작업 또는 일부 작업을 통해 테이블에 액세스할 수 없습니다. |
예 | 예 |
VBS Enclave를 사용하여 열 암호화
아래 예제에서는 두 열에 대한 대상 암호화 구성을 설정하는 방법을 보여 줍니다. 두 열 중 하나가 아직 암호화되지 않은 경우 암호화됩니다. 다른 키 및/또는 다른 암호화 형식을 사용하여 이미 암호화된 열이 있으면 비밀번호가 해독된 다음 지정된 대상 키/형식으로 다시 암호화됩니다. VBS Enclave는 현재 증명을 지원하지 않습니다. EnclaveAttestationProtocol 매개 변수는 None으로 설정해야 하며 EnclaveAttestationUrl은 필요하지 않습니다.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @()
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK"
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK"
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken
열 암호 해독 - 예제
다음 예제에서는 데이터베이스에서 현재 암호화된 모든 열의 비밀번호를 해독하는 방법을 보여 줍니다.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# 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
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$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) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken
SGX Enclave를 사용하여 열 암호화
아래 예제에서는 두 열에 대한 대상 암호화 구성을 설정하는 방법을 보여 줍니다. 두 열 중 하나가 아직 암호화되지 않은 경우 암호화됩니다. 다른 키 및/또는 다른 암호화 형식을 사용하여 이미 암호화된 열이 있으면 비밀번호가 해독된 다음 지정된 대상 키/형식으로 다시 암호화됩니다. Enclave를 사용하여 현재 위치 암호화 작업을 트리거하려면 EnclaveAttestationProtocol 및 EnclaveAttestationUrl 매개 변수가 필요합니다.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @()
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK"
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK"
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken
열 암호 해독 - 예제
다음 예제에서는 데이터베이스에서 현재 암호화된 모든 열의 비밀번호를 해독하는 방법을 보여 줍니다.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# 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
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$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) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken