Kubernetes 1.30: SIG-Auth の変更内容


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

## 所感

今バージョンではAlphaの機能などは追加されておらず、v1.29で紹介した **StructuredAuthenticationConfiguration** と **StructuredAuthorizationConfiguration**がベータに昇格しており、それに伴う機能改善・修正やメトリクスの整備がありました。

## Changes by Kind

### Deprecation

- `v1.27`から非推奨となっていた`SecurityContextDeny` admission pluginは削除されました。代わりに`v1.25`から利用可能になっているPod Security Admission pluginの利用が推奨されています。詳細は [Kubernetes documentation](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#securitycontextdeny)を参照してください。([#122612](https://github.com/kubernetes/kubernetes/pull/122612))

### API Change

- Dynamic Resource Allocation: DRAドライバは"structured parameters"使用し、クレーム割り当てをスケジューラに任せることができるようになりました。([#123516](https://github.com/kubernetes/kubernetes/pull/123516))
- Structured Authentication Configurationが`DiscoveryURL`をサポートしました。指定された場合`discoveryURL` はディスカバリ情報を取得するために使用される URL を上書きします。これは、well-knownとjwksのエンドポイントが発行元とは異なる場所(クラスタ内のローカルなど)でホストされている場合のシナリオのためです。([#123527](https://github.com/kubernetes/kubernetes/pull/123527))
- 以前はCRDで利用可能だった`StorageVersionMigration` APIはKubernetesのビルトインAPIになりました。 ([#123344](https://github.com/kubernetes/kubernetes/pull/123344))
- JWT authenticatorを設定する場合: `username.expression`で`claims.email`が使われる場合、`username.expression`、`extra[*].valueExpression`または`claimValidationRules[*].expression`で`claims.email_verified`が使われていなければなりません。`username.claim`が`email`に設定されたときに自動的に適用されるバリデーションにマッチするクレームのバリデーションルール式の例は`'claims.?email_verified.orValue(true)'`です。([#123737](https://github.com/kubernetes/kubernetes/pull/123737))
- kube-apiserver: `--authentication-config` ファイルで受け入れられるAuthenticationConfiguration typeは`apiserver.config.k8s.io/v1beta1`に昇格しました。([#123696](https://github.com/kubernetes/kubernetes/pull/123696))
- AuthenticationConfigurationにaudienceMatchPolicyフィールドを追加し複数のaudienceの設定をサポートします。"audienceMatchPolicy"は"audiences"フィールドに1つのaudienceしか指定しない場合は空に(またはアンセット)することできます。"audienceMatchPolicy"複数のaudienceが"audiences"フィールドに指定されているときは"MatchAny"をセットしなければなりません。 ([#123165](https://github.com/kubernetes/kubernetes/pull/123165))
- ファイルに一貫したvanity importを追加し、それを検証・更新するためのツールを提供します。([#120642](https://github.com/kubernetes/kubernetes/pull/120642))
- `PodSecurityContext`とコンテナの`SecurityContext`フィールドを通してAppArmor profileが設定できるようになりました。ベータのAppArmorアノテーションは非推奨になり、AppArmor statusはnode ready conditionに含まれなくなります。([#123435](https://github.com/kubernetes/kubernetes/pull/123435))
- kube-apiserver: `--authorization-config` fileで受け入れられるAuthorizationConfiguration typeは`apiserver.config.k8s.io/v1beta1`に昇格しました。([#123640](https://github.com/kubernetes/kubernetes/pull/123640)
- CEL式の設定に基づいて主張されたユーザ名が空文字列の場合、OIDC認証が失敗するようになりました。以前はリクエストは認証されユーザ名には空文字がセットされました。([#123568](https://github.com/kubernetes/kubernetes/pull/123568))
- Structured Authentication Configurationは複数のJWT authenticatorをサポートします。設定可能な最大のJWT authenticatorは64です。([#123431](https://github.com/kubernetes/kubernetes/pull/123431)
- Kubernetesコンポーネントのテキストロギングは[textlogger](https://pkg.go.dev/k8s.io/klog/v2@v2.120.0/textlogger)が使われるようになりました。infoエントリのバッファリングでinfoおよびerrorログエントリの同じsplit streamがテキスト出力でもサポートされるようになりました。以前はこれはJSONに対してのみサポートされていました。split streamなしでもパフォーマンスが向上しています。 ([#114672](https://github.com/kubernetes/kubernetes/pull/114672))
- APIサーバはJWT authenticatorsとサービスアカウント設定でissuerがコンフリクトしていた場合、起動時に検知し失敗するようになりました。以前はそのような設定は起動できましたが、クレデンシャルによって効果が一環しないことがありました。([#123561](https://github.com/kubernetes/kubernetes/pull/123561)
- `--authentication-config` フラグを通してセットされたJWT authenticator設定がディスク上のファイルが変更されると動的にリロードされるようになりました。([#123525](https://github.com/kubernetes/kubernetes/pull/123525)
- `StructuredAuthenticationConfiguration` 機能はベータとなり有効になりました。([#123719](https://github.com/kubernetes/kubernetes/pull/123719)
- kubernetes repoはGoワークスペースを使用するようになりました。これはエンドユーザーには全く影響しないはずですが、ダウンストリームプロジェクトの開発者には影響があります。ワークスペースに切り替えたことで、様々なk8s.io/code-generatorツールのフラグにいくつか破壊的な変更がありました。ダウンストリームのコンシューマは、staging/src/k8s.io/code-generator/kube_codegen.sh を見て、変更を確認する必要があります。 ([#123529](https://github.com/kubernetes/kubernetes/pull/123529))
-  `…/serviceaccounts/<name>/token`リソースハンドラが使うauditアノテーションが更新されました。クレデンシャル識別子を永続化するために使用されるアノテーションは `authentication.kubernetes.io/issued-credential-id` になりました。 ([#123098](https://github.com/kubernetes/kubernetes/pull/123098))
- ValidatingAdmissionPolicyがGAに昇格しデフォルトで有効になりました。([#123405](https://github.com/kubernetes/kubernetes/pull/123405))
### Feature
- Pod API で、コンテナ内の alpha `procMount` フィールドを `Unmasked` に設定するには、`spec.hostUsers=false` も設定が必要になりました。. ([#123520](https://github.com/kubernetes/kubernetes/pull/123520))
- kube-apiserverは`--authorization-config`ファイルが変更されるとリロードするようになりました。リロードに成功した場合`status="success"`で失敗した場合は`status="failed"`で`apiserver_authorization_config_controller_automatic_reload_last_timestamp_seconds` タイムスタンプメトリックをでインクリメントします。リロードに失敗した場合は以前にロードされたauthorization configurationがキープされます。 ([#121946](https://github.com/kubernetes/kubernetes/pull/121946))
- kube-apiserverはauthorization webhookのマッチ条件について以下のメトリクスを報告するようになりました：([#123611](https://github.com/kubernetes/kubernetes/pull/123611))
	- `apiserver_authorization_match_condition_evaluation_errors_total` authorizerの種類と名前によってラベル付けされたカウンターメトリック
	- `apiserver_authorization_match_condition_exclusions_total` authorizerの種類と名前によってラベル付けされたカウンターメトリック
	- `apiserver_authorization_match_condition_evaluation_seconds` authorizerの種類と名前によってラベル付けされたヒストグラムメトリック
- kube-apiserver: JWT authenticatorは以下のメトリクスを報告するようになりました:  ([#123793](https://github.com/kubernetes/kubernetes/pull/123793))
	- apiserver_authentication_config_controller_automatic_reloads_total
	- apiserver_authentication_config_controller_automatic_reload_last_timestamp_seconds
- kube-apiserver: StructuredAuthorizationConfiguration feature gateはbetaに昇格し `--authorization-configuration` flagが使用できるようになりました。[#123641](https://github.com/kubernetes/kubernetes/pull/123641))
- 新しい`apiserver_encryption_config_controller_automatic_reloads_total`メトリックがAPIサーバのencrytion configurationのリロード成功・失敗を計測するために追加されました。このメトリックは`status`ラベルを含み、`success`または`failure`の値となります。`apiserver_encryption_config_controller_automatic_reload_success_total`と `apiserver_encryption_config_controller_automatic_reload_failure_total`メトリクスは非推奨となります。かわりに`apiserver_encryption_config_controller_automatic_reloads_total`を使用してください。 ([#123179](https://github.com/kubernetes/kubernetes/pull/123179))
-  kube-apiserverは、JWT authenticator トークン認証のレイテンシメトリックを、jwtIssuerハッシュと結果でラベル付けされた `apiserver_authentication_jwt_authenticator_latency_seconds` メトリックで報告するようになりました。([#123225](https://github.com/kubernetes/kubernetes/pull/123225))
- kube-apiserverは認可判断のメトリクスをauthorizerの種類と名前、判断でラベル付けされた`apiserver_authorization_decisions_total`で報告するようになりました。 ([#123333](https://github.com/kubernetes/kubernetes/pull/123333))
- kube-apiserver: Authorization webhooksは以下のメトリクスを報告するようになりました: 
	- apiserver_authorization_webhook_evaluations_total
	- apiserver_authorization_webhook_duration_seconds
	- apiserver_authorization_webhook_evaluations_fail_open_total ([#123639](https://github.com/kubernetes/kubernetes/pull/123639))
- Node情報がPodに紐付くサービスアカウントトークンに追加のメタデータとして埋め込まれるようになりました。`JTI`フィールドは発行されたサービスアカウントトークンにセットされ、この情報はユーザのExtraInfoに`authentication.kubernetes.io/credential-id`として埋め込まれます。 ([#123135](https://github.com/kubernetes/kubernetes/pull/123135))
- ValidatingAdmissionPolicy は、すべてのバージョンの authentication.k8s.io および authorization.k8s.io グループから TokenReview、SelfSubjectReview、LocalSubjectAccessReview、および SubjectAccessReview を除外するようになりました。 ([#123543](https://github.com/kubernetes/kubernetes/pull/123543))
    - :pencil2: ユーザがtokenreviewやsubjectaccessreviewなど認証・認可の結果を変えてしまうポリシーを定義できてしまう状態だったようです。実際に1.29で以下のポリシーを適用できることを確認しました。
    ```yaml
    apiVersion: admissionregistration.k8s.io/v1beta1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: test-policy
    spec:
      matchConstraints:
        resourceRules:
        - apiGroups:   ["authentication.k8s.io"]
          apiVersions: ["v1"]
          operations:  ["CREATE", "UPDATE"]
          resources:   ["tokenreviews"]
      validations:
      - expression: "object.spec.token == string"
        message: "This is test policy"
    ```
    上記ポリシーを紐づけた上でTokenReview APIに問い合わせた結果。 (https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/)
    ```json
    {
      "kind": "Status",
      "apiVersion": "v1",
      "metadata": {},
      "status": "Failure",
      "message": "tokenreviews.authentication.k8s.io \"Unknown\" is forbidden: ValidatingAdmissionPolicy 'test-policy' with binding 'test-binding' denied request: This is test policy",
      "reason": "Invalid",
      "details": {
        "name": "Unknown",
        "group": "authentication.k8s.io",
        "kind": "tokenreviews",
        "causes": [
          {
            "message": "ValidatingAdmissionPolicy 'test-policy' with binding 'test-binding' denied request: This is test policy"
          }
        ]
      },
      "code": 422
    }
    ```
### Documentation

N/A

### Failing Test

N/A

### Bug or Regression

- `map(...).exists(...)`のような`map()`演算の結果に対して演算を行う式のCEL見積もりコストが、無限ではなく正しい見積もりコストになるように修正されました。 ([#123562](https://github.com/kubernetes/kubernetes/pull/123562))
- `--authentication-config`を介して設定されたJWT authenticatorが、RS256で署名されていないトークンの検証に失敗する問題に対処した。([#123282](https://github.com/kubernetes/kubernetes/pull/123282))
- サービスアカウントとOIDC認証で使用されるJWTは、コンパクトなシリアライズを使用していることを確認するために厳密にパースされるようになりました。他のエンコーディングは、以前は受け入れられませんでしたが、異なる不特定なエラーが発生します。([#123540](https://github.com/kubernetes/kubernetes/pull/123540))
-  `CVE-2024-24786`を解決するために google.golang.org/protobuf を `v1.33.0` に更新しました。 ([#123758](https://github.com/kubernetes/kubernetes/pull/123758)
### Other (Cleanup or Flake)
- GAのfeature-gate`APISelfSubjectReview`は削除され、機能は無条件に有効になります([#122032](https://github.com/kubernetes/kubernetes/pull/122032))
- `LegacyServiceAccountTokenCleanUp`はGAに昇格しデフォルトに固定されます([#122635](https://github.com/kubernetes/kubernetes/pull/122635))
- `LegacyServiceAccountTokenTracking`(1.28からGA)のfeature gateは無条件に有効なため削除されました。([#122409](https://github.com/kubernetes/kubernetes/pull/122409))