Kubelet Authentication & Authorization
Reading time: 7 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Kubelet Authentication
デフォルトでは、他の設定された認証方法によって拒否されないkubeletのHTTPSエンドポイントへのリクエストは、匿名リクエストとして扱われ、ユーザー名は system:anonymous
、**グループは system:unauthenticated
**が与えられます。
3つの認証方法は次のとおりです:
- 匿名(デフォルト):パラメータ**
--anonymous-auth=true
または設定を使用します:**
"authentication": {
"anonymous": {
"enabled": true
},
- Webhook: これにより、kubectl APIベアラートークンが認証として有効になります(有効なトークンはすべて有効です)。次のように許可します:
authentication.k8s.io/v1beta1
APIグループがAPIサーバーで有効になっていることを確認します- **
--authentication-token-webhook
および--kubeconfig
**フラグを使用してkubeletを起動するか、次の設定を使用します:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
note
kubeletは、設定されたAPIサーバー上で**TokenReview
API**を呼び出して、ベアラートークンからユーザー情報を特定します。
- X509クライアント証明書: X509クライアント証明書を介して認証を許可します。
- 詳細については、apiserver認証ドキュメントを参照してください。
--client-ca-file
フラグを使用してkubeletを起動し、クライアント証明書を検証するためのCAバンドルを提供します。または、設定を使用して:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}
Kubelet Authorization
成功裏に認証された(匿名リクエストを含む)すべてのリクエストはその後承認されます。デフォルトの承認モードは**AlwaysAllow
**で、すべてのリクエストを許可します。
しかし、他の可能な値は**webhook
であり(これは主に見つかるものです**)、このモードは認証されたユーザーの権限を確認してアクションを許可または拒否します。
warning
匿名認証が有効になっている場合でも、匿名アクセスにはアクションを実行する権限がない可能性があります。
Webhookによる承認は、**パラメータ --authorization-mode=Webhook
**を使用するか、設定ファイルで次のように構成できます:
"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},
kubeletは、設定されたAPIサーバー上で**SubjectAccessReview
** APIを呼び出して、各リクエストが認可されているかどうかを 判断します。
kubeletは、apiserverと同じリクエスト属性アプローチを使用してAPIリクエストを認可します:
- アクション
HTTP動詞 | リクエスト動詞 |
---|---|
POST | create |
GET, HEAD | get(個々のリソース用)、list(コレクション用、完全なオブジェクトコンテンツを含む)、watch(個々のリソースまたはリソースのコレクションを監視するため) |
PUT | update |
PATCH | patch |
DELETE | delete(個々のリソース用)、deletecollection(コレクション用) |
- Kubelet APIと通信するリソースは常に nodesであり、サブリソースは受信リクエストのパスから決定されます:
Kubelet API | リソース | サブリソース |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
その他すべて | nodes | proxy |
例えば、次のリクエストは、権限なしでkubeletのポッド情報にアクセスしようとしました:
curl -k --header "Authorization: Bearer ${TOKEN}" 'https://172.31.28.172:10250/pods'
Forbidden (user=system:node:ip-172-31-28-172.ec2.internal, verb=get, resource=nodes, subresource=proxy)
- Forbiddenを受け取ったので、リクエストは認証チェックを通過しました。そうでなければ、
Unauthorised
メッセージだけが表示されていたでしょう。 - ユーザー名(この場合はトークンから)を見ることができます。
- リソースがノードであり、サブリソースがプロキシであることを確認します(これは前の情報と一致します)。
References
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。