From 71fe73a9c5a45df600967099cb4f4a6d7b4ce91e Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 4 Mar 2026 11:34:28 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/gcp-security/gcp-services/gcp-kms- --- .../gcp-kms-post-exploitation.md | 40 ++++++++---- .../gcp-security/gcp-services/gcp-kms-enum.md | 63 +++++++++++-------- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index 4cae99722..67fa9f0e7 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -1,4 +1,4 @@ -# GCP - KMS Post Exploitation +# GCP - KMS 사후 침해 활동 {{#include ../../../banners/hacktricks-training.md}} @@ -12,11 +12,11 @@ KMS에 대한 기본 정보는 다음을 참조하세요: ### `cloudkms.cryptoKeyVersions.destroy` -이 권한을 가진 공격자는 KMS 버전을 파괴할 수 있습니다. 이를 수행하려면 먼저 키를 비활성화한 다음 파괴해야 합니다: +이 권한을 가진 공격자는 KMS 버전을 파기(destroy)할 수 있습니다. 이를 수행하려면 먼저 키를 비활성화(disable)한 다음 파기해야 합니다:
-Disable and destroy key version (Python) +키 버전 비활성화 및 파기 (Python) ```python # pip install google-cloud-kms @@ -65,20 +65,34 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version) ### KMS Ransomware -AWS에서는 KMS resource policy를 수정하고 공격자 계정만 키를 사용하도록 허용함으로써 완전히 **steal a KMS key** 하는 것이 가능합니다. 이러한 resource policies가 GCP에는 존재하지 않기 때문에 이는 불가능합니다. +AWS에서는 KMS resource policy를 수정해 공격자 계정만 해당 키를 사용하도록 허용함으로써 **steal a KMS key**가 가능합니다. 이러한 리소스 정책은 GCP에 존재하지 않기 때문에 이는 불가능합니다. -그러나 전역적인 KMS Ransomware를 수행하는 또 다른 방법이 있으며, 다음 단계들을 포함합니다: +그러나 전역적인 KMS Ransomware를 수행할 수 있는 다른 방법이 있으며, 이는 다음 단계들을 포함합니다: -- 공격자가 가져온 **version of the key with a key material**의 새 버전을 생성 +- 공격자가 가져온 **version of the key with a key material**을 생성 ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- **기본 버전으로 설정** (향후 암호화될 데이터용) -- **이전 버전으로 암호화된 기존 데이터를 새로운 버전으로 재암호화** -- **KMS 키 삭제** -- 이제 원래의 키 자료를 가진 공격자만 암호화된 데이터를 복호화할 수 있습니다 +- 앞으로 암호화될 데이터를 위해 **default version**으로 설정합니다. +- 이전 버전으로 암호화된 데이터를 **Re-encrypt older data**하여 새 버전으로 다시 암호화합니다. +- **Delete the KMS key** +- 이제 원본 키 재료를 가진 attacker만 암호화된 데이터를 복호화할 수 있습니다. -#### 새 버전을 가져오고 이전 데이터를 비활성화/삭제하는 단계는 다음과 같습니다: +#### Cloud Storage + CMEK 권한 모델 + +When objects in Cloud Storage are encrypted with CMEK, the decrypt/encrypt calls to KMS are done by the project's **Cloud Storage service agent whose email is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, not directly by the end user reading the object. + +This means that to read something encrypted by a CMEK: + +- The project's Cloud Storage service agent must have KMS permissions over the used KMS key (typically `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- The user only needs object read permissions (for example `storage.objects.get`). 사용자는 KMS 키에 대한 권한이 필요하지 않습니다. + +즉, KMS 키로 암호화된 데이터에 대한 접근을 제어하려면 프로젝트의 Cloud Storage service agent에게 KMS 권한을 추가/제거해야 합니다. + +Note that there is a project-level binding like `roles/cloudkms.cryptoKeyEncrypterDecrypter` for the Storage service agent will still allow decrypt with the keys in the same project. + + +#### Here are the steps to import a new version and disable/delete the older data:
@@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key print('Verified:', verified) ``` ### `cloudkms.cryptoKeyVersions.restore` -`cloudkms.cryptoKeyVersions.restore` 권한은 아이덴티티가 이전에 파기 예정으로 설정되었거나 비활성화된 Cloud KMS의 키 버전을 복원하여 활성화되고 사용 가능한 상태로 되돌릴 수 있게 합니다. +`cloudkms.cryptoKeyVersions.restore` 권한은 주체가 이전에 파기 대상으로 예약되었거나 Cloud KMS에서 비활성화된 키 버전을 복원하여 활성 및 사용 가능한 상태로 되돌릴 수 있게 합니다. ```bash gcloud kms keys versions restore \ --key= \ @@ -280,7 +294,7 @@ gcloud kms keys versions restore \ --project= ``` ### `cloudkms.cryptoKeyVersions.update` -`cloudkms.cryptoKeyVersions.update` 권한은 Cloud KMS의 특정 키 버전 속성이나 상태(예: 활성화 또는 비활성화)를 주체가 수정할 수 있도록 허용합니다. +`cloudkms.cryptoKeyVersions.update` 권한은 주체가 Cloud KMS의 특정 키 버전의 속성 또는 상태를 수정할 수 있도록 허용합니다. 예를 들어 활성화하거나 비활성화할 수 있습니다. ```bash # Disable key gcloud kms keys versions disable \ diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md index 9aa5481eb..dbb9e9fb9 100644 --- a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md @@ -4,40 +4,53 @@ ## KMS -[**클라우드 키 관리 서비스**](https://cloud.google.com/kms/docs/)는 **암호화 키**를 안전하게 저장하는 역할을 하며, 이는 **민감한 데이터의 암호화 및 복호화**와 같은 작업에 필수적입니다. 이러한 키는 키 링 내에서 조직되어 구조화된 관리를 가능하게 합니다. 또한, 접근 제어는 개별 키 수준 또는 전체 키 링에 대해 세밀하게 구성할 수 있어, 권한이 보안 요구 사항에 정확히 맞춰지도록 보장합니다. +[**Cloud Key Management Service**](https://cloud.google.com/kms/docs/)는 **암호화 키**를 안전하게 저장하는 역할을 하며, 이는 **민감한 데이터를 암호화하고 복호화하는** 작업에 필수적입니다. 이러한 키들은 키 링(key rings) 안에 조직되어 구조화된 관리를 가능하게 합니다. 또한 액세스 제어는 개별 키 수준이나 전체 키 링 수준에서 세밀하게 구성할 수 있어 권한을 보안 요구사항에 맞게 정확히 조정할 수 있습니다. -KMS 키 링은 **기본적으로 글로벌**로 생성되며, 이는 해당 키 링 내의 키가 모든 지역에서 접근 가능함을 의미합니다. 그러나 **특정 지역**에 특정 키 링을 생성하는 것도 가능합니다. +KMS 키 링은 **기본적으로 전역(global)으로 생성**되므로 해당 키 링 안의 키들은 어떤 리전에서도 접근할 수 있습니다. 다만, 특정 리전에 키 링을 생성하는 것도 가능합니다. -### 키 보호 수준 +### Key Protection Level -- **소프트웨어 키**: 소프트웨어 키는 **KMS에 의해 완전히 소프트웨어로 생성 및 관리**됩니다. 이러한 키는 **하드웨어 보안 모듈(HSM)**에 의해 보호되지 않으며, **테스트 및 개발 목적으로** 사용될 수 있습니다. 소프트웨어 키는 보안이 낮고 공격에 취약하기 때문에 **생산** 용도로는 권장되지 않습니다. -- **클라우드 호스팅 키**: 클라우드 호스팅 키는 **KMS에 의해 클라우드에서 생성 및 관리**되며, 고가용성 및 신뢰할 수 있는 인프라를 사용합니다. 이러한 키는 **HSM에 의해 보호**되지만, HSM은 **특정 고객에 전용되지 않습니다**. 클라우드 호스팅 키는 대부분의 생산 사용 사례에 적합합니다. -- **외부 키**: 외부 키는 **KMS 외부에서 생성 및 관리**되며, 암호화 작업에 사용하기 위해 KMS로 가져옵니다. 외부 키는 **고객의 선호에 따라 하드웨어 보안 모듈(HSM) 또는 소프트웨어 라이브러리에 저장될 수 있습니다**. +- **Software keys**: 소프트웨어 키는 **KMS에 의해 완전히 소프트웨어로 생성되고 관리**됩니다. 이 키들은 **어떠한 hardware security module (HSM)로도 보호되지 않으며**, 주로 **테스트 및 개발 목적**으로 사용됩니다. 소프트웨어 키는 보안 수준이 낮아 공격에 취약하므로 프로덕션에서는 권장되지 않습니다. +- **Cloud-hosted keys**: 클라우드 호스팅 키는 **KMS에 의해 클라우드에서 생성되고 관리**되며 고가용성과 신뢰성 있는 인프라를 사용합니다. 이 키들은 **HSM으로 보호되지만 HSM은 특정 고객에게 전용되지 않습니다**. 대부분의 프로덕션 사용 사례에 적합합니다. +- **External keys**: 외부 키는 **KMS 외부에서 생성 및 관리**되며 KMS로 가져와 암호화 작업에 사용됩니다. 외부 키는 **고객의 선택에 따라 HSM이나 소프트웨어 라이브러리에 저장될 수 있습니다**. -### 키 용도 +### Key Purposes -- **대칭 암호화/복호화**: **단일 키를 사용하여 데이터를 암호화하고 복호화하는 데 사용**됩니다. 대칭 키는 대량의 데이터를 암호화하고 복호화하는 데 빠르고 효율적입니다. -- **지원됨**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) -- **비대칭 서명**: 키를 공유하지 않고 두 당사자 간의 안전한 통신에 사용됩니다. 비대칭 키는 **공개 키와 개인 키**로 구성된 쌍으로 제공됩니다. 공개 키는 다른 사람과 공유되며, 개인 키는 비밀로 유지됩니다. -- **지원됨:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **비대칭 복호화**: 메시지 또는 데이터의 진위를 확인하는 데 사용됩니다. 디지털 서명은 개인 키를 사용하여 생성되며, 해당 공개 키를 사용하여 검증할 수 있습니다. -- **지원됨:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **MAC 서명**: **비밀 키를 사용하여 메시지 인증 코드(MAC)를 생성함으로써 데이터 무결성과 진위를 보장하는 데 사용**됩니다. HMAC는 네트워크 프로토콜 및 소프트웨어 애플리케이션에서 메시지 인증에 일반적으로 사용됩니다. -- **지원됨:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) +- **Symmetric encryption/decryption**: 단일 키로 암호화와 복호화를 모두 수행하는 데 사용됩니다. 대칭 키는 대량의 데이터를 암호화/복호화하는 데 빠르고 효율적입니다. +- **Supported**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) +- **Asymmetric Signing**: 키를 공유하지 않고 두 당사자 간의 안전한 통신을 위해 사용됩니다. 비대칭 키는 **공개키와 개인키** 한 쌍으로 구성되며, 공개키는 공유하고 개인키는 비밀로 유지합니다. +- **Supported:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **Asymmetric Decryption**: 메시지나 데이터의 진위 확인에 사용됩니다. 디지털 서명은 개인키로 생성되고 해당 공개키로 검증할 수 있습니다. +- **Supported:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **MAC Signing**: **비밀 키를 사용해 메시지 인증 코드(MAC)를 생성함으로써 데이터 무결성과 진위를 보장**하는 데 사용됩니다. 네트워크 프로토콜과 소프트웨어 애플리케이션에서 메시지 인증을 위해 HMAC이 흔히 사용됩니다. +- **Supported:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) -### 회전 주기 및 파기 예정 기간 +### Rotation Period & Programmed for destruction period -**기본적으로** 각 **90일**이지만, **쉽게** 및 **완전히 사용자 정의할 수 있습니다.** +기본적으로 회전 주기는 **90일**이며, 이는 **쉽게 완전하게 커스터마이즈**할 수 있습니다. -"파기 예정" 기간은 **사용자가 키 삭제를 요청한 시점부터 키가 삭제될 때까지의 시간**입니다. 키가 생성된 후에는 변경할 수 없습니다(기본 1일). +"Programmed for destruction" 기간은 사용자가 키 삭제를 요청한 시점부터 키가 실제로 삭제될 때까지의 **기간**을 의미합니다. 이 기간은 키가 생성된 이후에는 변경할 수 없으며 기본값은 1일입니다. -### 기본 버전 +### Primary Version -각 KMS 키는 여러 버전을 가질 수 있으며, 그 중 하나는 **기본** 버전이어야 하며, 이는 **KMS 키와 상호작용할 때 버전이 지정되지 않을 경우 사용됩니다**. +각 KMS 키는 여러 버전을 가질 수 있으며, 그중 하나는 반드시 **기본(default) 버전**으로 설정됩니다. KMS 키와 상호작용할 때 버전이 명시되지 않으면 이 기본 버전이 사용됩니다. -### 열거 +### CMEK permission model -**키를 나열할 수 있는 권한이 있는 경우** 다음과 같이 접근할 수 있습니다: +Cloud Storage의 객체가 CMEK로 암호화된 경우, KMS에 대한 암/복호화 호출은 객체를 읽는 최종 사용자가 직접 수행하는 것이 아니라 프로젝트의 Cloud Storage 서비스 에이전트(이메일: service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)가 대신 수행합니다. + +이는 CMEK로 암호화된 데이터를 읽으려면 다음이 필요함을 의미합니다: + +- 프로젝트의 Cloud Storage 서비스 에이전트는 사용된 KMS 키에 대한 KMS 권한을 가지고 있어야 합니다(일반적으로 `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- 사용자는 객체 읽기 권한(예: `storage.objects.get`)만 필요합니다. KMS 키에 대한 권한은 필요하지 않습니다. + +즉, KMS 키로 암호화된 데이터에 대한 접근을 제어하려면 프로젝트의 Cloud Storage 서비스 에이전트에 대한 KMS 권한을 추가/제거해야 합니다. + +프로젝트 수준에서 Storage 서비스 에이전트에 대해 `roles/cloudkms.cryptoKeyEncrypterDecrypter`와 같은 바인딩이 있으면 동일한 프로젝트의 키로 복호화가 허용된다는 점에 유의하세요. + +### Enumeration + +키를 **나열(list)할 수 있는 권한**이 있다면, 다음과 같이 접근할 수 있습니다: ```bash # List the global keyrings available gcloud kms keyrings list --location global @@ -61,19 +74,19 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \ --keyring [KEYRING] \ --location global ``` -### 권한 상승 +### Privilege Escalation {{#ref}} ../gcp-privilege-escalation/gcp-kms-privesc.md {{#endref}} -### 포스트 익스플로잇 +### Post Exploitation {{#ref}} ../gcp-post-exploitation/gcp-kms-post-exploitation.md {{#endref}} -## 참고 문헌 +## 참고자료 - [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging)