# Kubelet Authentication & Authorization {{#include ../../../banners/hacktricks-training.md}} ## Kubelet Authentication [**ドキュメントから:**](https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/) デフォルトでは、他の設定された認証方法によって拒否されないkubeletのHTTPSエンドポイントへのリクエストは、匿名リクエストとして扱われ、**ユーザー名は `system:anonymous`**、**グループは `system:unauthenticated`**が与えられます。 **3**つの認証**方法**は次のとおりです: - **匿名**(デフォルト):パラメータ**`--anonymous-auth=true`または設定を使用します:** ```json "authentication": { "anonymous": { "enabled": true }, ``` - **Webhook**: これにより、kubectl **APIベアラートークン**が認証として**有効**になります(有効なトークンはすべて有効です)。次のように許可します: - `authentication.k8s.io/v1beta1` APIグループがAPIサーバーで有効になっていることを確認します - **`--authentication-token-webhook`**および**`--kubeconfig`**フラグを使用してkubeletを起動するか、次の設定を使用します: ```json "authentication": { "webhook": { "cacheTTL": "2m0s", "enabled": true }, ``` > [!NOTE] > kubeletは、設定されたAPIサーバー上で**`TokenReview` API**を呼び出して、**ベアラートークンからユーザー情報を特定**します。 - **X509クライアント証明書:** X509クライアント証明書を介して認証を許可します。 - 詳細については、[apiserver認証ドキュメント](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#x509-client-certs)を参照してください。 - `--client-ca-file`フラグを使用してkubeletを起動し、クライアント証明書を検証するためのCAバンドルを提供します。または、設定を使用して: ```json "authentication": { "x509": { "clientCAFile": "/etc/kubernetes/pki/ca.crt" } } ``` ## Kubelet Authorization 成功裏に認証された(匿名リクエストを含む)**すべてのリクエストはその後承認されます**。**デフォルト**の承認モードは**`AlwaysAllow`**で、**すべてのリクエストを許可します**。 しかし、他の可能な値は**`webhook`**であり(これは**主に見つかるものです**)、このモードは**認証されたユーザーの権限を確認して**アクションを許可または拒否します。 > [!WARNING] > **匿名認証が有効になっている**場合でも、**匿名アクセス**には**アクションを実行する権限がない**可能性があります。 Webhookによる承認は、**パラメータ `--authorization-mode=Webhook`**を使用するか、設定ファイルで次のように構成できます: ```json "authorization": { "mode": "Webhook", "webhook": { "cacheAuthorizedTTL": "5m0s", "cacheUnauthorizedTTL": "30s" } }, ``` kubeletは、設定されたAPIサーバー上で**`SubjectAccessReview`** APIを呼び出して、各リクエストが**認可されているかどうかを** **判断**します。 kubeletは、apiserverと同じ[リクエスト属性](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#review-your-request-attributes)アプローチを使用して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のポッド情報にアクセスしようとしました: ```bash 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 - [https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/](https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/) {{#include ../../../banners/hacktricks-training.md}}