자습서: Azure SQL Database의 Intel SGX enclave를 사용하여 Always Encrypted 설정하기

적용 대상:Azure SQL Database

이 자습서는 Azure SQL Database에서 보안 enclave를 사용한 Always Encrypted를 시작하는 방법을 설명합니다. Intel SGX(Intel Software Guard Extensions) enclave를 사용합니다. 다음이 설명됩니다.

  • Intel SGX enclave를 사용여 Always Encrypted 테스트 및 평가 환경 만드는 방법
  • SSMS(SQL Server Management Studio)를 사용하여 암호화된 열에 대해 데이터를 바로 암호화하고 풍부한 기밀 쿼리를 실행하는 방법.

필수 구성 요소

PowerShell 요구 사항

참고

이 섹션에 나열된 필수 구성 요소는 이 자습서의 일부 단계에서 PowerShell을 사용하도록 선택하는 경우에만 적용됩니다. Azure Portal 대신 사용하는 경우 이 섹션을 건너뛸 수 있습니다.

Az PowerShell 모듈 버전 9.3.0 이상. Az PowerShell 모듈을 설치하는 방법에 대한 자세한 내용은 Azure Az PowerShell 모듈 설치를 참조하세요. 컴퓨터에 설치된 Az PowerShell 모듈의 버전을 확인하려면 PowerShell 세션에서 다음 명령을 실행합니다.

Get-InstalledModule -Name Az

1단계: 서버 및 DC 시리즈 데이터베이스 만들기 및 구성

이 단계에서는 보안 enclave를 사용한 Always Encrypted에 필요한 DC 시리즈 하드웨어를 사용하여 새 Azure SQL Database 논리 서버와 새 데이터베이스를 만듭니다. 자세한 내용은 DC 시리즈를 참조하세요.

  1. SQL 배포 옵션 선택 페이지로 이동합니다.

  2. Azure Portal에 아직 로그인하지 않은 경우 메시지가 표시되면 로그인합니다.

  3. SQL 데이터베이스에서 리소스 유형단일 데이터베이스로 설정한 상태로 두고 만들기를 선택합니다.

    Screenshot of Azure portal, showing the Add to Azure SQL deployment option.

  4. SQL 데이터베이스 만들기 양식의 기본 탭에 있는 프로젝트 세부 정보 아래에서 원하는 Azure 구독을 선택합니다.

  5. 리소스 그룹새로 만들기를 선택하고, 새 리소스 그룹의 이름을 입력한 다음, 확인을 선택합니다.

  6. 데이터베이스 이름ContosoHR을 입력합니다.

  7. 서버에 대해 새로 만들기를 선택하고 새 서버 양식을 다음 값으로 입력합니다.

    • 서버 이름: mysqlserver를 입력하고 고유하게 유지하기 위한 일부 문자를 추가합니다. 서버 이름은 구독 내에서 고유한 것이 아니라 Azure의 모든 서버에 대해 전역적으로 고유해야 하므로 사용할 정확한 서버 이름을 제공할 수 없습니다. 따라서 mysqlserver135와 같은 항목을 입력하면 포털에서 사용 가능 여부를 알 수 있습니다.
    • 위치: 드롭다운 목록에서 위치를 선택합니다.

      중요

      DC 시리즈 하드웨어와 Microsoft Azure Attestation을 모두 지원하는 위치(Azure 지역)를 선택해야 합니다. DC 시리즈를 지원하는 지역 목록은 DC 시리즈 가용성을 참조하세요. Microsoft Azure Attestation의 지역별 가용성은 다음과 같습니다.

    • 인증 방법: SQL 인증 사용을 선택합니다.
    • 서버 관리자 로그인: 관리자 로그인 이름(예: azureuser)을 입력합니다.
    • 암호: 요구 사항을 충족하는 암호를 입력하고, 암호 확인 필드에서 다시 입력합니다.
    • 확인을 선택합니다.
  8. SQL 탄력적 풀을 사용하나요?아니요로 설정된 상태로 둡니다.

  9. 컴퓨팅 + 스토리지에서 데이터베이스 구성을 선택하고 구성 변경을 선택합니다.

    Screenshot of Azure portal hardware configuration, and where to configure database.

  10. DC 시리즈 하드웨어 구성을 선택한 다음, 확인을 선택합니다.

    Screenshot of Azure portal, showing Configure DC-series database.

  11. 적용을 선택합니다.

  12. 기본 탭으로 돌아가서 컴퓨팅 + 스토리지범용, DC, 2개 vCore, 32GB 스토리지로 설정되었는지 확인합니다.

  13. 백업 스토리지 중복도를 설정하려면 로컬 중복 백업 스토리지를 선택합니다.

  14. 완료되면 다음: 네트워킹을 선택합니다.

    Screenshot of Azure portal, showing Configure DC-series database - basics.

  15. 네트워킹 탭에서 연결 방법에 대해 퍼블릭 엔드포인트를 선택합니다.

  16. 방화벽 규칙의 경우 현재 클라이언트 IP 주소 추가로 설정합니다. Azure 서비스 및 리소스가 이 서버에 액세스할 수 있도록 허용아니요로 설정된 상태로 둡니다.

  17. 연결 정책의 경우, 연결 정책기본값(Azure 내부에서 시작되는 모든 클라이언트 연결에 대해 리디렉션 정책 사용 및 Azure 외부에서 시작되는 모든 클라이언트 연결에 대해 프록시 사용)으로 유지하세요.

  18. 암호화된 연결 설정을 최소 TLS 버전TLS 1.2로 유지하세요.

  19. 페이지 아래쪽에서 검토 + 만들기를 선택합니다.

    Screenshot of the Azure portal Create SQL Database, networking tab.

  20. 검토 + 만들기 페이지에서 검토 후 만들기를 선택합니다.

