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

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

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



## Changes by Kind
### Deprecation

- N/A
### API Change
- ACTION REQUIRED: Dynamic Resource Allocation (DRA) ドライバーのDaemonSetはResourceSliceの書き込みとResourceClaimの読みこみが有効なサービスアカウントでデプロイしなければなりません。 ([#125163](https://github.com/kubernetes/kubernetes/pull/125163))
- AlphaとしてCoordinated Leader Electionを `CoordinatedLeaderElection` フィーチャーゲートに追加しました。この機能を有効にすると、コントロールプレーンは LeaseCandidate オブジェクト (coordination.k8s.io/v1alpha1 API group) を使用してリーダー選挙に参加し、kube-apiserverに何らかの戦略に従って最適なインスタンスを選択させることができます。([#124012](https://github.com/kubernetes/kubernetes/pull/124012))
- CEL拡張ライブラリの厳格なコスト計算を強制するためのフィーチャーゲート `StrictCostEnforcementForVAP` と `StrictCostEnforcementForWebhooks` を追加しました。このフィーチャーゲートはできるだけ早い段階でオンにすることを強く推奨します。([#124675](https://github.com/kubernetes/kubernetes/pull/124675))
- Component-base/logs: Go >= 1.21でコンパイルすると、component-baseはklogの初期化とあわせて自動的にslogのデフォルトロガーを設定します。([#120696](https://github.com/kubernetes/kubernetes/pull/120696))
- Dynamic Resource Allocation (DRA): ResourceQuotaメカニズムによってResourceClaimオブジェクトの数をネームスペースごとに制限、特定のクラスを通じて要求されるデバイスの数によって制限できる機能を追加しました。. ([#120611](https://github.com/kubernetes/kubernetes/pull/120611))
- Dynamic Resource Allocation (DRA): `pod.spec.recourceClaims` 配列の `source` indirectionが不要になりました。例えば、`source: resourceClaimTemplateName: my-template`の代わりに`resourceClaimTemplateName: my-template`と書くことができます。([#125116](https://github.com/kubernetes/kubernetes/pull/125116))
- resource.k8s.io APIグループのバージョンを更新しDynamic Resource Allocation (DRA)を強化しました。 ユーザー向けの主要な型はResourceClaimのままですが、大幅な変更が加えられ、新しいバージョンv1alpha3となりました。v1alpha3は以前のバージョンと互換性はありません。([#125488](https://github.com/kubernetes/kubernetes/pull/125488))
- kube-apiserver: APIサーバーが認可でリクエストのコンテキストをチェックできるAlpha機能を追加しました。
	-  `AuthorizeWithSelectors` フィーチャーゲートはWebhookの認可呼び出しにフィールドとラベルセレクタ情報を含めることができます。
	-  `AuthorizeNodeWithSelectors` フィーチャーゲートはノード API クライアントからのリクエストを制限するために、Node authorizerの振る舞いを変更します。これにより、各ノードは自身のノード API オブジェクトのみをget/list/watchでき、そのノードにバインドされた Pod API オブジェクトのみをget/list/watchすることもできます。kubelet クレデンシャルを使用して他のノードや無関係なポッドを読み取るクライアントは、認証情報を変更するか（推奨）、使用方法を調整するか、Node authorizerに依存しないより広範な読み取りアクセスを得る必要があります。. ([#125571](https://github.com/kubernetes/kubernetes/pull/125571)))
		- :pencil2:
		- 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
```json
{
  "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](https://github.com/kubernetes/kubernetes/pull/124917))
	- :pencil2:
	- 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
```yaml
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: false
```

e.g. enable
```yaml
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: true
```

e.g. enable(条件付き)
```yaml
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: true
  conditions:
  - path: "/healthz"
  - path: "/readyz"
  - path: "/livez"
```
### Feature
- CustomResourceFieldSelectorsをベータに追加しデフォルトで有効になります。詳細は [kubernetes/enhancements#4358](https://github.com/kubernetes/enhancements/issues/4358) を確認してください。([#124681](https://github.com/kubernetes/kubernetes/pull/124681))
- fake client-go型のクライアントにフィールドマネジメントのサポートを追加しました。フィールドマネジメントのサポート付きのclentsetを作成するには`fake.NewSimpleClientset()`の代わりに `fake.NewClientSet()`を使ってください。([#125560](https://github.com/kubernetes/kubernetes/pull/125560))
- kubeletサーバーは動的に証明書ファイルをロードできるようになりました。([#124574](https://github.com/kubernetes/kubernetes/pull/124574))
    - :pencil2: これまでクライアント証明書はclient-goによって動的にリロードされていましたが、サーバー証明書はそうなっていなかったようです
- Nodeオブジェクトに紐付いたServiceAccountトークンを作成できるようになりました。ユーザは、Podに紐付いたトークンと同様にトークンの有効性を名前付きのNodeオブジェクトに紐付けることができます。`kubectl create token <serviceaccount-name> --bound-object-kind=Node --bound-object-node=<node-name>` で利用できます。 ([#125238](https://github.com/kubernetes/kubernetes/pull/125238))
	- :pencil2: v1.30以前は`--bound-object-kind`の対象はPod,SecretのみでしたがNodeが追加されました
- kubeletは、関連するNodeオブジェクトの`.status.address`に少なくとも1つのIPアドレスがある場合にのみ証明書を要求するようになりました。これにより、外部で設定されたアドレスが配置される前に、DNSのみの証明書を要求することを回避できます。1.33 までは、kubelet で非推奨の `AllowDNSOnlyNodeCSR` 機能ゲートを true に設定することで以前の動作に戻すことができます。 ([#125813](https://github.com/kubernetes/kubernetes/pull/125813))
- client-goの`List`メソッドにAPIストリーミングを可能にする新しい機能を追加しました。この機能を有効にするには、`client-go.WatchListClient`フィーチャーゲートを設定します。この機能が正しく機能するためには、サーバーがストリーミングをサポートしていなければならないことに注意が必要です。サーバーがストリーミングをサポートしていない場合client-go はデータを取得するために通常の `LIST` メソッドを使用するように戻ります。 ([#124509](https://github.com/kubernetes/kubernetes/pull/124509))
- kube-apiserver: Alpha の `UserNamespacesPodSecurityStandards` フィーチャーゲートが有効になっている場合、ベースラインポリシーの Pod Security Admission の施行で `procMount：hostUsers: false` を設定したユーザー名前空間のPodに対して `procMount: Unmasked` を許可するようになりました。 ([#126163](https://github.com/kubernetes/kubernetes/pull/126163))
- 1.31から、`container_engine_t`がベースラインのPod Security Standardで許可されるSELinux型のリストに追加されました。 ([#126165](https://github.com/kubernetes/kubernetes/pull/126165))
- PodDisruptionBudget `spec.unhealthyPodEvictionPolicy` フィールドが GAになりました。このフィールドを `AlwaysAllow` に設定すると、PodDisruptionBudget でカバーされているアンヘルシーなpodを常に退去させることができます。 ([#123428](https://github.com/kubernetes/kubernetes/pull/123428))
- CEL(Common Expression Language)のオプション型の名前が `optional` から `optional_type` に変更されました。 ([#124328](https://github.com/kubernetes/kubernetes/pull/124328))
### Failing Test
- N/A
### Bug or Regression
- storage-version-migrator-controller にて、マイグレーションが進行中にリソースが削除されるとマイグレーションが失敗するバグを修正しました。 ([#126107](https://github.com/kubernetes/kubernetes/pull/126107))
- kube-apiserver:  --authorization-configファイルで認可webhookに設定されたタイムアウトが尊重されるようになり、webhookのタイムアウトがresult=timeoutのwebhookメトリクスに正確に反映されるようになりました。([#125552](https://github.com/kubernetes/kubernetes/pull/125552))
- Admissionプラグインの`PersistentVolumeLabel` が削除されました。同様の機能が必要な場合は代わりに  [https://github.com/kubernetes-sigs/cloud-pv-admission-labeler](https://github.com/kubernetes-sigs/cloud-pv-admission-labeler) を使ってください。 ([#124505](https://github.com/kubernetes/kubernetes/pull/124505))
- `client-gen`で生成された"fake"クライアントは本物のクライアントと同じセマンティクスを持つようになりました。特に失敗したGet()やCreate()などは`nil`を返さなくなります(本物のクライアントと同じようにゼロ値のオブジェクトへのポインタを返します)。 これは`result != nil` よりも`result == nil` をテストしていたダウンストリームの単体テストや、場合によっては誤った単体テストによって隠されていた根本的なコードのバグが露呈することもあります。. ([#122892](https://github.com/kubernetes/kubernetes/pull/122892))
### Other (Cleanup or Flake)
- Node Admissionプラグインは `kubernetes.io/kubelet-serving` or `kubernetes.io/kube-apiserver-client-kubelet`のsingerへの、CNが`system:node:`で始まるが `system:node:${node-name}` ではないCSRの要求を拒否します。フィーチャーゲート`AllowInsecureKubeletCertificateSigningRequests` のデフォルトは `false` であるが、有効にすると以前の動作に戻します。このフィーチャーゲートは Kubernetes v1.33 で削除される予定です。([#126441](https://github.com/kubernetes/kubernetes/pull/126441))
- 最後に残っていたin-treeのgcp クラウドプロバイダーとクレデンシャルプロバイダーを削除しました。代わりに[https://github.com/kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp)の外部クラウドプロバイダとクレデンシャルプロバイダを使用してください。 ([#124519](https://github.com/kubernetes/kubernetes/pull/124519) )