자습서: 임의 암호화를 사용하여 enclave 사용 열에서 인덱스 만들기 및 사용

적용 대상: SQL Server 2019(15.x) 이상 - Windows 전용 Azure SQL Database

이 자습서에서는 보안 Enclave를 사용하여 Always Encrypted에서 지원되는 임의 암호화를 사용하여 enclave 사용 열에서 인덱스를 만들고 사용하는 방법을 설명합니다. 다음이 설명됩니다.

  • 열을 보호하는 키(열 마스터 키 및 열 암호화 키)에 액세스할 수 있는 경우 인덱스 만들기 방법
  • 열을 보호하는 키에 액세스할 수 없을 때 인덱스를 만드는 방법

전제 조건

최신 버전의 SQL Server Management Studio(SSMS)를 다운로드하세요.

이 자습서의 아래 단계를 따르기 전에 보안 Enclave 자습서에서 Always Encrypted 사용을 시작하는 중 하나를 완료했는지 확인합니다.

1단계: 데이터베이스에서 ADR(가속 데이터베이스 복구) 사용

참고 항목

이 단계는 SQL Server만 적용됩니다. Azure SQL Database를 사용하는 경우 이 단계를 건너뜁니다. ADR은 Azure SQL Database에서 자동으로 사용하도록 설정되며 사용하지 않도록 설정할 수 없습니다.

임의 암호화를 사용하여 enclave 사용 열에 첫 번째 인덱스를 만들기 전에 데이터베이스에서 ADR을 사용하도록 설정하는 것이 좋습니다. 보안 enclave를 사용한 Always Encrypted의 데이터베이스 복구 섹션을 참조하세요.

  1. 이전 자습서에서 사용한 모든 SSMS 인스턴스를 닫습니다. SSMS를 닫으면 ADR을 사용하도록 설정하는 데 필요한 열린 데이터베이스 연결이 닫힙니다.

  2. SSMS의 새 인스턴스를 열고 데이터베이스 연결에 Always Encrypted를 사용하지 않고 sysadmin으로 SQL Server 인스턴스에 연결합니다.

    1. SSMS를 시작합니다.
    2. 서버에 연결 대화 상자에서 서버 이름을 지정하고 인증 방법을 선택하고 자격 증명을 지정합니다.
    3. 옵션 >> 및 을 선택하고 Always Encrypted 탭을 선택합니다.
    4. Always Encrypted 사용(열 암호화) 확인란이 선택되어 있지 않은지 확인합니다.
    5. 연결을 선택합니다.
  3. 새 쿼리 창을 열고 아래 문을 실행하여 ADR을 사용하도록 설정합니다.

    ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
    

2단계: 역할 분리 없이 인덱스 만들기 및 테스트

이 단계에서는 암호화된 열에서 인덱스 만들기 및 테스트합니다. 데이터베이스를 관리하는 DBA와 키에 대한 액세스 권한이 있는 데이터 소유자 모두의 역할을 맡아 데이터를 보호하는 단일 사용자 역할을 수행하게 됩니다.

  1. 새 SSMS 인스턴스를 열고 데이터베이스 연결에 Always Encrypted를 사용하도록 설정된 SQL Server 인스턴스 에 연결합니다.

    1. SSMS의 새 인스턴스를 시작합니다.
    2. 서버에 연결 대화 상자에서 서버 이름을 지정하고 인증 방법을 선택하고 자격 증명을 지정합니다.
    3. 옵션 >> 및 을 선택하고 Always Encrypted 탭을 선택합니다.
    4. Always Encrypted 사용(열 암호화)보안 Enclave 사용 확인란 선택
    5. 데이터베이스에 증명을 사용하는 경우 증명 서비스(호스트 보호 서비스 또는 Microsoft Azure 증명)를 나타내는 Enclave 증명 프로토콜 값을 선택하고 enclave 증명 URL을 채웁니다. 그렇지 않으면 [없음]을 선택합니다.
    6. 연결을 선택합니다.
    7. Always Encrypted 쿼리에 대해 매개 변수화를 사용하도록 설정하라는 메시지가 표시되면 [사용]을 선택합니다.
  2. Always Encrypted에 대해 매개 변수화를 사용하도록 설정하라는 메시지가 표시되지 않으면 사용하도록 설정되었는지 확인합니다.

    1. SSMS의 주 메뉴에서 도구 를 선택합니다.
    2. 옵션... 을 선택합니다.
    3. 쿼리 실행>SQL Server>고급으로 이동합니다.
    4. Always Encrypted에 대해 매개 변수화 사용이 선택되었는지 확인합니다.
    5. 확인을 선택합니다.
  3. 쿼리 창을 열고 아래 문을 실행하여 Employees 테이블의 LastName 열을 암호화합니다 . 이후 단계에서 해당 열에 인덱스 만들기 및 사용합니다.

    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [LastName] [nvarchar](50) COLLATE Latin1_General_BIN2 
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL;
    GO   
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    GO
    
  4. LastName 열에 인덱스 만들기 Always Encrypted를 사용하도록 설정된 데이터베이스에 연결되었으므로 SSMS 내의 클라이언트 드라이버는 인덱스를 만드는 데 필요한 Enclave에 CEK1(열 암호화 키, LastName 열 보호)을 투명하게 제공합니다.

    CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
    INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
    GO
    
  5. LastName 열에서 서식 있는 쿼리를 실행하고 쿼리를 실행할 때 SQL Server에서 인덱스가 사용되는지 확인합니다.

    1. 동일한 쿼리 또는 새 쿼리 창에서 도구 모음의 라이브 쿼리 통계 포함 단추가 있는지 확인합니다 .

    2. 아래 쿼리를 실행합니다.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. 라이브 쿼리 통계 탭에서 쿼리가 인덱스를 사용하는지 확인합니다.

