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:
@@ -4,7 +4,7 @@
|
||||
|
||||
## KMS
|
||||
|
||||
KMS に関する基本情報は次を参照してください:
|
||||
KMS に関する基本情報は次を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-kms-enum.md
|
||||
@@ -12,11 +12,11 @@ KMS に関する基本情報は次を参照してください:
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.destroy`
|
||||
|
||||
この権限を持つ攻撃者は KMS バージョンを破棄できます。そのためにはまずキーを無効化し、続けて破棄する必要があります:
|
||||
この権限を持つ攻撃者は KMS のバージョンを破棄できます。これを行うには、まずキーを無効化し、その後破棄する必要があります:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>キーの無効化と破棄(Python)</summary>
|
||||
<summary>キー バージョンを無効化して破棄する (Python)</summary>
|
||||
```python
|
||||
# pip install google-cloud-kms
|
||||
|
||||
@@ -65,24 +65,38 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
|
||||
|
||||
### KMS Ransomware
|
||||
|
||||
AWSでは、KMS resource policyを変更して攻撃者のアカウントのみがそのキーを使用できるようにすることで、**KMS key**を完全に盗むことが可能です。GCPにはこれらのresource policiesが存在しないため、これは不可能です。
|
||||
AWS では、KMS のリソースポリシーを変更して攻撃者のアカウントだけがキーを使用できるようにすることで、**KMS key を完全に盗む**ことが可能です。GCP にはこれらのリソースポリシーが存在しないため、これは不可能です。
|
||||
|
||||
しかし、global KMS Ransomwareを実行する別の方法があり、これは以下の手順を含みます:
|
||||
しかし、グローバルな KMS Ransomware を実行する別の方法があり、以下の手順を含みます:
|
||||
|
||||
- 攻撃者がインポートした**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** として設定する
|
||||
- 前のバージョンで暗号化された古いデータを **新しいバージョンで再暗号化** する
|
||||
- **KMS key を削除する**
|
||||
- これにより、元の鍵素材を持つ攻撃者だけが暗号化されたデータを復号できるようになる
|
||||
|
||||
#### 新しいバージョンをインポートし、古いデータを無効化/削除する手順は以下の通り:
|
||||
#### Cloud Storage + CMEK 権限モデル
|
||||
|
||||
Cloud Storage のオブジェクトが CMEK で暗号化されている場合、KMS への復号/暗号化の呼び出しはオブジェクトを読むエンドユーザーによって直接行われるのではなく、プロジェクトの **Cloud Storage service agent(email は service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com))** によって行われます。
|
||||
|
||||
つまり、CMEK で暗号化されたものを読むためには:
|
||||
|
||||
- プロジェクトの Cloud Storage service agent が、使用されている KMS key に対して KMS 権限を持っている必要がある(通常は `roles/cloudkms.cryptoKeyEncrypterDecrypter`)。
|
||||
- ユーザーはオブジェクトの読み取り権限(例:`storage.objects.get`)だけが必要で、KMS key に対する権限は不要である。
|
||||
|
||||
つまり、KMS key を使って暗号化データへのアクセスを制御するには、プロジェクトの Cloud Storage service agent に対する KMS 権限を追加/削除する必要があります。
|
||||
|
||||
プロジェクトレベルで Storage service agent に対して `roles/cloudkms.cryptoKeyEncrypterDecrypter` のようなバインディングがある場合、同じプロジェクト内のキーでの復号は引き続き許可される点に注意してください。
|
||||
|
||||
|
||||
#### Here are the steps to import a new version and disable/delete the older data:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>新しいキーのバージョンをインポートして古いバージョンを削除</summary>
|
||||
<summary>新しいキー バージョンをインポートして古いバージョンを削除する</summary>
|
||||
```bash
|
||||
# Encrypt something with the original key
|
||||
echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt
|
||||
@@ -162,7 +176,7 @@ gcloud kms keys versions destroy \
|
||||
|
||||
<details>
|
||||
|
||||
<summary>対称鍵でデータを暗号化する (Python)</summary>
|
||||
<summary>対称キーでデータを暗号化する (Python)</summary>
|
||||
```python
|
||||
from google.cloud import kms
|
||||
import base64
|
||||
@@ -203,7 +217,7 @@ print('Ciphertext:', ciphertext)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>非対称鍵でメッセージに署名 (Python)</summary>
|
||||
<summary>非対称鍵でメッセージに署名する (Python)</summary>
|
||||
```python
|
||||
import hashlib
|
||||
from google.cloud import kms
|
||||
@@ -243,7 +257,7 @@ print('Signature:', signature)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>非対称キーで署名を検証する (Python)</summary>
|
||||
<summary>非対称鍵で署名を検証する (Python)</summary>
|
||||
```python
|
||||
from google.cloud import kms
|
||||
import hashlib
|
||||
@@ -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` permission は、以前に破壊予定に設定されていたか無効化されていたキー バージョンを 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> \
|
||||
|
||||
@@ -1,43 +1,56 @@
|
||||
# GCP - KMS Enum
|
||||
# GCP - KMS 列挙
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## KMS
|
||||
|
||||
[**Cloud Key Management Service**](https://cloud.google.com/kms/docs/)は、**暗号鍵**の安全なストレージとして機能し、**機密データの暗号化および復号化**などの操作に不可欠です。これらの鍵はキーリング内に整理され、構造的な管理が可能です。さらに、アクセス制御は個々の鍵レベルまたは全体のキーリングに対して詳細に設定でき、権限がセキュリティ要件に正確に一致するようにします。
|
||||
The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) は、**暗号鍵**の安全な格納場所として機能し、**機密データの暗号化や復号化**などの操作に不可欠です。これらの鍵はキーリング (key rings) 内に整理され、構造化された管理が可能です。さらに、アクセス制御は個々の鍵レベルまたはキーリング全体で細かく設定でき、権限をセキュリティ要件に応じて厳密に調整できます。
|
||||
|
||||
KMSキーリングは**デフォルトでグローバル**に作成されるため、そのキーリング内の鍵は任意のリージョンからアクセス可能です。ただし、**特定のリージョン**に特定のキーリングを作成することも可能です。
|
||||
KMS の key rings は**デフォルトで global として作成されます**。つまり、そのキーリング内の鍵は任意のリージョンからアクセス可能です。ただし、特定のリージョンにキーリングを作成することも可能です。
|
||||
|
||||
### Key Protection Level
|
||||
|
||||
- **Software keys**: ソフトウェアキーは**KMSによって完全にソフトウェアで作成および管理**されます。これらの鍵は**ハードウェアセキュリティモジュール(HSM)によって保護されておらず**、**テストおよび開発目的**で使用できます。ソフトウェアキーは**本番環境**での使用は推奨されません。なぜなら、セキュリティが低く、攻撃に対して脆弱だからです。
|
||||
- **Cloud-hosted keys**: クラウドホストされた鍵は、**KMSによってクラウド内で作成および管理**され、高可用性で信頼性の高いインフラストラクチャを使用します。これらの鍵は**HSMによって保護されていますが**、HSMは**特定の顧客に専用ではありません**。クラウドホストされた鍵は、ほとんどの本番使用ケースに適しています。
|
||||
- **External keys**: 外部鍵は**KMSの外部で作成および管理**され、暗号操作に使用するためにKMSにインポートされます。外部鍵は**顧客の好みに応じてハードウェアセキュリティモジュール(HSM)またはソフトウェアライブラリに保存できます**。
|
||||
- **ソフトウェアキー (Software keys)**: ソフトウェアキーは **KMS によって完全にソフトウェア上で作成および管理されます**。これらの鍵は **HSM によって保護されていません**。テストや開発目的での使用に適していますが、セキュリティが低く攻撃を受けやすいため、**本番環境には推奨されません**。
|
||||
- **Cloud-hosted keys**: Cloud-hosted keys は **KMS によってクラウド上で作成および管理され**、高可用かつ信頼性の高いインフラ上で動作します。これらの鍵は **HSM によって保護されています** が、HSM は **特定の顧客に専有されるものではありません**。Cloud-hosted keys はほとんどの本番ユースケースに適しています。
|
||||
- **External keys**: External keys は **KMS の外部で作成および管理され**、暗号操作のために KMS にインポートされます。External keys は **顧客の選択に応じて HSM またはソフトウェアライブラリに格納できます**。
|
||||
|
||||
### Key Purposes
|
||||
|
||||
- **Symmetric encryption/decryption**: **単一の鍵を使用してデータを暗号化および復号化するために使用**されます。対称鍵は、大量のデータを暗号化および復号化するのに高速で効率的です。
|
||||
- **対称暗号化/復号 (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**: 鍵を共有せずに二者間の安全な通信に使用されます。非対称鍵は、**公開鍵と秘密鍵**のペアで構成されます。公開鍵は他者と共有され、秘密鍵は秘密に保たれます。
|
||||
- **非対称署名 (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**: メッセージまたはデータの真正性を確認するために使用されます。デジタル署名は秘密鍵を使用して作成され、対応する公開鍵を使用して検証できます。
|
||||
- **非対称復号 (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は、ネットワークプロトコルやソフトウェアアプリケーションでメッセージ認証に一般的に使用されます。
|
||||
- **MAC 署名 (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鍵は複数のバージョンを持つことができ、そのうちの1つは**デフォルト**のものでなければなりません。これは、**KMS鍵と対話する際にバージョンが指定されていない場合に使用されるもの**です。
|
||||
各 KMS 鍵は複数のバージョンを持つことができ、そのうちの一つが **デフォルト(primary)** になります。バージョンを指定せずに KMS 鍵とやり取りする場合は、このデフォルトバージョンが使用されます。
|
||||
|
||||
### CMEK permission model
|
||||
|
||||
Cloud Storage のオブジェクトが CMEK で暗号化されている場合、KMS への復号/暗号化呼び出しはエンドユーザーではなく、プロジェクトの **Cloud Storage service agent(service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)** によって行われます。
|
||||
|
||||
これは、CMEK で暗号化されたオブジェクトを読み取るために必要な条件が次のようになることを意味します:
|
||||
|
||||
- プロジェクトの Cloud Storage service agent が使用されている KMS 鍵に対する KMS 権限(通常は `roles/cloudkms.cryptoKeyEncrypterDecrypter`)を持っていること。
|
||||
- ユーザーはオブジェクトの読み取り権限(例: `storage.objects.get`)のみを必要とし、KMS 鍵に対する権限は不要であること。
|
||||
|
||||
つまり、KMS 鍵で暗号化されたデータへのアクセスを制御するには、プロジェクトの Cloud Storage service agent に対する KMS 権限を追加/削除する必要があります。
|
||||
|
||||
注意:`roles/cloudkms.cryptoKeyEncrypterDecrypter` のようなプロジェクトレベルのバインディングが Storage service agent に対してある場合でも、同一プロジェクト内の鍵での復号は引き続き許可されます。
|
||||
|
||||
### Enumeration
|
||||
|
||||
**鍵をリストする権限がある場合**、これがそれらにアクセスする方法です:
|
||||
鍵を列挙する権限を持っている場合、鍵へアクセスする方法は次のとおりです:
|
||||
```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