mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 14:13:20 -08:00
Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-pivotin
This commit is contained in:
@@ -27,20 +27,20 @@ GKEクラスターにGSAへのアクセスを提供する方法は、次のよ
|
||||
```bash
|
||||
Copy codekubectl create serviceaccount <service-account-name>
|
||||
```
|
||||
- GKE クラスターへのアクセスを許可したい GCP サービス アカウントの資格情報を含む Kubernetes Secret を作成します。これは、以下の例に示すように `gcloud` コマンドライン ツールを使用して行うことができます:
|
||||
- GKE クラスターへのアクセスを付与したい GCP サービス アカウントの資格情報を含む Kubernetes Secret を作成します。次の例のように、`gcloud` コマンドライン ツールを使用してこれを行うことができます:
|
||||
```bash
|
||||
Copy codegcloud iam service-accounts keys create <key-file-name>.json \
|
||||
--iam-account <gcp-service-account-email>
|
||||
kubectl create secret generic <secret-name> \
|
||||
--from-file=key.json=<key-file-name>.json
|
||||
```
|
||||
- 次のコマンドを使用してKubernetes SecretをKubernetesサービスアカウントにバインドします:
|
||||
- 次のコマンドを使用して、Kubernetes SecretをKubernetesサービスアカウントにバインドします:
|
||||
```bash
|
||||
Copy codekubectl annotate serviceaccount <service-account-name> \
|
||||
iam.gke.io/gcp-service-account=<gcp-service-account-email>
|
||||
```
|
||||
> [!WARNING]
|
||||
> **第二のステップ**では、**KSAの秘密としてGSAの資格情報が設定されました**。その後、**GKE**クラスターの**内部**からその**秘密を読み取る**ことができれば、**そのGCPサービスアカウントに昇格**できます。
|
||||
> **第二のステップ**では、**KSAの秘密としてGSAの資格情報が設定されました**。その後、**GKE**クラスターの**内部**からその**秘密を読み取ることができれば**、その**GCPサービスアカウントに昇格することができます**。
|
||||
|
||||
### GKEワークロードアイデンティティ
|
||||
|
||||
@@ -54,7 +54,7 @@ gcloud container clusters update <cluster_name> \
|
||||
--region=us-central1 \
|
||||
--workload-pool=<project-id>.svc.id.goog
|
||||
```
|
||||
- **新しいノードプールを作成/更新する** (オートパイロットクラスターでは必要ありません)
|
||||
- **新しいノードプールを作成/更新する**(オートパイロットクラスターでは必要ありません)
|
||||
```bash
|
||||
# You could update instead of create
|
||||
gcloud container node-pools create <nodepoolname> --cluster=<cluser_name> --workload-metadata=GKE_METADATA --region=us-central1
|
||||
@@ -143,7 +143,7 @@ done | grep -B 1 "gcp-service-account"
|
||||
|
||||
PodsにIAMロールを付与する(古い)方法は、[**Kiam**](https://github.com/uswitch/kiam)または[**Kube2IAM**](https://github.com/jtblin/kube2iam) **サーバー**を使用することです。基本的に、**特権のあるIAMロール**の**デーモンセット**をクラスター内で実行する必要があります。このデーモンセットが、必要なポッドにIAMロールへのアクセスを提供します。
|
||||
|
||||
まず最初に、**どのロールが名前空間内でアクセス可能かを設定する**必要があり、これは名前空間オブジェクト内のアノテーションで行います:
|
||||
まず最初に、**どのロールがネームスペース内でアクセス可能かを設定する**必要があり、これはネームスペースオブジェクト内のアノテーションで行います:
|
||||
```yaml:Kiam
|
||||
kind: Namespace
|
||||
metadata:
|
||||
@@ -171,7 +171,7 @@ annotations:
|
||||
iam.amazonaws.com/role: reportingdb-reader
|
||||
```
|
||||
> [!WARNING]
|
||||
> 攻撃者として、もしポッドや名前空間にこれらのアノテーションがあるのを見つけたり、kiam/kube2iamサーバーが実行されている(おそらくkube-system内で)場合、あなたは**ポッドによって既に使用されているすべてのロール**を**なりすます**ことができ、さらに(AWSアカウントにアクセスできる場合はロールを列挙することができます)。
|
||||
> 攻撃者として、もしポッドや名前空間にこれらの**注釈**が見つかったり、kiam/kube2iamサーバーが実行されている場合(おそらくkube-system内で)、あなたは**ポッドによって既に使用されているすべてのr**oleを**なりすます**ことができ、さらに(AWSアカウントにアクセスできる場合はロールを列挙できます)。
|
||||
|
||||
#### IAMロールを持つポッドの作成
|
||||
|
||||
@@ -196,9 +196,9 @@ args: ["-c", "sleep 100000"]' | kubectl apply -f -
|
||||
|
||||
これは**AWSによる推奨方法**です。
|
||||
|
||||
1. まず、[クラスターのためのOIDCプロバイダーを作成する](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)必要があります。
|
||||
1. まず最初に、[クラスターのためのOIDCプロバイダーを作成する](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)必要があります。
|
||||
2. 次に、SAが必要とする権限を持つIAMロールを作成します。
|
||||
3. [IAMロールとSAの間に信頼関係を作成する](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html)必要があります(または、ロールへのアクセスをすべてのSAに与える名前空間)。_信頼関係は主にOIDCプロバイダー名、名前空間名、SA名を確認します_。
|
||||
3. [IAMロールとSAの間に信頼関係を作成する](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html)必要があります(または、名前空間がロールへのアクセスをすべてのSAに与える)。_信頼関係は主にOIDCプロバイダー名、名前空間名、SA名を確認します_。
|
||||
4. 最後に、**ロールのARNを示すアノテーションを持つSAを作成し**、そのSAで実行されるポッドは**ロールのトークンにアクセスできる**ようになります。**トークン**は**ファイルに書き込まれ**、パスは**`AWS_WEB_IDENTITY_TOKEN_FILE`**に指定されます(デフォルト: `/var/run/secrets/eks.amazonaws.com/serviceaccount/token`)。
|
||||
```bash
|
||||
# Create a service account with a role
|
||||
@@ -216,17 +216,17 @@ kubectl apply -f my-service-account.yaml
|
||||
# Add a role to an existent service account
|
||||
kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
|
||||
```
|
||||
`/var/run/secrets/eks.amazonaws.com/serviceaccount/token` からのトークンを使用して **awsを取得するには**、次のコマンドを実行します:
|
||||
`/var/run/secrets/eks.amazonaws.com/serviceaccount/token` からのトークンを使用して **awsを取得する** には、次のコマンドを実行します:
|
||||
```bash
|
||||
aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/EKSOIDCTesting --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token
|
||||
```
|
||||
> [!WARNING]
|
||||
> 攻撃者として、K8sクラスターを列挙できる場合は、**そのアノテーションを持つサービスアカウント**を確認して**AWSにエスカレート**してください。そうするには、IAMの**特権サービスアカウント**の1つを使用して**podをexec/create**し、トークンを盗みます。
|
||||
> 攻撃者として、K8s クラスターを列挙できる場合は、**そのアノテーションを持つサービスアカウント**を確認して**AWSにエスカレート**してください。そうするには、IAMの**特権サービスアカウント**の1つを使用して**exec/create**を行い、トークンを盗みます。
|
||||
>
|
||||
> さらに、pod内にいる場合は、**AWS_ROLE_ARN**や**AWS_WEB_IDENTITY_TOKEN**のような環境変数を確認してください。
|
||||
> さらに、ポッド内にいる場合は、**AWS_ROLE_ARN**や**AWS_WEB_IDENTITY_TOKEN**のような環境変数を確認してください。
|
||||
|
||||
> [!CAUTION]
|
||||
> 時々、役割の**Trust Policy**が**不適切に設定**されていることがあり、期待されるサービスアカウントにAssumeRoleアクセスを与える代わりに、**すべてのサービスアカウント**に与えてしまうことがあります。したがって、制御されたサービスアカウントにアノテーションを書き込むことができれば、その役割にアクセスできます。
|
||||
> 時々、役割の**Trust Policy**が**不適切に構成されている**場合があり、期待されるサービスアカウントにAssumeRoleアクセスを与える代わりに、**すべてのサービスアカウント**に与えてしまうことがあります。したがって、制御されたサービスアカウントにアノテーションを書き込むことができれば、その役割にアクセスできます。
|
||||
>
|
||||
> **詳細については、以下のページを確認してください**:
|
||||
|
||||
@@ -265,7 +265,7 @@ kubectl run NodeIAMStealer --restart=Never -ti --rm --image lol --overrides '{"s
|
||||
|
||||
以前、**ポッドにIAMロールをアタッチする**方法や、インスタンスにアタッチされているIAMロールを盗むために**ノードにエスケープする**方法について説明しました。
|
||||
|
||||
以下のスクリプトを使用して、新しく努力して得た**IAMロールの資格情報**を**盗む**ことができます:
|
||||
次のスクリプトを使用して、あなたの新しく努力して得た**IAMロールの資格情報**を**盗む**ことができます:
|
||||
```bash
|
||||
IAM_ROLE_NAME=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ 2>/dev/null || wget http://169.254.169.254/latest/meta-data/iam/security-credentials/ -O - 2>/dev/null)
|
||||
if [ "$IAM_ROLE_NAME" ]; then
|
||||
|
||||
Reference in New Issue
Block a user