Always Encrypted
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Always Encrypted 및 보안 Enclave를 사용한 Always Encrypted는 Azure SQL Database, Azure SQL Managed Instance 및 SQL Server 데이터베이스에서 신용 카드 번호 및 국가 또는 지역 식별 번호(예: 미국 사회 보장 번호)를 비롯한 중요한 정보를 보호하도록 설계된 기능입니다. 이를 통해 클라이언트는 클라이언트 애플리케이션 내에서 중요한 데이터를 암호화하여 암호화 키가 데이터베이스 엔진 노출되지 않도록 할 수 있습니다. 이를 통해 데이터를 소유하고 볼 수 있는 사용자와 데이터를 관리하지만 액세스 권한이 없어야 하는 사용자(온-프레미스 데이터베이스 관리자, 클라우드 데이터베이스 연산자 또는 기타 권한이 높은 권한이 있는 무단 사용자)가 구분됩니다. 따라서 Always Encrypted를 사용하면 고객은 중요한 데이터를 클라우드에 안전하게 저장할 수 있으므로 악의적인 내부자에 의한 데이터 도난 위험을 줄일 수 있습니다.
Always Encrypted에는 정렬, 필터링(결정적 암호화를 사용하는 지점 조회 제외) 등 암호화된 데이터에 대한 작업을 수행할 수 없는 것과 같은 특정 제한 사항이 있습니다. 즉, 일부 쿼리 및 애플리케이션이 Always Encrypted와 호환되지 않거나 애플리케이션 논리를 크게 변경해야 할 수 있습니다.
이러한 제한 사항을 해결하기 위해 보안 Enclave를 사용한 Always Encrypted를 사용하면 데이터베이스 엔진이 보안 Enclave라는 보호된 메모리 영역 내에서 암호화된 데이터를 처리할 수 있습니다. 보안 Enclave는 패턴 일치, 다양한 비교 연산자 및 현재 위치 암호화를 지원하여 Always Encrypted의 기밀 컴퓨팅 기능을 향상시킵니다.
Always Encrypted는 애플리케이션에 대해 암호화가 원활하게 수행되도록 합니다. 클라이언트 쪽에서 Always Encrypted 사용 드라이버는 중요한 데이터를 데이터베이스 엔진 보내기 전에 암호화하고 애플리케이션 의미 체계를 유지하기 위해 쿼리를 자동으로 다시 작성합니다. 또한 암호화된 데이터베이스 열의 쿼리 결과를 자동으로 해독합니다.
Always Encrypted 구성
참고 항목
패턴 일치를 수행하고, 암호화된 열에서 비교 연산자, 정렬 및 인덱스를 사용해야 하는 애플리케이션의 경우 보안 Enclave를 사용한 Always Encrypted를 구현해야 합니다.
이 섹션에서는 Always Encrypted 설정에 대한 개요를 제공합니다. 자세한 내용과 시작은 자습서: Always Encrypted 시작을 참조하세요.
데이터베이스에서 Always Encrypted를 구성하려면 다음 단계를 수행합니다.
데이터를 보호하기 위해 암호화 키를 프로비저닝합니다. Always Encrypted는 다음 두 가지 유형의 키를 사용합니다.
- 열 암호화 키.
- 열 마스터 키.
열 암호화 키는 암호화된 열 내의 데이터를 암호화하는 데 사용됩니다. 열 마스터 키는 하나 이상의 열 암호화 키를 암호화하는 키 보호 키입니다.
Azure Key Vault, Windows 인증서 저장소 또는 하드웨어 보안 모듈과 같은 데이터베이스 시스템 외부의 신뢰할 수 있는 키 저장소에 열 마스터 키를 저장해야 합니다. 그런 다음 열 암호화 키를 프로비저닝하고 열 마스터 키로 각각을 암호화해야 합니다.
마지막으로 키에 대한 메타데이터를 데이터베이스에 저장합니다. 열 마스터 키 메타데이터에는 열 마스터 키의 위치가 포함됩니다. 열 암호화 키 메타데이터에는 열 암호화 키의 암호화된 값이 포함됩니다. 데이터베이스 엔진 일반 텍스트로 키를 저장하거나 사용하지 않습니다.
Always Encrypted 키 관리에 대한 자세한 내용은 Always Encrypted를 위한 키 관리 개요를 참조하세요.
보호를 위해 중요한 정보가 포함된 특정 데이터베이스 열에 대한 암호화를 설정합니다. 이를 위해서는 암호화된 열이 있는 새 테이블을 만들거나 기존 열과 데이터를 암호화해야 할 수 있습니다. 열에 대한 암호화를 구성할 때 암호화 알고리즘, 데이터를 보호하기 위한 열 암호화 키 및 암호화 유형에 대한 세부 정보를 지정해야 합니다. Always Encrypted는 두 가지 유형의 암호화를 지원합니다.
결정적 암호화는 지정된 일반 텍스트 값에 대해 항상 동일한 암호화된 값을 생성합니다. 결정적 암호화를 사용하는 경우 암호화된 열에 대한 지점 조회, 동등 조인, 그룹화 및 인덱싱이 가능합니다. 그러나 True/False 또는 North/South/East/West 영역 등 가능한 암호화된 값의 집합이 작은 경우 특히 권한이 없는 사용자가 암호화된 열의 패턴을 검사하여 암호화된 값에 대한 정보를 추측할 수도 있습니다.
임의 암호화는 데이터를 예측할 수 없게 암호화하는 방법을 사용합니다. 동일한 일반 텍스트 입력마다 고유하게 암호화된 출력이 생성됩니다. 이렇게 하면 임의 암호화의 보안이 향상됩니다.
암호화된 열에서 비교 연산자, 정렬 및 인덱싱을 사용하여 패턴 일치를 수행하려면 보안 Enclave를 사용한 Always Encrypted를 채택하고 임의 암호화를 적용해야 합니다. Always Encrypted(보안 Enclave 없음) 임의 암호화는 암호화된 열에서 검색, 그룹화, 인덱싱 또는 조인을 지원하지 않습니다. 대신 검색 또는 그룹화 목적으로 사용할 열의 경우 결정적 암호화를 사용해야 합니다. 이렇게 하면 암호화된 열에서 포인트 조회, 동일성 조인, 그룹화 및 인덱싱과 같은 작업을 수행할 수 있습니다.
데이터베이스 시스템은 기본적으로 암호화 키에 액세스할 수 없으므로 열 암호화를 사용하려면 데이터베이스 외부에서 데이터를 이동하고 암호화해야 합니다. 즉, 이 암호화 프로세스는 시간이 오래 걸릴 수 있으며 네트워크 중단에 취약합니다. 또한 나중에 암호화 키를 교체하거나 암호화 유형을 변경하는 등 열을 다시 암호화해야 하는 경우에도 동일한 문제가 다시 발생합니다. 보안 Enclave를 사용한 Always Encrypted를 사용하면 데이터베이스에서 데이터를 이동할 필요가 없습니다. Enclave는 신뢰할 수 있으므로 애플리케이션 내의 클라이언트 드라이버 또는 Azure Data Studio 또는 SSMS(SQL Server Management Studio)와 같은 도구는 암호화 작업 중에 Enclave와 키를 안전하게 공유할 수 있습니다. 그런 다음 Enclave는 현재 위치에서 열을 암호화하거나 다시 암호화하여 이러한 작업에 필요한 시간을 크게 줄일 수 있습니다.
Always Encrypted 암호화 알고리즘에 대한 자세한 내용은 Always Encrypted 암호화를 참조하세요.
SQL 도구를 사용하여 위의 단계를 수행할 수 있습니다.
- SQL Server Management Studio를 사용하여 Always Encrypted 키 프로비저닝
- PowerShell을 사용하여 상시 암호화 구성
- sqlpackage - 설치 프로세스를 자동화합니다.
Always Encrypted 키와 보호된 중요한 데이터가 데이터베이스 환경에 일반 텍스트로 표시되지 않도록 하기 위해 데이터베이스 엔진은 키 프로비전 및 데이터 암호화 또는 암호 해독 작업에 참여할 수 없습니다. 따라서 T-SQL(Transact-SQL)은 키 프로비전 또는 암호화 작업을 지원하지 않습니다. 같은 이유로 기존 데이터를 암호화하거나 다시 암호화(다른 암호화 유형 또는 열 암호화 키 사용)는 데이터베이스 외부에서 수행해야 합니다(SQL 도구에서 자동화할 수 있음).
암호화된 열의 정의를 변경한 후 sp_refresh_parameter_encryption을 실행하여 개체에 대한 상시 암호화 메타데이터를 업데이트합니다.
제한 사항
암호화된 열의 쿼리에는 다음과 같은 제한 사항이 적용됩니다.
임의 암호화를 사용하여 암호화된 열에 대한 계산은 허용되지 않습니다. 결정적 암호화는 같음 비교와 관련된 다음 작업을 지원합니다. 다른 작업은 허용되지 않습니다.
참고 항목
패턴 일치를 수행하고, 암호화된 열에서 비교 연산자, 정렬 및 인덱스를 사용해야 하는 애플리케이션의 경우 보안 Enclave를 사용한 Always Encrypted를 구현해야 합니다.
일반 텍스트 및 암호화된 데이터와 관련된 계산을 트리거하는 쿼리 문은 허용되지 않습니다. 예시:
- 암호화된 열을 일반 텍스트 열 또는 리터럴과 비교
- 일반 텍스트 열에서 암호화된 열로(또는 그 반대로) UPDATE, BULK INSERT, SELECT INTO 또는 INSERT..SELECT로 데이터를 복사합니다.
- 암호화된 열에 리터럴 삽입.
이러한 문은 다음과 같은 피연산자 충돌 오류를 발생합니다.
Msg 206, Level 16, State 2, Line 89 Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
애플리케이션은 쿼리 매개 변수를 사용하여 암호화된 열에 대한 값을 제공해야 합니다. 예를 들어 암호화된 열에 데이터를 삽입하거나 결정적 암호화를 사용하여 필터링하는 경우 쿼리 매개 변수를 사용해야 합니다. 암호화된 열에 해당하는 리터럴 또는 T-SQL 변수를 전달하는 것은 지원되지 않습니다. 사용 중인 클라이언트 드라이버에 대한 자세한 내용은 Always Encrypted를 사용하여 애플리케이션 개발을 참조하세요.
Azure Data Studio 또는 SSMS에서는 Always Encrypted 변수에 대한 매개 변수화를 적용하여 암호화된 열과 연결된 값을 처리하는 쿼리를 실행하는 것이 중요합니다. 여기에는 암호화된 열에 데이터를 삽입하거나 필터를 적용하는 시나리오(결정적 암호화가 사용되는 경우)와 같은 시나리오가 포함됩니다.
암호화된 열을 대상으로 하는 테이블 반환 매개 변수는 지원되지 않습니다.
다음 절을 사용하는 쿼리는 지원되지 않습니다.
다음 특성이 있는 열에 대해서는 Always Encrypted가 지원되지 않습니다.
- 다음 데이터 형식 중 하나를 사용하는 열: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, 사용자 정의 형식.
- FILESTREAM 열
- IDENTITY 속성을 지닌 열.
- ROWGUIDCOL 속성을 지닌 열.
- 이진 코드 지점(_BIN2) 정렬 방식 이외의 정렬 방식을 사용하는 문자열(varchar, char등) 열은.
- 임의 암호화를 사용할 때 클러스터형 및 비클러스터형 인덱스의 키인 열(결정적 암호화를 사용하는 열의 인덱스가 지원됨).
- 전체 텍스트 인덱스에 포함된 열(Always Encrypted는 전체 텍스트 검색을 지원하지 않음).
- 테이블에서 계산 열 지정.
- 계산된 열에서 참조되는 열(식이 Always Encrypted에 대해 지원되지 않는 작업을 수행하는 경우)
- 스파스 열 사용.
- 임의 암호화를 사용하는 경우 통계에서 참조되는 열(결정적 암호화 지원됨).
- 분할 열
- 기본 제약 조건이 있는 열
- 임의 암호화를 사용하는 경우 고유한 제약 조건에서 참조되는 열(결정적 암호화도 지원됨).
- 임의 암호화를 사용하는 경우 기본 키 열(결정적 암호화도 지원됨).
- 임의 암호화를 사용하거나 결정적 암호화를 사용할 때 참조된 열과 참조하는 열에서 서로 다른 키 또는 알고리즘을 사용하는 경우 외래 키 제약 조건에서 참조하는 열.
- CHECK 제약 조건에서 참조되는 열.
- 변경 데이터 캡처를 사용하여 캡처되는/추적되는 열.
- 변경 내용 추적을 사용하는 테이블의 기본 키 열
- 마스킹된 열(동적 데이터 마스킹 사용).
- 고유하게 컴파일된 저장 프로시저에 사용되는 열은에 포함됩니다.
- 스트레치 데이터베이스 테이블의 열. 상시 암호화로 암호화된 열이 있는 테이블은 스트레치에 사용할 수 있습니다.
Important
Stretch Database는 SQL Server 2022(16.x) 및 Azure SQL 데이터베이스에서 사용되지 않습니다. 데이터베이스 엔진의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
- 외부(PolyBase) 테이블의 열(주: 동일한 쿼리에서 암호화된 열이 있는 외부 테이블 및 테이블 사용이 지원됨).
다음 기능은 암호화된 열에서 작동하지 않습니다.
- SQL Server 복제(트랜잭션, 병합 또는 스냅샷 복제). Always On 가용성 그룹을 포함한 물리적 복제 기능이 지원됩니다.
- 분산 쿼리(연결된 서버, OPENROWSET(Transact-SQL), OPENDATASOURCE(Transact-SQL))
- 서로 다른 데이터베이스의 암호화가 이루어지는 열에 조인을 수행하는 데이터베이스 간 쿼리입니다.
Always Encrypted Transact-SQL 참조
Always Encrypted는 다음 Transact-SQL 문, 시스템 카탈로그 뷰, 시스템 저장 프로시저 및 권한을 사용합니다.
문
DDL 문 | 설명 |
---|---|
CREATE COLUMN MASTER KEY | 데이터베이스에 열 마스터 키 메타데이터 개체를 만듭니다. |
DROP COLUMN MASTER KEY | 데이터베이스에서 열 마스터 키를 삭제합니다. |
CREATE COLUMN ENCRYPTION KEY | 열 암호화 키 메타데이터 개체를 만듭니다. |
ALTER COLUMN ENCRYPTION KEY | 암호화 값을 추가 또는 삭제해 데이터베이스의 열 암호화 키를 수정합니다. |
DROP COLUMN ENCRYPTION KEY | 데이터베이스에서 열 암호화 키를 삭제합니다. |
CREATE TABLE(ENCRYPTED WITH) | 열 암호화 지정 |
시스템 카탈로그 뷰 및 저장 프로시저
시스템 카탈로그 뷰 및 저장 프로시저 | 설명 |
---|---|
sys.column_encryption_keys | CEK(열 암호화 키)에 대한 정보를 반환합니다. |
sys.column_encryption_key_values | CEK(열 암호화 키)의 암호화된 값에 대한 정보를 반환합니다 |
sys.column_master_keys | 각 데이터베이스 마스터 키에 대한 행을 반환합니다. |
sp_refresh_parameter_encryption | 지정된 스키마 바인딩되지 않은 저장 프로시저, 사용자 정의 함수, 뷰, DML 트리거, 데이터베이스 수준 DDL 트리거 또는 서버 수준 DDL 트리거의 매개 변수에 대한 Always Encrypted 메타데이터를 업데이트합니다. |
sp_describe_parameter_encryption | 지정된 Transact-SQL 문 및 해당 매개 변수를 분석하여 Always Encrypted 기능을 사용하여 보호되는 데이터베이스 열에 해당하는 매개 변수를 결정합니다. |
또한 각 열에 대해 저장된 암호화 메타데이터에 대한 자세한 내용은 sys.columns를 참조하세요.
데이터베이스 사용 권한
Always Encrypted에 대한 4가지 데이터베이스 권한이 있습니다.
시스템 카탈로그 뷰 및 저장 프로시저 | 설명 |
---|---|
ALTER ANY COLUMN MASTER KEY | 열 마스터 키 메타데이터를 만들고 삭제하는 데 필요합니다. |
ALTER ANY COLUMN ENCRYPTION KEY | 열 암호화 키 메타데이터를 만들고 삭제하는 데 필요합니다. |
VIEW ANY COLUMN MASTER KEY DEFINITION | 암호화된 열을 쿼리하는 데 필요한 열 마스터 키 메타데이터에 액세스하고 읽는 데 필요합니다. |
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION | 암호화된 열을 쿼리하는 데 필요한 열 암호화 키 메타데이터에 액세스하고 읽는 데 필요합니다. |
다음 표에는 일반적인 작업에 필요한 사용 권한이 요약되어 있습니다.
시나리오 | ALTER ANY COLUMN MASTER KEY | ALTER ANY COLUMN ENCRYPTION KEY | VIEW ANY COLUMN MASTER KEY DEFINITION | VIEW ANY COLUMN ENCRYPTION KEY DEFINITION |
---|---|---|---|---|
키 관리(데이터베이스에서 키 메타데이터 만들기/변경/검토) | X | X | X | X |
암호화된 열 쿼리 | X | X |
중요 사항
사용자가 열 마스터 키(키 저장소)에 대한 권한이 없어 열을 보호하고 일반 텍스트 시도에 액세스하지 않더라도 암호화된 열을 선택할 때 VIEW ANY COLUMN MASTER KEY DEFINITION 및 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 권한이 필요합니다.
SQL Server에서는 기본적으로 VIEW ANY COLUMN MASTER KEY DEFINITION 및 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 권한이 공용 고정 데이터베이스 역할에 부여됩니다. 데이터베이스 관리자는 공용 역할에 대한 사용 권한을 취소(또는 거부)하고 특정 역할 또는 사용자에게 더 제한된 제어를 구현하도록 부여하도록 선택할 수 있습니다.
SQL Database에서 VIEW ANY COLUMN MASTER KEY DEFINITION 및 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 권한은 기본적으로 공용 고정 데이터베이스 역할에 부여되지 않습니다. 이렇게 하면 기존의 특정 레거시 도구(이전 버전의 DacFx 사용)가 제대로 작동할 수 있습니다. 암호를 해독하지 않더라도 암호화된 열로 작업하려면 데이터베이스 관리자가 VIEW ANY COLUMN MASTER KEY DEFINITION 및 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 권한을 명시적으로 부여해야 합니다.