はじめに
このページではKubernetes v1.32におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.32: 変更点まとめも確認してみてください。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
機能の追加・更新など
Alphaで追加されたfeature gate
KubeletFineGrainedAuthz
ExternalServiceAccountTokenSigner
Betaに昇格した/追加されたfeature gate
ServiceAccountNodeAudienceRestriction
BtreeWatchCache
-
AnonymousAuthConfigurableEndpoints
GAに昇格したfeature gate
-
StructuredAuthorizationConfiguration
StatefulSetAutoDeletePVC
-
ServiceAccountTokenJTI
-
ServiceAccountTokenPodNodeInfo
-
ServiceAccountTokenNodeBindingValidation
削除されたfeature gate
ValidatingAdmissionPolicy
LegacyServiceAccountTokenCleanUp
KMSv2
KMSv2KDF
Changes by Kind
Deprecation
- ServiceAccount metadata.annotations
kubernetes.io/enforce-mountable-secrets
: v1.32から非推奨になります。削除期限はありません。別々のNamespaceを使用してシークレットへのアクセスを分離することが好ましいです。(#128396)-
kubernetes.io/enforce-mountable-secrets
は初期の頃から利用可能だったアノテーション - https://github.com/kubernetes/kubernetes/pull/11827
- 参考: https://qiita.com/ryysud/items/d89aefa567b0e35484bd
- ServiceAccountオブジェクトにアノテーションをセットしアクセス可能なSecretのリストを定義できたが、CVEの影響で非推奨になった?
-
API Change
- kube-apiserver エンドポイントに
/flagz
エンドポイントを追加しました。(#127581) - DRA: 不明瞭なデバイス設定パラメータを制限しました。Admission時にKubernetesは10KiBのサイズ制限を強制します。. (#128601)
- DRA: シナリオによるがポッドのスケジューリングが最大16倍高速になります。スケジューリングのスループットはクラスタ利用率に大きく依存します。リソースが空いていて負荷の軽いクラスタでは高く、クラスタの利用率が上がると低くなります。.([#127277])
- DRA:
DeviceRequestAllocationResult
structに"AdminAccess"フィールドが追加されました。割り当てを処理するときに、DeviceRequest
フィールドの対応するフィールドの代わりにこのフィールドを使用する必要があります。デバイスが管理者アクセスのみに割り当てられている場合、当初の意図どおり、通常の使用のためにデバイスを再度割り当てることがサポートされるようになりました。管理者アクセスを許可するには、1.32 以降、「DRAAdminAccess」機能ゲートを有効にする必要があります. (#127266) - Structured authentication configurationにて
k8s.io
とkubernetes.io
の名前空間を持つextra keyを許可しないようにしました。(#126553)-
claim mappingで
k8s.io
のような名前空間のkeyへのマッピングを禁止します
-
claim mappingで
- admission policyを変更するための
v1alpha1
API を導入し、CEL 式による拡張可能なadmission controlを有効にしますs (KEP 3962: Mutating Admission Policies)。 使用するには、MutatingAdmissionPolicy
feature gateとadmissionregistration.k8s.io/v1alpha1
API を--runtime-config
経由で有効にします。. ([#127134) - kube-apiserver:
StructuredAuthorizationConfiguration
feature gate をGAに昇格します。--authorization-config
フラグはapiserver.config.k8s.io/v1
バージョンのAuthorizationConfiguration
を受け付けます(apiserver.config.k8s.io/v1beta1
からの変更はありません) - kubelet:
--image-credential-provider-config
ファイルが厳密なデシリアライズでロードされ、config ファイルに重複したフィールドや不明なフィールドが含まれる場合に失敗します。これにより、不正なコンフィグファイル、インデントされていないファイル、フィールド名のタイプミスが誤って実行されることを防ぎ、予期しない動作を防止します。 (#128062) - NodeRestriction admissionは、kubeletがPod Spec Volumeに定義されるServiceAccountトークンを要求する際にaudienceの値をvalidateするようになります。 これはデフォルト有効な新しいkube-apiserverの
ServiceAccountNodeAudienceRestriction
feature gateで有効化されます。 (#128077)- KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/4412-projected-service-account-tokens-for-kubelet-image-credential-providers/README.md
- 長期間有効で永続的なイメージプルシークレットの回避
- Kubelet image credential providersのためのサービスアカウントトークンを発行して渡せるよううになる
- CredentialProviderConfigに
tokenAttributes
の構造が追加され、これが設定されている場合、そこで指定されたオーディエンスのサービスアカウントトークンを発行しそれをプラグインに渡す
-
StatefulSetAutoDeletePVC
feature gateがbetaからstableになりました。(#128247) -
classic dynamic resource allocation (DRA)のすべてのサポートが削除されました。以前はalphaだった
DRAControlPlaneController
feature gateは利用できなくなりました。Kubernetes は Pod への動的リソース割り当てに structured parameters モデル (alpha) のみを使用するようになりました。クラスタで classic DRA が有効になっている場合のみ、アップグレード前に、classic DRA に依存するすべてのワークロード(pods、app deploymentsなど)を削除し、すべての PodSchedulingContext リソースがなくなっていることを確認してください。アップグレード後に apiserver から PodSchedulingContext リソースを削除すると、ワークロードが正しく動作しなくなります。。(#128003) - kubelet API Authorization に新しいサブリソースが追加され、kubelet エンドポイントのよりきめ細かな認証チェックとアクセス制御が可能になりました。
KubeletFineGrainedAuthz
feature gateを有効にしていれば、RBAC で呼び出し元にnodes/helathz
権限を付与することで、kubelet の/healthz
エンドポイントにアクセスできます。同様に、RBAC で呼び出し側にnodes/pods
権限を付与することで、kubelet の/pods
エンドポイントにアクセスして、そのノードにバインドされている Pod のリストを取得することもできます。また、RBAC で呼び出し側にnodes/configz
権限を付与することで、kubelet の/configz
エンドポイントにアクセスして kubelet の設定を取得することもできます。RBAC で呼び出し元にnodes/proxy
権限を付与することで、kubelet の/healthz
、/pods
、/configz
にアクセスすることはできますが、これは呼び出し元にノード上のコンテナを実行、実行、アタッチする権限も付与することになり、最小権限の原則には従いません。呼び出し元に必要以上のアクセス許可を与えると、攻撃者に権限を昇格させる機会が与えられる可能性があります。 (#126347)- KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/2862-fine-grained-kubelet-authz/README.md
- kublet apiの認証の改善
- 認識されている課題
- これまで、
/healthz
エンド/pods
ポイントは認証されていない kubelet 読み取り専用ポート (10255) で使用できましたが、kubelet 読み取り専用ポートはデフォルトで無効になっており、ポートを有効にすることはセキュリティ上の最悪のプラクティスと見なされている - 多くのエージェントが kubelet 認証ポート (10250) を使用するように切り替えたが、認証済み (10250) ポートの Kubelet API は現在、リクエストの認証に非常に大まかなスキームを使用している。 たとえば、読み取り
/healthz
と呼び出し/exec/…
には同じproxy
サブリソースが必要
- これまで、
-
- Dynamic Resource Allocation (DRA) のコア機能がbetaになりました。アップグレードの際、何もする必要はありません。以前のv1alpha3のAPIも引き続きサポートされていますので、v1alpha3ベースの既存のデプロイメントやDRAドライバは引き続き動作します。クラスタ内のDRAリソース(resourceclaims、resourceclaimtemplates、deviceclasses、resourceslices)を1.32から1.31にダウングレードすることはサポートされていません。 (#127511)
- 使いやすさと開発者の使い勝手を向上させるため、CRDバリデーションルールでは、オブジェクトバリデーション式でフィールド名として(CEL)予約キーワードを直接使用できるようになりました。 名前形式CELライブラリは、新しい式でサポートされています。 (#126977)
- kube-apiserverへのX.509 クライアント証明書認証で、監査ロギングで使用するためのクレデンシャルID(証明書の署名から派生)が生成されるようになりました(#125634)
- e.g.,レスポンスに以下のようなkey=valueが含まれる
- key=
authentication.kubernetes.io/credential-id
, value=[X509SHA256=794b0529fd1a72d55d52d98be9bab5b822d16f9ae86c4373fa7beee3cafe8582]
Feature
- kube-apiserver に
/statusz
エンドポイントを追加しました。([#125577]) - 新しいvolumeattributesclass-protection-controllerをkube-controller-managerに追加しました。この新しいコントローラーは、VolumeAttributesClassオブジェクトの保護ファイナライザを管理します。(#123549)
- alpha版の
ExternalServiceAccountTokenSigner
feature gateを有効にし、--service-account-signing-endpoint
を指定することで、サービスアカウントトークンの外部署名公開検証鍵の取得を可能にする機能をkube-apiserverに追加しました。フラグの値にはUNIXドメインソケットの場所または、@記号を先頭につけて抽象ソケット名前空間内のUNIXドメインソケットの名前を指定します。 (#128190)- KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/740-service-account-external-signing
- 既存はディスクに保存された鍵を使って署名しているが、HSMやKMSを使って署名できるようにしたいというもの
- ローテーション時に再起動が必要なオペレーションの改善
- セキュリティの強化。ディスクに鍵を置かなくてよい
- btreeデータ構造を使った list 動詞のためのwatchキャッシュの新しい実装を採用しました。この実装はデフォルトで有効です。
BtreeWatchCache
feature gateで無効にできます。(#128415) -
AnonymousAuthConfigurableEndpoints
feature gateをベータに移行しデフォルトで匿名認証のエンドポイントを設定できるようになります。(#127009) - on_operations_totalメトリックに、リソース固有の検証(例えばapiserverによる暗号化設定の処理など)に使用可能な、追加のリソースlabeltransformationを追加しました。 (#126512)
- JWT authenticatorsは、監査ロギングで使用されるクレデンシャルIDとして、
jti
クレーム(それが存在し文字列値である場合)を設定するようになりました。(#127010)- e.g.,レスポンスに以下のようなkey=valueが含まれる
- key=
authentication.kubernetes.io/credential-id
, value=[JTI=xxxx]
- kube-apiserver: リクエストのフィールドとラベルのセレクタ情報をWebhook authorization呼び出しに含める
AuthorizeWithSelectors
機能をベータ版に昇格しました。AuthorizeNodeWithSelectors
機能をベータ版に昇格させ、ノードAPIクライアントからのリクエストを制限するようにノードオーソライザの動作を変更しました。これにより、各ノードは自身のノードAPIオブジェクトのみを取得/一覧表示/監視でき、そのノードにバインドされたPod APIオブジェクトのみを取得/一覧表示/監視できるようになります。kubelet 認証情報を使用して他のノードや無関係なポッドを読み取るクライアントは、認証情報を変更するか(recommended)、使用方法を調整するか、ノードオーソライザとは無関係に広い読み取りアクセス権を取得する必要があります。 (#128168 - kube-apiserver: 新しい
--requestheader-uid-headers
フラグにより、リクエストヘッダ認証を設定して指定したヘッダから認証ユーザーの UID を取得できるようになりました。新しいオプションの推奨値はX-Remote-Uid
です。指定すると、kube-system/extension-apiserver-authentication
configmap の.data[requestheader-uid-headers]
フィールドにその値が含まれるようになります。(#115834)-
extension-apiserver-authentication
はextention apiserverが認証のための設定値などを読み込むためのConfigMap
-
- カーネルバージョンガイドライン4.15以上の場合、ポッドがデフォルトで
net.ipv4.tcp_rmem
およびnet.ipv4.tcp_wmem
sysctl を使用できるようにします。カーネル 4.15 では、sysctl が名前空間化されました。Pod Security アドミッションはv1.32 以降のバージョンのベースライン ポリシーと制限付きポリシーでこれらの sysctl が許可します。 (#127489) - 発行されたサービスアカウントトークンに
jti
クレームを追加し、authentication.kubernetes.io/credential-id=[「JTI=...」]
の値として 埋め込むServiceAccountTokenJTI
機能を GA に昇格しました。(#128169) -
ServiceAccountTokenPodNodeInfo
をGAに昇格します。この機能は、実行中のポッドにマウントされたサービスアカウントトークンにノード名と uid をクレームとして追加し、トークンが使用されるときにその情報をauthentication.kubernetes.io/node-name
とauthentication.kubernetes.io/node-uid
ユーザ追加情報として埋め込みます。(#128169) -
ServiceAccountTokenNodeBindingValidation
を GA に昇格させ、ノードに直接バインドされたサービス アカウント トークンを検証します。(#128169) - コントロールプレーンのトラストアンカーパブリッシャーが更新され、
kubernetes.io/kube-apiserver-serving
X.509証明書署名者に関連付けられた新しいClusterTrustBundleオブジェクトが作成および管理されるようになりました。このClusterTrustBundleのペイロードには、kube-apiserver serving証明書の検証に使用できるPEMバンドルが含まれています。(#127326)- KEP:https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3257-cluster-trust-bundles
-
certificates.k8s.io
APIで生成された証明書のトラストバンドルをPodにマウントする仕組み - singerを指定してprojected volumeとしてトラストバンドルをpodにマウントすることができる
- kube-apiserverのサーバー証明書のトラストバンドルも配布可能
-
RootCAConfigMap
を置き換えることができる
-
Documentation
- N/A
Failing Test
- N/A
Bug or Regression
- ConfigMap、Secret、DownwardAPI、Projectedの重複パスに対する警告を追加しました。ソース付きのProjectedVolumeが提供されている場合の警告を追加しました。. (#121968)
- DRA: スケジューラのキューイングヒント機能を有効にすると、生成されたResourceClaimの名前を記録してもスケジューリングがトリガーされないため、Podがスケジューリング不能としてスタックしていました (#127497)
- KMSv2サービスから送信されたリクエストが、無効なAuthorityヘッダを持つために拒否される問題を修正しました。(#126930)
- system:controller:persistent-volume-binderおよびsystem:controller:expand-controllerクラスタロールの不要なパーミッションを削除しました。(#125995)
Other
- Fakeクライアントセットは、共通の汎用的な実装を使用するようになりました。対応する構造体はプライベートとなり、呼び出し元は対応するコンストラクタを使用する必要があります。(#126503)
- 一般的に利用可能な
ValidatingAdmissionPolicy
feature gateを削除しました。(#126645) - 一般的に利用可能な
LegacyServiceAccountTokenCleanUp
feature gateを削除しました。(#126839) -
KMSv2
とKMSv2KDF
のfeature gateを削除しまし。関連する機能は Kubernetes v1.29 リリースで安定版に移行しています。 (#126698) - etcdクライアントをv3.5.16に更新しました。 (#127279)
- kubelet: 1.32.0リリース候補でWindowsノードでCSIボリュームをマウントする際の問題を修正しました。(#129083)