# 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}}