はじめに
このページではKubernetes v1.30におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.30: 変更点まとめも確認してみてください。
所感
今バージョンではAlphaの機能などは追加されておらず、v1.29で紹介した StructuredAuthenticationConfiguration と StructuredAuthorizationConfigurationがベータに昇格しており、それに伴う機能改善・修正やメトリクスの整備がありました。
Changes by Kind
Deprecation
-
v1.27から非推奨となっていたSecurityContextDenyadmission pluginは削除されました。代わりにv1.25から利用可能になっているPod Security Admission pluginの利用が推奨されています。詳細は Kubernetes documentationを参照してください。(#122612)
API Change
- Dynamic Resource Allocation: DRAドライバは"structured parameters"使用し、クレーム割り当てをスケジューラに任せることができるようになりました。(#123516)
- Structured Authentication Configurationが
DiscoveryURLをサポートしました。指定された場合discoveryURLはディスカバリ情報を取得するために使用される URL を上書きします。これは、well-knownとjwksのエンドポイントが発行元とは異なる場所(クラスタ内のローカルなど)でホストされている場合のシナリオのためです。(#123527) - 以前はCRDで利用可能だった
StorageVersionMigrationAPIはKubernetesのビルトインAPIになりました。 (#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) - kube-apiserver:
--authentication-configファイルで受け入れられるAuthenticationConfiguration typeはapiserver.config.k8s.io/v1beta1に昇格しました。(#123696) - AuthenticationConfigurationにaudienceMatchPolicyフィールドを追加し複数のaudienceの設定をサポートします。"audienceMatchPolicy"は"audiences"フィールドに1つのaudienceしか指定しない場合は空に(またはアンセット)することできます。"audienceMatchPolicy"複数のaudienceが"audiences"フィールドに指定されているときは"MatchAny"をセットしなければなりません。 (#123165)
- ファイルに一貫したvanity importを追加し、それを検証・更新するためのツールを提供します。(#120642)
-
PodSecurityContextとコンテナのSecurityContextフィールドを通してAppArmor profileが設定できるようになりました。ベータのAppArmorアノテーションは非推奨になり、AppArmor statusはnode ready conditionに含まれなくなります。(#123435) - kube-apiserver:
--authorization-configfileで受け入れられるAuthorizationConfiguration typeはapiserver.config.k8s.io/v1beta1に昇格しました。(#123640 - CEL式の設定に基づいて主張されたユーザ名が空文字列の場合、OIDC認証が失敗するようになりました。以前はリクエストは認証されユーザ名には空文字がセットされました。(#123568)
- Structured Authentication Configurationは複数のJWT authenticatorをサポートします。設定可能な最大のJWT authenticatorは64です。(#123431
- Kubernetesコンポーネントのテキストロギングはtextloggerが使われるようになりました。infoエントリのバッファリングでinfoおよびerrorログエントリの同じsplit streamがテキスト出力でもサポートされるようになりました。以前はこれはJSONに対してのみサポートされていました。split streamなしでもパフォーマンスが向上しています。 (#114672)
- APIサーバはJWT authenticatorsとサービスアカウント設定でissuerがコンフリクトしていた場合、起動時に検知し失敗するようになりました。以前はそのような設定は起動できましたが、クレデンシャルによって効果が一環しないことがありました。(#123561
-
--authentication-configフラグを通してセットされたJWT authenticator設定がディスク上のファイルが変更されると動的にリロードされるようになりました。(#123525 -
StructuredAuthenticationConfiguration機能はベータとなり有効になりました。(#123719 - kubernetes repoはGoワークスペースを使用するようになりました。これはエンドユーザーには全く影響しないはずですが、ダウンストリームプロジェクトの開発者には影響があります。ワークスペースに切り替えたことで、様々なk8s.io/code-generatorツールのフラグにいくつか破壊的な変更がありました。ダウンストリームのコンシューマは、staging/src/k8s.io/code-generator/kube_codegen.sh を見て、変更を確認する必要があります。 (#123529)
-
…/serviceaccounts/<name>/tokenリソースハンドラが使うauditアノテーションが更新されました。クレデンシャル識別子を永続化するために使用されるアノテーションはauthentication.kubernetes.io/issued-credential-idになりました。 (#123098) - ValidatingAdmissionPolicyがGAに昇格しデフォルトで有効になりました。(#123405)
Feature
- Pod API で、コンテナ内の alpha
procMountフィールドをUnmaskedに設定するには、spec.hostUsers=falseも設定が必要になりました。. (#123520) - kube-apiserverは
--authorization-configファイルが変更されるとリロードするようになりました。リロードに成功した場合status="success"で失敗した場合はstatus="failed"でapiserver_authorization_config_controller_automatic_reload_last_timestamp_secondsタイムスタンプメトリックをでインクリメントします。リロードに失敗した場合は以前にロードされたauthorization configurationがキープされます。 (#121946) - kube-apiserverはauthorization webhookのマッチ条件について以下のメトリクスを報告するようになりました:(#123611)
-
apiserver_authorization_match_condition_evaluation_errors_totalauthorizerの種類と名前によってラベル付けされたカウンターメトリック -
apiserver_authorization_match_condition_exclusions_totalauthorizerの種類と名前によってラベル付けされたカウンターメトリック -
apiserver_authorization_match_condition_evaluation_secondsauthorizerの種類と名前によってラベル付けされたヒストグラムメトリック
-
- kube-apiserver: JWT authenticatorは以下のメトリクスを報告するようになりました: (#123793)
- apiserver_authentication_config_controller_automatic_reloads_total
- apiserver_authentication_config_controller_automatic_reload_last_timestamp_seconds
- kube-apiserver: StructuredAuthorizationConfiguration feature gateはbetaに昇格し
--authorization-configurationflagが使用できるようになりました。#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) - kube-apiserverは、JWT authenticator トークン認証のレイテンシメトリックを、jwtIssuerハッシュと結果でラベル付けされた
apiserver_authentication_jwt_authenticator_latency_secondsメトリックで報告するようになりました。(#123225) - kube-apiserverは認可判断のメトリクスをauthorizerの種類と名前、判断でラベル付けされた
apiserver_authorization_decisions_totalで報告するようになりました。 (#123333) - kube-apiserver: Authorization webhooksは以下のメトリクスを報告するようになりました:
- apiserver_authorization_webhook_evaluations_total
- apiserver_authorization_webhook_duration_seconds
- apiserver_authorization_webhook_evaluations_fail_open_total (#123639)
- Node情報がPodに紐付くサービスアカウントトークンに追加のメタデータとして埋め込まれるようになりました。
JTIフィールドは発行されたサービスアカウントトークンにセットされ、この情報はユーザのExtraInfoにauthentication.kubernetes.io/credential-idとして埋め込まれます。 (#123135) - ValidatingAdmissionPolicy は、すべてのバージョンの authentication.k8s.io および authorization.k8s.io グループから TokenReview、SelfSubjectReview、LocalSubjectAccessReview、および SubjectAccessReview を除外するようになりました。 (#123543)
-
ユーザがtokenreviewやsubjectaccessreviewなど認証・認可の結果を変えてしまうポリシーを定義できてしまう状態だったようです。実際に1.29で以下のポリシーを適用できることを確認しました。
上記ポリシーを紐づけた上でTokenReview APIに問い合わせた結果。 (https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/)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"{ "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) -
--authentication-configを介して設定されたJWT authenticatorが、RS256で署名されていないトークンの検証に失敗する問題に対処した。(#123282) - サービスアカウントとOIDC認証で使用されるJWTは、コンパクトなシリアライズを使用していることを確認するために厳密にパースされるようになりました。他のエンコーディングは、以前は受け入れられませんでしたが、異なる不特定なエラーが発生します。(#123540)
-
CVE-2024-24786を解決するために google.golang.org/protobuf をv1.33.0に更新しました。 (#123758