2단계: 증명 공급자 구성

이 단계에서는 Microsoft Azure Attestation에서 증명 공급자를 만들고 구성합니다. 이는 데이터베이스가 사용하는 보안 enclave를 증명하는 데 필요합니다.

  1. 증명 공급자 만들기 페이지로 이동합니다.

  2. 증명 공급자 만들기 페이지에서 다음 입력을 제공합니다.

    • 구독: Azure SQL 논리 서버를 만든 구독을 선택합니다.
    • 리소스 그룹: Azure SQL 논리 서버를 만든 리소스 그룹을 선택합니다.
    • 이름: myattestprovider를 입력하고 일부 문자를 추가하여 고유하게 만듭니다. 이름은 전역적으로 고유해야 하므로 똑같은 증명 공급자 이름을 사용하도록 지정할 수는 없습니다. 따라서 myattestprovider12345와 같은 항목을 입력하면 포털에서 사용 가능 여부를 알 수 있습니다.
    • 위치: Azure SQL 논리 서버와 동일한 위치를 선택합니다.
    • 정책 서명자 인증서 파일: 서명되지 않은 정책을 구성할 것이므로 이 필드는 비워 둡니다.
  3. 필요한 입력이 제공되었으면 검토 + 만들기를 선택합니다.

    Screenshot of the Azure portal Create attestation provider menu.

  4. 만들기를 실행합니다.

  5. 증명 공급자가 생성되었으면 리소스로 이동을 선택합니다.

  6. 증명 공급자에 대한 개요 탭에서 증명 URI 속성 값을 클립보드에 복사하고 파일에 저장합니다. 이는 증명 URL이며 이후 단계에서 필요합니다.

    Screenshot of the attestation URL in the Azure portal.

  7. 창 왼쪽의 리소스 메뉴 또는 아래쪽 창에서 정책을 선택합니다.

  8. 증명 유형SGX-IntelSDK로 설정합니다.

  9. 위쪽 메뉴에서 구성을 선택합니다.

    Screenshot of configuring attestation policy in the Azure portal.

  10. 정책 형식텍스트로 설정합니다. 정책 옵션정책 입력으로 설정된 상태로 둡니다.

  11. 정책 텍스트 필드에서 기본 정책을 아래 정책으로 바꿉니다. 아래 정책에 대한 자세한 내용은 증명 공급자 만들기 및 구성을 참조하세요.

version= 1.0;
authorizationrules 
{
       [ type=="x-ms-sgx-is-debuggable", value==false ]
        && [ type=="x-ms-sgx-product-id", value==4639 ]
        && [ type=="x-ms-sgx-svn", value>= 2 ]
        && [ type=="x-ms-sgx-mrsigner", value=="e31c9e505f37a58de09335075fc8591254313eb20bb1a27e5443cc450b6e33e5"] 
    => permit();
};

  1. 저장을 선택합니다.

    Screenshot of editing an attestation policy in the Azure portal.

  2. 위쪽 메뉴에서 새로 고침을 선택하여 구성된 정책을 확인합니다.

