はじめに
このページではKubernetes v1.30におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.30: 変更点まとめも確認してみてください。
所感
今バージョンではAlphaの機能などは追加されておらず、v1.29で紹介した StructuredAuthenticationConfiguration と StructuredAuthorizationConfigurationがベータに昇格しており、それに伴う機能改善・修正やメトリクスの整備がありました。
Changes by Kind
Deprecation
-
v1.27
から非推奨となっていたSecurityContextDeny
admission 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で利用可能だった
StorageVersionMigration
APIは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-config
fileで受け入れられる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_total
authorizerの種類と名前によってラベル付けされたカウンターメトリック -
apiserver_authorization_match_condition_exclusions_total
authorizerの種類と名前によってラベル付けされたカウンターメトリック -
apiserver_authorization_match_condition_evaluation_seconds
authorizerの種類と名前によってラベル付けされたヒストグラムメトリック
-
- 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-configuration
flagが使用できるようになりました。#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