mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-
This commit is contained in:
@@ -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)한 다음 파기해야 합니다:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Disable and destroy key version (Python)</summary>
|
||||
<summary>키 버전 비활성화 및 파기 (Python)</summary>
|
||||
```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:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -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 <VERSION_ID> \
|
||||
--key=<KEY_NAME> \
|
||||
@@ -280,7 +294,7 @@ gcloud kms keys versions restore <VERSION_ID> \
|
||||
--project=<PROJECT_ID>
|
||||
```
|
||||
### `cloudkms.cryptoKeyVersions.update`
|
||||
`cloudkms.cryptoKeyVersions.update` 권한은 Cloud KMS의 특정 키 버전 속성이나 상태(예: 활성화 또는 비활성화)를 주체가 수정할 수 있도록 허용합니다.
|
||||
`cloudkms.cryptoKeyVersions.update` 권한은 주체가 Cloud KMS의 특정 키 버전의 속성 또는 상태를 수정할 수 있도록 허용합니다. 예를 들어 활성화하거나 비활성화할 수 있습니다.
|
||||
```bash
|
||||
# Disable key
|
||||
gcloud kms keys versions disable <VERSION_ID> \
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user