AlloyDB Omni Kubernetes 연산자는 TdeConfig 커스텀 리소스를 사용하여 투명한 데이터 암호화 (TDE) 클러스터의 수명 주기를 자동화합니다. 이 리소스는 HashiCorp Vault 또는 Thales CipherTrust Manager의 키 관리 서비스 (KMS) 연결 세부정보를 저장하여 오퍼레이터가 필요한 사용자 인증 정보를 데이터베이스 포드에 안전하게 삽입할 수 있도록 합니다.
시작하기 전에
HashiCorp Vault KMS
- 키 암호화 키 (KEK) 경로와 JSON 웹 토큰 (JWT)을 사용할 수 있도록 HashiCorp Vault의 KV-V2 보안 비밀 엔진을 구성합니다.
- AlloyDB Omni에 인증 토큰인 JSON 웹 토큰 (JWT) 파일을 읽을 수 있는 권한이 있는지 확인합니다.
-
선택사항: OpenShift에 TDE 지원 클러스터를 배포하려면 데이터베이스 클러스터를 실행하는
DBCluster서비스 계정에hostmount-anyuid보안 컨텍스트 제약조건 (SCC)을 부여합니다.oc adm policy add-scc-to-user hostmount-anyuid -z DBCLUSTER_NAME-sa -n DBCLUSTER_NAMESPACE
DBCLUSTER_NAME을
DBCluster의 이름으로 바꾸고 DBCLUSTER_NAMESPACE를DBCluster리소스를 만들려는 네임스페이스로 바꿉니다.
Thales CipherTrust KMS
- 보안 비밀 키 암호화 키 (KEK)가 생성되고 내보낼 수 있도록 Thales CipherTrust Manager를 구성합니다.
- KEK 보안 비밀을 인증하고 내보낼 수 있는 권한이 있는 CipherTrust Manager 사용자 계정 (
username및password)이 있는지 확인합니다. -
선택사항: OpenShift에 TDE 지원 클러스터를 배포하려면 데이터베이스 클러스터를 실행하는
DBCluster서비스 계정에hostmount-anyuid보안 컨텍스트 제약조건 (SCC)을 부여합니다.oc adm policy add-scc-to-user hostmount-anyuid -z DBCLUSTER_NAME-sa -n DBCLUSTER_NAMESPACE
DBCLUSTER_NAME을
DBCluster의 이름으로 바꾸고 DBCLUSTER_NAMESPACE를DBCluster리소스를 만들려는 네임스페이스로 바꿉니다.
KMS 액세스 구성
KEK 경로와 KMS 인증 사용자 인증 정보가 포함된 Kubernetes ConfigMap 및 Secret 리소스를 만듭니다. DBCluster를 배포하려는 동일한 네임스페이스에서 이러한 리소스를 만들어야 합니다.
HashiCorp Vault KMS
KEK URL과 JWT 토큰의 호스트 경로가 포함된 ConfigMap 리소스를 만듭니다.
apiVersion: v1 kind: ConfigMap metadata: name: CONFIG_MAP_NAME data: kek_url: "KEK_URL" token_path: "JWT_TOKEN_PATH"
다음을 바꿉니다.
CONFIG_MAP_NAME: ConfigMap의 이름입니다.kek_url및token_path에 정의된 값은TdeConfig리소스 정의에 사용됩니다.KEK_URL: HashiCorp Vault의 KEK에 대한 정규화된 URL입니다.vault를 프로토콜로 사용하여 HashiCorp Vault를 KMS 제공업체로 지정합니다(예:vault://vault.default.svc:8200/v1/secret/data/alloydb_kek).JWT_TOKEN_PATH: 노드의 JWT 토큰 경로입니다(예:/tmp/token). JWT 토큰 액세스 경로는 클러스터의 모든 노드에서 일관되어야 합니다.
Thales CipherTrust KMS
KEK URL이 포함된 ConfigMap 리소스와 Thales CipherTrust Manager 인증 사용자 인증 정보가 포함된 Secret 리소스를 만듭니다.
apiVersion: v1 kind: ConfigMap metadata: name: CONFIG_MAP_NAME data: kek_url: "KEK_URL" --- apiVersion: v1 kind: Secret metadata: name: CREDENTIALS_SECRET_NAME type: Opaque stringData: username: "CIPHERTRUST_USERNAME" password: "CIPHERTRUST_PASSWORD"
다음을 바꿉니다.
CONFIG_MAP_NAME: ConfigMap의 이름입니다.kek_url에 정의된 값은TdeConfig리소스 정의에 사용됩니다.KEK_URL: Thales CipherTrust Manager의 KEK에 대한 정규화된 URL입니다.ciphertrust를 프로토콜로 사용하여 Thales CipherTrust Manager를 KMS 제공업체로 지정합니다(예:ciphertrust://ciphertrust.default.svc:443/api/v1/vault/secrets/alloydb_kek).CREDENTIALS_SECRET_NAME: CipherTrust Manager 사용자 인증 정보를 저장하는 Kubernetes 보안 비밀의 이름입니다(예:ciphertrust-credentials).CIPHERTRUST_USERNAME: Thales CipherTrust Manager로 인증하는 데 사용되는 사용자 이름입니다.CIPHERTRUST_PASSWORD: Thales CipherTrust Manager 사용자의 비밀번호입니다.
TLS 보안 비밀 만들기
KMS 서버 연결 (HashiCorp Vault 또는 Thales CipherTrust Manager)을 확인하기 위한 인증서를 저장하는 TLS 보안 비밀을 만들려면 다음 명령어를 실행합니다.
kubectl create secret tls TLS_SECRET_NAME \
--cert=CLIENT_CERT_FILE \
--key=CLIENT_KEY_FILE
kubectl patch secret TLS_SECRET_NAME \
-p '{"data":{"ca.crt":"'$(base64 -w 0 CA_CERT_FILE)'"}}' \
--type=merge
다음을 바꿉니다.
TLS_SECRET_NAME: TLS 보안 비밀의 이름입니다 (예:vault-secret또는ciphertrust-tls-secret).TdeConfig커스텀 리소스를 만들 때 이 보안 비밀 이름을 사용합니다.CLIENT_CERT_FILE: 클라이언트 TLS 인증서 파일의 경로입니다 (보안 비밀에tls.crt로 저장됨).CLIENT_KEY_FILE: 클라이언트 TLS 비공개 키 파일의 경로입니다 (보안 비밀에tls.key로 저장됨).CA_CERT_FILE: KMS 서버 인증서를 확인하는 데 사용되는 인증 기관(CA) 인증서 파일의 경로입니다 (보안 비밀에ca.crt로 저장됨).
TdeConfig 커스텀 리소스 만들기
AlloyDB Omni가 외부 KMS 제공업체와 통신하여 KEK를 검색하는 방법을 정의하는 TdeConfig 리소스를 만듭니다. TdeConfig 리소스는 DBCluster 리소스와 동일한 네임스페이스에 만들어야 합니다.
데이터베이스 포드에서 네트워크를 통해 KMS 인스턴스에 연결할 수 있는지 확인합니다.
HashiCorp Vault KMS
호스트 노드의 JWT 토큰 경로에 postgres 사용자가 액세스할 수 있는지 확인합니다. TdeConfig 리소스의 매니페스트를 만들고 적용합니다.
apiVersion: alloydbomni.dbadmin.goog/v1 kind: TdeConfig metadata: name: TDE_CONFIG_NAME spec: kekUrlRef: name: CONFIG_MAP_NAME key: kek_url kmsProvider: vault: authType: "jwt" authMount: "JWT_AUTH_MOUNT_PATH" jwt: pathRef: name: "CONFIG_MAP_NAME" key: "token_path" role: "VAULT_ROLE" tls: certSecret: name: "TLS_SECRET_NAME"
다음을 바꿉니다.
TDE_CONFIG_NAME:TdeConfig리소스의 이름입니다.CONFIG_MAP_NAME: 이전 단계에서 만든 ConfigMap의 이름입니다.JWT_AUTH_MOUNT_PATH: 구성에 따라 HashiCorp Vault 내에서 인증 엔진이 마운트되는 경로입니다(예:auth/kms).- 선택사항:
VAULT_ROLE: Vault 설정에 정의된 클라이언트 역할입니다. 클라이언트 역할은 JWT를 검증하고 HashiCorp Vault 내에서 역할에 부여된 특정 액세스 권한과 ID를 반영합니다. TLS_SECRET_NAME: Vault 연결의 TLS 인증서가 포함된 보안 비밀의 이름입니다(예:vault-secret).
Thales CipherTrust KMS
ciphertrust 제공업체를 사용하여 TdeConfig 리소스의 매니페스트를 만들고 적용합니다.
apiVersion: alloydbomni.dbadmin.goog/v1 kind: TdeConfig metadata: name: TDE_CONFIG_NAME spec: kekUrlRef: name: CONFIG_MAP_NAME key: kek_url kmsProvider: ciphertrust: authType: "password" credentialsSecretRef: name: "CREDENTIALS_SECRET_NAME" tls: certSecret: name: "TLS_SECRET_NAME"
다음을 바꿉니다.
TDE_CONFIG_NAME:TdeConfig리소스의 이름입니다.CONFIG_MAP_NAME:kek_url이 포함된 ConfigMap의 이름입니다.CREDENTIALS_SECRET_NAME: CipherTrust Managerusername및password키가 포함된 Kubernetes 보안 비밀의 이름입니다(예:ciphertrust-credentials).TLS_SECRET_NAME: CipherTrust Manager 연결의 TLS 인증서가 포함된 보안 비밀의 이름입니다(예:ciphertrust-tls-secret).
DBCluster 배포
TdeConfig리소스를 참조하는DBCluster리소스를 만드는 매니페스트를 만들고 적용합니다. 데이터베이스 클러스터 만들기에 대한 자세한 내용은 데이터베이스 클러스터 만들기를 참조하세요.apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: "DBCLUSTER_NAME" spec: databaseVersion: "18.4.0" primarySpec: features: transparentDataEncryption: tdeConfigRef: name: "TDE_CONFIG_NAME" [...]TDE_CONFIG_NAME을TdeConfig리소스의 이름으로 바꾸고DBCLUSTER_NAME을 만들려는DBCluster의 이름으로 바꿉니다.선택사항: OpenShift 환경에
DBCluster를 배포하는 경우hostmount-anyuid주석으로DBCluster리소스에 주석을 추가해야 합니다.kubectl annotate dbclusters.alloydbomni.dbadmin.goog DBCLUSTER_NAME -n DBCLUSTER_NAMESPACE openshift.io/scc=anyuidDBCLUSTER_NAME을DBCluster리소스의 이름으로 바꾸고DBCLUSTER_NAMESPACE를DBCluster리소스를 만들려는 네임스페이스 로 바꿉니다.
SSD로 유출된 열 형식 캐시에 TDE를 사용 설정하려면 다음과 같이 DBCluster를 패치합니다.
kubectl patch dbcluster DBCLUSTER_NAME \
-n DBCLUSTER_NAMESPACE \
-p '{"spec":{"primarySpec":{"parameters": {"google_columnar_engine.enable_tde_for_storage_cache": "on"}}}}' \
--type=merge
TDE 측정항목 참조
AlloyDB Omni의 모니터링 에이전트에서 모든 TDE 측정항목을 볼 수 있습니다. 다음 표에서는 각 측정항목을 설명합니다.
| 이름 | 설명 | 라벨 | 단위 | 유형 |
|---|---|---|---|---|
alloydb_omni_database_tde_data_blocks_decrypted_count_total |
복호화된 데이터 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_data_blocks_encrypted_count_total |
암호화된 데이터 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_data_decryption_time_us_total |
데이터 블록 복호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
alloydb_omni_database_tde_data_encryption_time_us_total |
데이터 블록 암호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
alloydb_omni_database_tde_enabled |
TDE 사용 설정 상태입니다. | 해당 없음 | gauge | |
alloydb_omni_database_tde_kek_info |
TDE KEK 정보입니다. |
|
gauge | |
alloydb_omni_database_tde_temp_blocks_decrypted_count_total |
복호화된 임시 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_temp_blocks_encrypted_count_total |
암호화된 임시 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_temp_decryption_time_us_total |
임시 블록 복호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
alloydb_omni_database_tde_temp_encryption_time_us_total |
임시 블록 암호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
alloydb_omni_database_tde_wal_blocks_decrypted_count_total |
복호화된 WAL 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_wal_blocks_encrypted_count_total |
암호화된 WAL 블록 수입니다. | 해당 없음 | counter | |
alloydb_omni_database_tde_wal_decryption_time_us_total |
WAL 블록 복호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
alloydb_omni_database_tde_wal_encryption_time_us_total |
WAL 블록 암호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
tde_chill_cache_blocks_encrypted |
암호화된 chill 캐시 블록 수입니다. | 해당 없음 | counter | |
tde_chill_cache_blocks_decrypted |
복호화된 chill 캐시 블록 수입니다. | 해당 없음 | counter | |
tde_chill_cache_blocks_total_encryption_time_us |
chill 캐시 블록 암호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
tde_chill_cache_blocks_total_decryption_time_us |
chill 캐시 블록 복호화에 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
tde_ce_cache_ssd_blocks_encrypted |
암호화된 SSD 스토리지로 유출된 열 형식 캐시 블록 수입니다. | 해당 없음 | counter | |
tde_ce_cache_ssd_blocks_decrypted |
복호화된 SSD 스토리지로 유출된 열 형식 캐시 블록 수입니다. | 해당 없음 | counter | |
tde_ce_cache_ssd_blocks_total_encryption_time_us |
SSD 스토리지로 유출된 열 형식 캐시 블록을 암호화하는 데 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |
tde_ce_cache_ssd_blocks_total_decryption_time_us |
SSD 스토리지로 유출된 열 형식 캐시 블록을 복호화하는 데 소비한 총 시간입니다. | 해당 없음 | 마이크로초 | counter |