Kubelet 認証と認可

Tip

学んで実践する AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学んで実践する GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学んで実践する Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks をサポートする

Kubelet 認証

From the docss:

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

認証の 3 つの 方法 は次のとおりです:

  • Anonymous (デフォルト): パラメータ --anonymous-auth=true または設定で有効にします:
"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: これにより kubectl の API bearer tokens を認証として有効にします(有効なトークンはどれでも認証されます)。次のように許可します:
  • API サーバーで authentication.k8s.io/v1beta1 API グループが有効になっていることを確認する
  • kubelet を --authentication-token-webhook--kubeconfig フラグで起動するか、次の設定を使用する:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

Note

kubelet は設定された API server 上の TokenReview API` を呼び出し、bearer tokens からユーザー情報を判定します

  • X509 client certificates: X509 client certs を使用して認証できます
  • see the apiserver authentication documentation for more details
  • kubelet を --client-ca-file フラグで起動し、クライアント証明書を検証するための CA バンドルを指定します。あるいは設定で:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}

Kubelet 認可

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

ただし、もう一つの可能な値は**webhook(現場で主に見かける**のはこちら)です。このモードは、アクションを許可するか拒否するかを決めるために、認証済みユーザーの権限をチェックします

Warning

匿名認証が有効になっている場合でも、匿名アクセスは操作を実行するための権限を持たない場合があります

webhookによる認可は、param --authorization-mode=Webhook を使用するか、設定ファイルで次のように設定できます:

"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},

The kubelet は構成された API サーバー上の SubjectAccessReview API を呼び出して、各リクエストが 許可されているかどうか判定 します。

kubelet は apiserver と同じ request attributes アプローチを使って API リクエストを認可します:

  • アクション
HTTP verbrequest verb
POSTcreate
GET, HEADget (for individual resources), list (for collections, including full object content), watch (for watching an individual resource or collection of resources)
PUTupdate
PATCHpatch
DELETEdelete (for individual resources), deletecollection (for collections)
  • Kubelet api に対して話す resource常に nodes で、subresource は受信リクエストのパスから 決定されます:
Kubelet APIresourcesubresource
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
all othersnodesproxy

Note

WebSocket ベースの /exec, /run, /attach, /portforward はデフォルトの proxy subresource に分類され、初回 HTTP GET ハンドシェイクで認可されます。nodes/proxy GET のみを持つ主体でも、WebSockets 経由で https://<node_ip>:10250 に直接接続すればコンテナを exec できてしまいます。詳細は nodes/proxy GET -> Kubelet /exec verb confusion abuse を参照してください。

例えば、次のリクエストは権限なしに kubelet の pods 情報へアクセスしようとしました:

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 メッセージを受け取っていただろう。
  • username が確認できる(この場合はトークンから)
  • resourcenodessubresourceproxy になっているのを確認(前の情報と一致する)

References

Tip

学んで実践する AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学んで実践する GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学んで実践する Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks をサポートする