3단계: 역할 분리를 사용하여 인덱스 만들기

이 단계에서는 서로 다른 두 사용자로 가장하여 암호화된 열에 인덱스 만들기를 수행합니다. 한 사용자는 인덱스를 만들어야 하지만 키에 액세스할 수 없는 DBA입니다. 다른 사용자는 키에 액세스할 수 있는 데이터 소유자입니다.

  1. Always Encrypted를 사용하지 않고 SSMS 인스턴스를 사용하여 아래 문을 실행하여 LastName 열에 인덱스를 삭제합니다.

    DROP INDEX IX_LastName ON [HR].[Employees]; 
    GO
    
  2. 데이터 소유자(또는 키에 대한 액세스 권한이 있는 애플리케이션)로 작동하면 enclave 내부의 캐시를 CEK1채웁다.

    참고 항목

    2단계 이후 SQL Server 인스턴스를 다시 시작하지 않은 경우: 역할 분리 없이 인덱스 만들기 및 테스트는 CEK1이 캐시에 이미 있으므로 중복됩니다. 여기서는 enclave에 키가 없는 경우 데이터 소유자가 enclave에 키를 제공할 수 있는 방법을 보여 주기 위해 추가되었습니다.

    1. Always Encrypted를 사용하도록 설정된 SSMS 인스턴스 에서 쿼리 창에서 아래 문을 실행합니다. 이 문은 enclave 사용 열 암호화 키를 모두 enclave로 보냅니다. 자세한 내용은 sp_enclave_send_keys 참조하세요.

      EXEC sp_enclave_send_keys;
      GO
      
    2. 위의 저장 프로시저를 실행하는 대신 LastName 열에 대해 enclave를 사용하는 DML 쿼리를 실행할 수 있습니다. 이렇게 하면 Enclave가 CEK1만 채워집니다.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
  3. DBA 역할을 하면서 인덱스 만들기

    1. Always Encrypted를 사용하도록 설정하지 않은 SSMS 인스턴스에서 쿼리 창에서 아래 문을 실행합니다.

      CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
      INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
      GO
      
  4. 데이터 소유자로 LastName 열에 대해 풍부한 쿼리를 실행하고, SQL Server에서 쿼리를 실행할 때 인덱스를 사용하는지 확인합니다.

    1. Always Encrypted를 사용하도록 설정된 SSMS 인스턴스에서 기존 쿼리 창을 선택하거나 새 쿼리 창을 열고 도구 모음의 라이브 쿼리 통계 포함 단추가 설정되어 있는지 확인합니다.

    2. 아래 쿼리를 실행합니다.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. 라이브 쿼리 통계에서 쿼리가 인덱스를 사용하는지 확인합니다.

다음 단계

참고 항목