K8s v1.32 SIG-Authの変更内容

## はじめに
このページではKubernetes v1.32におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 [ Kubernetes 1.32: 変更点まとめ](https://qiita.com/uesyn/items/f3b67d2d3a7591e9e502)も確認してみてください。

:pencil2: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。


## 機能の追加・更新など
### Alphaで追加されたfeature gate
- `KubeletFineGrainedAuthz`
- `ExternalServiceAccountTokenSigner`
### Betaに昇格した/追加されたfeature gate
- `ServiceAccountNodeAudienceRestriction`
- `BtreeWatchCache`
- `AnonymousAuthConfigurableEndpoints`
    - https://qiita.com/hiyosi/items/2d510591c3a8732c5554
### GAに昇格したfeature gate
- `StructuredAuthorizationConfiguration` 
    - https://qiita.com/hiyosi/items/7c396ce98ba3ce42833c
- `StatefulSetAutoDeletePVC`
- `ServiceAccountTokenJTI`
    - https://qiita.com/hiyosi/items/d0946fd0839cc4c6e3d2
- `ServiceAccountTokenPodNodeInfo`
    - https://qiita.com/hiyosi/items/d0946fd0839cc4c6e3d2
- `ServiceAccountTokenNodeBindingValidation`
    - https://qiita.com/hiyosi/items/d0946fd0839cc4c6e3d2
### 削除されたfeature gate
- `ValidatingAdmissionPolicy`
- `LegacyServiceAccountTokenCleanUp`
-  `KMSv2`
- `KMSv2KDF`

## Changes by Kind

### Deprecation
- ServiceAccount metadata.annotations `kubernetes.io/enforce-mountable-secrets`: v1.32から非推奨になります。削除期限はありません。別々のNamespaceを使用してシークレットへのアクセスを分離することが好ましいです。([#128396](https://github.com/kubernetes/kubernetes/pull/128396))
	- :pencil2: `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](https://github.com/kubernetes/kubernetes/pull/127581))
- DRA: 不明瞭なデバイス設定パラメータを制限しました。Admission時にKubernetesは10KiBのサイズ制限を強制します。. ([#128601](https://github.com/kubernetes/kubernetes/pull/128601))
- DRA: シナリオによるがポッドのスケジューリングが最大16倍高速になります。スケジューリングのスループットはクラスタ利用率に大きく依存します。リソースが空いていて負荷の軽いクラスタでは高く、クラスタの利用率が上がると低くなります。.([#127277])
- DRA: `DeviceRequestAllocationResult` structに"AdminAccess"フィールドが追加されました。割り当てを処理するときに、`DeviceRequest` フィールドの対応するフィールドの代わりにこのフィールドを使用する必要があります。デバイスが管理者アクセスのみに割り当てられている場合、当初の意図どおり、通常の使用のためにデバイスを再度割り当てることがサポートされるようになりました。管理者アクセスを許可するには、1.32 以降、「DRAAdminAccess」機能ゲートを有効にする必要があります. ([#127266](https://github.com/kubernetes/kubernetes/pull/127266))
- Structured authentication configurationにて`k8s.io`と`kubernetes.io`の名前空間を持つextra keyを許可しないようにしました。([#126553](https://github.com/kubernetes/kubernetes/pull/126553))
	- :pencil2: claim mappingで`k8s.io`のような名前空間のkeyへのマッピングを禁止します
- 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](https://github.com/kubernetes/kubernetes/pull/128062))
- NodeRestriction admissionは、kubeletがPod Spec Volumeに定義されるServiceAccountトークンを要求する際にaudienceの値をvalidateするようになります。 これはデフォルト有効な新しいkube-apiserverの`ServiceAccountNodeAudienceRestriction` feature gateで有効化されます。 ([#128077](https://github.com/kubernetes/kubernetes/pull/128077))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/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](https://github.com/kubernetes/kubernetes/pull/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](https://github.com/kubernetes/kubernetes/pull/126347))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/127511))
-  使いやすさと開発者の使い勝手を向上させるため、CRDバリデーションルールでは、オブジェクトバリデーション式でフィールド名として(CEL)予約キーワードを直接使用できるようになりました。 名前形式CELライブラリは、新しい式でサポートされています。 ([#126977](https://github.com/kubernetes/kubernetes/pull/126977))
- kube-apiserverへのX.509 クライアント証明書認証で、監査ロギングで使用するためのクレデンシャルID（証明書の署名から派生）が生成されるようになりました([#125634](https://github.com/kubernetes/kubernetes/pull/125634))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/123549))
- alpha版の`ExternalServiceAccountTokenSigner` feature gateを有効にし、`--service-account-signing-endpoint`を指定することで、サービスアカウントトークンの外部署名公開検証鍵の取得を可能にする機能をkube-apiserverに追加しました。フラグの値にはUNIXドメインソケットの場所または、@記号を先頭につけて抽象ソケット名前空間内のUNIXドメインソケットの名前を指定します。 ([#128190](https://github.com/kubernetes/kubernetes/pull/128190))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/128415))
- `AnonymousAuthConfigurableEndpoints` feature gateをベータに移行しデフォルトで匿名認証のエンドポイントを設定できるようになります。([#127009](https://github.com/kubernetes/kubernetes/pull/127009))
- on_operations_totalメトリックに、リソース固有の検証（例えばapiserverによる暗号化設定の処理など）に使用可能な、追加のリソースlabeltransformationを追加しました。 ([#126512](https://github.com/kubernetes/kubernetes/pull/126512))
- JWT authenticatorsは、監査ロギングで使用されるクレデンシャルIDとして、`jti`クレーム（それが存在し文字列値である場合）を設定するようになりました。([#127010](https://github.com/kubernetes/kubernetes/pull/127010))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/128168)
-  kube-apiserver: 新しい `--requestheader-uid-headers` フラグにより、リクエストヘッダ認証を設定して指定したヘッダから認証ユーザーの UID を取得できるようになりました。新しいオプションの推奨値は `X-Remote-Uid` です。指定すると、`kube-system/extension-apiserver-authentication` configmap の `.data[requestheader-uid-headers]` フィールドにその値が含まれるようになります。([#115834](https://github.com/kubernetes/kubernetes/pull/115834))
	- :pencil2: `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](https://github.com/kubernetes/kubernetes/pull/127489))
- 発行されたサービスアカウントトークンに `jti` クレームを追加し、`authentication.kubernetes.io/credential-id=[「JTI=...」]` の値として 埋め込む `ServiceAccountTokenJTI` 機能を GA に昇格しました。([#128169](https://github.com/kubernetes/kubernetes/pull/128169))
- `ServiceAccountTokenPodNodeInfo` をGAに昇格します。この機能は、実行中のポッドにマウントされたサービスアカウントトークンにノード名と uid をクレームとして追加し、トークンが使用されるときにその情報を `authentication.kubernetes.io/node-name` と `authentication.kubernetes.io/node-uid` ユーザ追加情報として埋め込みます。([#128169](https://github.com/kubernetes/kubernetes/pull/128169))
- `ServiceAccountTokenNodeBindingValidation`を GA に昇格させ、ノードに直接バインドされたサービス アカウント トークンを検証します。([#128169](https://github.com/kubernetes/kubernetes/pull/128169))
- コントロールプレーンのトラストアンカーパブリッシャーが更新され、`kubernetes.io/kube-apiserver-serving` X.509証明書署名者に関連付けられた新しいClusterTrustBundleオブジェクトが作成および管理されるようになりました。このClusterTrustBundleのペイロードには、kube-apiserver serving証明書の検証に使用できるPEMバンドルが含まれています。([#127326](https://github.com/kubernetes/kubernetes/pull/127326))
	- :pencil2: 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](https://github.com/kubernetes/kubernetes/pull/121968))
- DRA: スケジューラのキューイングヒント機能を有効にすると、生成されたResourceClaimの名前を記録してもスケジューリングがトリガーされないため、Podがスケジューリング不能としてスタックしていました ([#127497](https://github.com/kubernetes/kubernetes/pull/127497))
- KMSv2サービスから送信されたリクエストが、無効なAuthorityヘッダを持つために拒否される問題を修正しました。([#126930](https://github.com/kubernetes/kubernetes/pull/126930))
- system:controller:persistent-volume-binderおよびsystem:controller:expand-controllerクラスタロールの不要なパーミッションを削除しました。([#125995](https://github.com/kubernetes/kubernetes/pull/125995))
### Other
- Fakeクライアントセットは、共通の汎用的な実装を使用するようになりました。対応する構造体はプライベートとなり、呼び出し元は対応するコンストラクタを使用する必要があります。([#126503](https://github.com/kubernetes/kubernetes/pull/126503))
-  一般的に利用可能な `ValidatingAdmissionPolicy` feature gateを削除しました。([#126645](https://github.com/kubernetes/kubernetes/pull/126645))
- 一般的に利用可能な`LegacyServiceAccountTokenCleanUp` feature gateを削除しました。([#126839](https://github.com/kubernetes/kubernetes/pull/126839))
-  `KMSv2` と `KMSv2KDF` のfeature gateを削除しまし。関連する機能は Kubernetes v1.29 リリースで安定版に移行しています。 ([#126698](https://github.com/kubernetes/kubernetes/pull/126698))
- etcdクライアントをv3.5.16に更新しました。 ([#127279](https://github.com/kubernetes/kubernetes/pull/127279))
- kubelet: 1.32.0リリース候補でWindowsノードでCSIボリュームをマウントする際の問題を修正しました。([#129083](https://github.com/kubernetes/kubernetes/pull/129083))