Visual Studio 데이터베이스 프로젝트 및 상시 암호화

Always Encrypted을 사용하여 SQL Server의 특정 열에 있는 사용자 데이터를 보호할 수 있습니다. 이 문서에서는 Always Encrypted에 대해 설명하지 않으므로 공식 문서를 읽어보세요.

SSMS 또는 PowerShell을 통해 구성하는 것은 매우 쉽습니다.
  • Configure Always Encrypted using SQL Server Management Studio
  • Configure Always Encrypted using PowerShell

  • 그러나 개발자로서 소스 제어를 통해 관리할 수 있으므로 Visual Studio 데이터베이스 프로젝트를 통해 구성하고 싶습니다.

    전제 조건



    이 시나리오를 지원하는 몇 가지 조합이 있으며 Azure SQL을 데이터베이스 엔진으로 사용하고 Azure Key Vault를 사용하여 마스터 키를 저장합니다.
  • Azure SQL
  • 키 자격 증명 모음
  • 데이터베이스 템플릿이 포함된 Visual Studio

  • PowerShell을 사용하여 이러한 서비스를 자동 프로비저닝할 수 있지만 대부분의 사람들은 이미 리소스 또는 IaC를 가지고 있다고 생각합니다. 이 문서에서는 기존 리소스를 사용합니다.

    키 생성



    Always Encrypted를 사용하려면 두 개의 키가 필요합니다.
  • 열 마스터 키(Key Vault에 저장)
  • 열 암호화 키(SQL 데이터베이스에 저장)

  • Azure Key Vault에서 마스터 키 만들기



    키를 생성하는 방법은 여러 가지가 있으며 이 샘플에서는 PowerShell을 사용합니다. 나는 이 스크립트를 here에서 가져와 일부만 사용합니다.

    이미 Key Vault 설정이 있으므로 몇 가지 명령을 주석 처리합니다. 주목해야 할 중요한 사항은 허가입니다. Always Encrypted를 사용하려면 get, create, delete, list, wrapKey,unwrapKey, sign, verify 권한이 필요합니다.

    Import-Module Az
    Connect-AzAccount
    $SubscriptionId = "<Azure SubscriptionId>"
    $resourceGroup = "devto"
    $azureLocation = "eastus"
    $akvName = "kenakamukv"
    $akvKeyName = "CMK1"
    $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"
    


    키가 추가되었는지 확인합니다.



    데이터베이스 프로젝트에서 열 암호화 키 생성



    데이터베이스 프로젝트의 일부로 키를 관리합니다.

    1. Visual Studio를 통해 데이터베이스 프로젝트를 생성합니다. "AlwaysEncrypted"데이터베이스 프로젝트를 만들었습니다.

    2. 새 항목을 추가하고 "열 암호화 키"를 선택합니다.



    3. 두 키의 이름을 모두 입력하고 마스터 키로 "Azure Key Vault"를 선택합니다. "만들기"를 클릭합니다.



    4. Key Vault 정보를 마스터 키로 설정합니다.
  • KEY_STORE_PROVIDER_NAME: AZURE_KEY_VAULT
  • Key_Path: 생성된 키로 전달

  • CREATE COLUMN MASTER KEY [CMK_Auto1]
    WITH
    (
        KEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',
        KEY_PATH = N'https://kenakamukv.vault.azure.net/keys/CMK1/4264df67d0154312ad86e3b82c29f898'
    )
    GO
    


    5. 다음 PowerShell 스크립트를 실행하여 암호화된 값을 얻습니다. New-SqlColumnEncryptionKeyEncryptedValue cmdlet은 지정된 Azure Key Vault 키를 사용하여 암호화된 값을 계산합니다.

    $cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyUrl "https://kenakamukv.vault.azure.net/keys/CMK1/4264df67d0154312ad86e3b82c29f898"
    $encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings 
    $encryptedValue | Set-Clipboard
    


    6. 값을 ENCRYPTED_VALUE에 붙여넣습니다. 결과적으로 아래와 같이 표시되어야 합니다.



    보안 열이 있는 테이블 만들기



    데이터베이스 프로젝트에서 키를 테스트할 테이블을 추가합니다.

    1. 테이블을 추가합니다. 이름을 User로 지정했습니다. 테스트용 열 하나를 추가하고 열 정의를 구성합니다ENCRYPTED WITH. 자세한 내용은 CREATE TABLE (Transact-SQL)을 참조하십시오.



    2. Visual Studio에서 데이터베이스로 게시합니다.



    결과 확인



    쿼리를 실행하여 데이터베이스 구성 방법을 확인할 수 있습니다.

    SELECT * FROM sys.column_master_keys
    SELECT * FROM sys.column_master_key_definitions
    SELECT * FROM sys.column_encryption_keys
    SELECT * FROM sys.column_encryption_key_values
    SELECT encryption_type_desc FROM sys.all_columns WHERE name = 'SecretValue'
    


    올바르게 구성한 경우 SSMS를 사용하여 데이터를 조작할 수도 있습니다.

    1. 옵션에서 "항상 암호화 사용"을 활성화하여 데이터베이스에 연결합니다.



    2. 연결되면 다음 옵션이 활성화되어 있는지 확인하십시오.



    3. 다음 쿼리를 실행하여 테스트합니다.

    DECLARE @secretValue NVARCHAR(50) = 'secret'
    INSERT INTO [User] (Id, SecretValue) VALUES (1, @secretValue)
    
    SELECT * FROM [User]
    




    요약



    Always Encrypted는 DBA와 Key Admin 간에 키 관리를 분리하는 훌륭한 기능입니다. 하지만 보안 관점에서 고려해야 할 몇 가지 사항이 더 있습니다.
  • 암호화된 값을 소스 제어에 저장해야 합니까?
  • 키 순환을 어떻게 관리해야 합니까?

  • 이들은 특히 생산에 중요한 질문입니다.

    키 순환에 대한 자세한 내용은 Rotate Always Encrypted keys using PowerShell을 참조하십시오.

    좋은 웹페이지 즐겨찾기