はじめに
このページではKubernetes v1.31におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.31: 変更点まとめも確認してみてください。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
Changes by Kind
Deprecation
- N/A
API Change
- ACTION REQUIRED: Dynamic Resource Allocation (DRA) ドライバーのDaemonSetはResourceSliceの書き込みとResourceClaimの読みこみが有効なサービスアカウントでデプロイしなければなりません。 (#125163)
- AlphaとしてCoordinated Leader Electionを
CoordinatedLeaderElection
フィーチャーゲートに追加しました。この機能を有効にすると、コントロールプレーンは LeaseCandidate オブジェクト (coordination.k8s.io/v1alpha1 API group) を使用してリーダー選挙に参加し、kube-apiserverに何らかの戦略に従って最適なインスタンスを選択させることができます。(#124012) - CEL拡張ライブラリの厳格なコスト計算を強制するためのフィーチャーゲート
StrictCostEnforcementForVAP
とStrictCostEnforcementForWebhooks
を追加しました。このフィーチャーゲートはできるだけ早い段階でオンにすることを強く推奨します。(#124675) - Component-base/logs: Go >= 1.21でコンパイルすると、component-baseはklogの初期化とあわせて自動的にslogのデフォルトロガーを設定します。(#120696)
- Dynamic Resource Allocation (DRA): ResourceQuotaメカニズムによってResourceClaimオブジェクトの数をネームスペースごとに制限、特定のクラスを通じて要求されるデバイスの数によって制限できる機能を追加しました。. (#120611)
- Dynamic Resource Allocation (DRA):
pod.spec.recourceClaims
配列のsource
indirectionが不要になりました。例えば、source: resourceClaimTemplateName: my-template
の代わりにresourceClaimTemplateName: my-template
と書くことができます。(#125116) - resource.k8s.io APIグループのバージョンを更新しDynamic Resource Allocation (DRA)を強化しました。 ユーザー向けの主要な型はResourceClaimのままですが、大幅な変更が加えられ、新しいバージョンv1alpha3となりました。v1alpha3は以前のバージョンと互換性はありません。(#125488)
- kube-apiserver: APIサーバーが認可でリクエストのコンテキストをチェックできるAlpha機能を追加しました。
-
AuthorizeWithSelectors
フィーチャーゲートはWebhookの認可呼び出しにフィールドとラベルセレクタ情報を含めることができます。 -
AuthorizeNodeWithSelectors
フィーチャーゲートはノード API クライアントからのリクエストを制限するために、Node authorizerの振る舞いを変更します。これにより、各ノードは自身のノード API オブジェクトのみをget/list/watchでき、そのノードにバインドされた Pod API オブジェクトのみをget/list/watchすることもできます。kubelet クレデンシャルを使用して他のノードや無関係なポッドを読み取るクライアントは、認証情報を変更するか(推奨)、使用方法を調整するか、Node authorizerに依存しないより広範な読み取りアクセスを得る必要があります。. (#125571))- KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/4601-authorize-with-selectors
- フィールドとラベルのセレクタを認可属性として公開することでセキュリティの改善が期待できる
-
AuthorizeWithSelectors
-
SelfSubjectAccessReview
、SubjectAccessReview
、LocalSubjectAccessReview
structにFieldSelector
とLabelSelector
が追加されました。 - フィールド、ラベル情報を認可のWebhook先に渡すことができます。
-
-
AuthorizeNodeWithSelectors
- 上記の機能を内部で使ったもの
- kubeletは自身に紐付くNodeやPodに対するget, list, watchのみが許可されるようになります (v1.30以前は制限なく情報を取得できた)
-
e.g. SubjectAccessReview spec
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"verb": "list",
"group": "",
"resource": "pods",
"fieldSelector": {
"requirements": [
{"key":"spec.nodeName", "operator":"In", "values":["mynode"]}
]
},
"labelSelector": {
"requirements": [
{"key":"example.com/mykey", "operator":"In", "values":["myvalue"]}
]
}
},
"user": "jane",
"group": [
"group1",
"group2"
]
}
}
e.g. CEL
authorizer.group('').resource('pods').fieldSelector('spec.nodeName=mynode').check('list').allowed()
authorizer.group('').resource('pods').labelSelector('example.com/mylabel=myvalue').check('list').allowed()
-
AnonymousAuthConfigurableEndpoints
フィーチャーゲートを有効にすると、ユーザーはAuthenticationConfigファイルを更新して、匿名リクエストを許可するエンドポイントを設定できます。(#124917)- KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/4633-anonymous-auth-configurable-endpoints
-
system:anonymous
やsystem:unauthenticated
の誤用(RBACの設定ミス)によるセキュリティリスクが存在する (https://kccncna2023.sched.com/event/1R2tp/rbacdoors-how-cryptominers-are-exploiting-rbac-misconfigs-greg-castle-vinayak-goyal-google) -
--anonymous-auth=false
に設定するとヘルスチェックなどに影響を与える場合がある - このフィーチャーゲートは上記問題を回避するためのものです
- AuthenticationConfigurationファイルでanonymous authの振る舞いを設定できるようになります。
- disable(無効)、enable(有効)、enable(条件付き) の3つを設定できるようになります
- この機能はシンプルな条件を想定しているため、条件が多い・複雑なものについてはAuthorization Policyを検討したほうがよいとのこと
e.g. false
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
enabled: false
e.g. enable
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
enabled: true
e.g. enable(条件付き)
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
enabled: true
conditions:
- path: "/healthz"
- path: "/readyz"
- path: "/livez"
Feature
- CustomResourceFieldSelectorsをベータに追加しデフォルトで有効になります。詳細は kubernetes/enhancements#4358 を確認してください。(#124681)
- fake client-go型のクライアントにフィールドマネジメントのサポートを追加しました。フィールドマネジメントのサポート付きのclentsetを作成するには
fake.NewSimpleClientset()
の代わりにfake.NewClientSet()
を使ってください。(#125560) - kubeletサーバーは動的に証明書ファイルをロードできるようになりました。(#124574)
- これまでクライアント証明書はclient-goによって動的にリロードされていましたが、サーバー証明書はそうなっていなかったようです
- Nodeオブジェクトに紐付いたServiceAccountトークンを作成できるようになりました。ユーザは、Podに紐付いたトークンと同様にトークンの有効性を名前付きのNodeオブジェクトに紐付けることができます。
kubectl create token <serviceaccount-name> --bound-object-kind=Node --bound-object-node=<node-name>
で利用できます。 (#125238)-
v1.30以前は
--bound-object-kind
の対象はPod,SecretのみでしたがNodeが追加されました
-
v1.30以前は
- kubeletは、関連するNodeオブジェクトの
.status.address
に少なくとも1つのIPアドレスがある場合にのみ証明書を要求するようになりました。これにより、外部で設定されたアドレスが配置される前に、DNSのみの証明書を要求することを回避できます。1.33 までは、kubelet で非推奨のAllowDNSOnlyNodeCSR
機能ゲートを true に設定することで以前の動作に戻すことができます。 (#125813) - client-goの
List
メソッドにAPIストリーミングを可能にする新しい機能を追加しました。この機能を有効にするには、client-go.WatchListClient
フィーチャーゲートを設定します。この機能が正しく機能するためには、サーバーがストリーミングをサポートしていなければならないことに注意が必要です。サーバーがストリーミングをサポートしていない場合client-go はデータを取得するために通常のLIST
メソッドを使用するように戻ります。 (#124509) - kube-apiserver: Alpha の
UserNamespacesPodSecurityStandards
フィーチャーゲートが有効になっている場合、ベースラインポリシーの Pod Security Admission の施行でprocMount:hostUsers: false
を設定したユーザー名前空間のPodに対してprocMount: Unmasked
を許可するようになりました。 (#126163) - 1.31から、
container_engine_t
がベースラインのPod Security Standardで許可されるSELinux型のリストに追加されました。 (#126165) - PodDisruptionBudget
spec.unhealthyPodEvictionPolicy
フィールドが GAになりました。このフィールドをAlwaysAllow
に設定すると、PodDisruptionBudget でカバーされているアンヘルシーなpodを常に退去させることができます。 (#123428) - CEL(Common Expression Language)のオプション型の名前が
optional
からoptional_type
に変更されました。 (#124328)
Failing Test
- N/A
Bug or Regression
- storage-version-migrator-controller にて、マイグレーションが進行中にリソースが削除されるとマイグレーションが失敗するバグを修正しました。 (#126107)
- kube-apiserver: --authorization-configファイルで認可webhookに設定されたタイムアウトが尊重されるようになり、webhookのタイムアウトがresult=timeoutのwebhookメトリクスに正確に反映されるようになりました。(#125552)
- Admissionプラグインの
PersistentVolumeLabel
が削除されました。同様の機能が必要な場合は代わりに https://github.com/kubernetes-sigs/cloud-pv-admission-labeler を使ってください。 (#124505) -
client-gen
で生成された"fake"クライアントは本物のクライアントと同じセマンティクスを持つようになりました。特に失敗したGet()やCreate()などはnil
を返さなくなります(本物のクライアントと同じようにゼロ値のオブジェクトへのポインタを返します)。 これはresult != nil
よりもresult == nil
をテストしていたダウンストリームの単体テストや、場合によっては誤った単体テストによって隠されていた根本的なコードのバグが露呈することもあります。. (#122892)
Other (Cleanup or Flake)
- Node Admissionプラグインは
kubernetes.io/kubelet-serving
orkubernetes.io/kube-apiserver-client-kubelet
のsingerへの、CNがsystem:node:
で始まるがsystem:node:${node-name}
ではないCSRの要求を拒否します。フィーチャーゲートAllowInsecureKubeletCertificateSigningRequests
のデフォルトはfalse
であるが、有効にすると以前の動作に戻します。このフィーチャーゲートは Kubernetes v1.33 で削除される予定です。(#126441) - 最後に残っていたin-treeのgcp クラウドプロバイダーとクレデンシャルプロバイダーを削除しました。代わりにhttps://github.com/kubernetes/cloud-provider-gcpの外部クラウドプロバイダとクレデンシャルプロバイダを使用してください。 (#124519 )