Kubelet Authentication & Authorization

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

Kubelet 認証

ドキュメントから:

デフォルトでは、他の構成された認証方法で拒否されない kubelet の HTTPS エンドポイントへのリクエストは匿名リクエストとして扱われ、ユーザー名が system:anonymous で、グループが system:unauthenticated として与えられます。

認証方法は 3 つあります:

  • 匿名(デフォルト): パラメータ **--anonymous-auth=true を設定するか、設定ファイルを使用します。

"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: これにより、kubectl APIベアラートークンを認証として有効にします(有効なトークンはすべて有効です)。次のように許可します:

  • APIサーバーでauthentication.k8s.io/v1beta1 APIグループが有効になっていることを確認します

  • kubeletを**--authentication-token-webhookおよび--kubeconfig**フラグで起動するか、次の設定を使用します:

"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

kubeletは、構成されたAPIサーバー上の**TokenReview APIを呼び出して、ベアラートークンからユーザー情報を決定**します。

  • X509クライアント証明書: X509クライアント証明書を使用して認証を許可します

  • 詳細については、apiserver認証ドキュメントを参照してください

  • --client-ca-fileフラグを使用して、クライアント証明書を検証するためのCAバンドルを提供してkubeletを起動するか、構成で次のようにします:

"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}

Kubelet 認可

認証に成功したリクエスト(匿名リクエストを含む)はその後認可されますデフォルトの認可モードは**AlwaysAllow**で、すべてのリクエストを許可します。

ただし、他の可能な値は**webhook**です(ほとんどの場所で見つけることができるものです)。このモードでは、認証されたユーザーの権限をチェックして、アクションを許可または拒否します。

匿名認証が有効になっていても、匿名アクセスはアクションを実行するための権限を持っていない可能性があります。

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メッセージが表示されます。

  • ユーザー名(この場合はトークンから)

  • リソースnodesであり、サブリソースproxyであることを確認します(前の情報と一致します)

参考文献

htARTE(HackTricks AWS Red Team Expert)を使って、ゼロからヒーローまでAWSハッキングを学びましょう!

HackTricksをサポートする他の方法:

最終更新