3단계: 데이터베이스 채우기

이 단계에서는 테이블을 만들고 나중에 암호화하고 쿼리할 일부 데이터로 채웁니다.

  1. SSMS를 열고 데이터베이스 연결에서 Always Encrypted를 사용하지 않고 만든 Azure SQL 논리 서버의 ContosoHR 데이터베이스에 연결합니다.

    1. 서버에 연결 대화 상자에서 서버의 정규화된 이름(예: myserver135.database.windows.net)을 지정하고, 서버를 만들 때 지정한 관리자 사용자 이름과 암호를 입력합니다.

    2. 옵션 >>을 선택하고 연결 속성 탭을 선택합니다. ContosoHR 데이터베이스(기본 master 데이터베이스 아님)를 선택해야 합니다.

    3. Always Encrypted 탭을 선택합니다.

    4. Always Encrypted 사용(열 암호화) 확인란이 선택되어 있지 않은지 확인합니다.

      Screenshot of Connect to Server using SSMS without Always Encrypted enabled.

    5. 연결을 선택합니다.

  2. Employees라는 새 테이블을 만듭니다.

    CREATE SCHEMA [HR];
    GO
    
    CREATE TABLE [HR].[Employees]
    (
        [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
        [SSN] [char](11) NOT NULL,
        [FirstName] [nvarchar](50) NOT NULL,
        [LastName] [nvarchar](50) NOT NULL,
        [Salary] [money] NOT NULL
    ) ON [PRIMARY];
    GO
    
  3. Employees 테이블에 몇 개의 직원 레코드를 추가합니다.

    INSERT INTO [HR].[Employees]
            ([SSN]
            ,[FirstName]
            ,[LastName]
            ,[Salary])
        VALUES
            ('795-73-9838'
            , N'Catherine'
            , N'Abel'
            , $31692);
    
    INSERT INTO [HR].[Employees]
            ([SSN]
            ,[FirstName]
            ,[LastName]
            ,[Salary])
        VALUES
            ('990-00-6818'
            , N'Kim'
            , N'Abercrombie'
            , $55415);
    

4단계: Enclave 사용 키 프로비전

이 단계에서는 Enclave 계산을 허용하는 열 마스터 키 및 열 암호화 키를 만듭니다.

  1. 이전 단계의 SSMS 인스턴스를 사용해, 개체 탐색기에서 데이터베이스를 확장하고 보안>Always Encrypted 키로 이동합니다.

  2. 새 Enclave 사용 열 마스터 키를 프로비전합니다.

    1. Always Encrypted 키를 마우스 오른쪽 단추로 클릭하고 새 열 마스터 키... 를 선택합니다.
    2. 새 열 마스터 키의 이름을 CMK1로 입력합니다.
    3. Enclave 계산 허용이 선택되어 있는지 확인합니다. (데이터베이스에 보안 enclave가 활성화된 경우 이는 기본적으로 선택됩니다. 데이터베이스가 DC 시리즈 하드웨어 구성을 사용하므로 이미 활성화되어 있을 것입니다.)
    4. Azure Key Vault 또는 Windows 인증서 저장소(현재 사용자 또는 로컬 컴퓨터)를 선택합니다.
      • Azure Key Vault를 선택한 경우 Azure에 로그인하고, 사용할 키 자격 증명 모음이 포함된 Azure 구독을 선택하고, 키 자격 증명 모음을 선택합니다. 키 생성을 선택하여 새 키를 만듭니다.
      • Windows 인증서 저장소를 선택한 경우 인증서 생성 단추를 선택하여 새 인증서를 만듭니다. Screenshot of the allow enclave computations selection in SSMS when creating a new column master key.
    5. 확인을 선택합니다.
  3. 새 Enclave 사용 열 암호화 키를 만듭니다.

    1. Always Encrypted 키를 마우스 오른쪽 단추로 클릭하고 새 열 암호화 키를 선택합니다.
    2. 새 열 암호화 키의 이름을 입력합니다. CEK1.
    3. 열 마스터 키 드롭다운에서 이전 단계에서 만든 열 마스터 키를 선택합니다.
    4. 확인을 선택합니다.

5단계: 일부 열 미리 암호화

이 단계에서는 서버 쪽 Enclave 내에서 SSNSalary 열에 저장된 데이터를 암호화한 다음, 데이터에서 SELECT 쿼리를 테스트합니다.

  1. 새 SSMS 인스턴스를 열고 데이터베이스 연결에 대해 Always Encrypted를 사용하여 데이터베이스에 연결합니다.

    1. SSMS의 새 인스턴스를 시작합니다.

    2. 서버에 연결 대화 상자에서 서버의 정규화된 이름(예: myserver135.database.windows.net)을 지정하고, 서버를 만들 때 지정한 관리자 사용자 이름과 암호를 입력합니다.

    3. 옵션 >>을 선택하고 연결 속성 탭을 선택합니다. ContosoHR 데이터베이스(기본 master 데이터베이스 아님)를 선택해야 합니다.

    4. Always Encrypted 탭을 선택합니다.

    5. Always Encrypted(열 암호화) 사용 확인란을 선택합니다.

    6. 보안 Enclave 사용을 선택합니다. (이 단계는 SSMS 19 이상에 적용됩니다.)

    7. 프로토콜Microsoft Azure Attestation으로 설정합니다. (이 단계는 SSMS 19 이상에 적용됩니다.)

    8. 2단계: 증명 공급자 구성의 단계에 따라 얻은 enclave 증명 URL을 지정합니다. 아래 스크린샷을 참조하세요.

      Screenshot of the SSMS Connect to Server dialog Always Encrypted tab, with attestation enabled.

    9. 연결을 선택합니다.

    10. Always Encrypted 쿼리에 대해 매개 변수화를 사용하도록 설정하라는 메시지가 표시되면 사용을 선택합니다.

  2. 동일한 SSMS 인스턴스(Always Encrypted 사용)를 사용하여 새 쿼리 창을 열고, 아래 명령문을 실행하여 SSNSalary 열을 암호화합니다.

    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [SSN] [char] (11) COLLATE Latin1_General_BIN2
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [Salary] [money]
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    

    참고

    위의 스크립트에서 데이터베이스에 대한 쿼리 계획 캐시를 지우려면 ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE 문을 확인합니다. 테이블을 변경한 후에는 테이블에 액세스하는 모든 일괄 처리 및 저장 프로시저에 대한 계획을 지워서 매개 변수 암호화 정보를 새로 고쳐야 합니다.

  3. SSNSalary 열이 지금 암호화되었는지 확인하려면, 데이터베이스 연결에 대해 Always Encrypted를 사용하지 않고 SSMS 인스턴스에서 새 쿼리 창을 열고 아래 문을 실행합니다. 쿼리 창의 SSNSalary 열에 암호화된 값이 반환되어야 합니다. Always Encrypted를 사용하는 SSMS 인스턴스에서 동일한 쿼리를 실행하는 경우 암호화된 데이터가 표시되어야 됩니다.

    SELECT * FROM [HR].[Employees];
    

6단계: 암호화된 열에 대해 리치 쿼리 실행

암호화된 열에 대해 다양한 쿼리를 실행할 수 있습니다. 일부 쿼리 처리는 서버 쪽 Enclave 내에서 수행됩니다.

  1. Always Encrypted를 사용하는 SSMS 인스턴스에서 Always Encrypted에 대해 매개 변수화도 사용하도록 설정되었는지 확인합니다.

    1. SSMS의 주 메뉴에서 도구 를 선택합니다.
    2. 옵션... 을 선택합니다.
    3. 쿼리 실행>SQL Server>고급으로 이동합니다.
    4. Always Encrypted에 대해 매개 변수화 사용이 선택되었는지 확인합니다.
    5. 확인을 선택합니다.
  2. 새 쿼리 창을 열고 아래 쿼리를 붙여넣은 다음, 실행합니다. 이 쿼리는 지정된 검색 기준에 맞는 일반 텍스트 값 및 행을 반환해야 합니다.

    DECLARE @SSNPattern [char](11) = '%6818';
    DECLARE @MinSalary [money] = $1000;
    SELECT * FROM [HR].[Employees]
    WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
    
  3. Always Encrypted를 사용하도록 설정되지 않은 SSMS 인스턴스에서 동일한 쿼리를 다시 시도합니다. 오류가 발생합니다.

다음 단계

이 자습서를 완료한 후 다음 자습서 중 하나로 이동할 수 있습니다.

참고 항목