Kubernetes 1.36 – 新しいセキュリティ機能

Image

Kubernetes 1.36はまもなくリリースされ、60の機能拡張をもたらします。特に注目すべき点は、動的リソース割り当て(DRA)を改善するための努力です。

セキュリティの観点から、アドミッション制御設定、証明書処理など、22の変更があります。

詳しく見てみましょう!

Kubernetes 1.36のセキュリティ変更(破壊的な可能性)

#5707 service.spec.externalIPsの廃止

SIGグループ: sig-network
ステージ: 廃止から廃止/削除
機能ゲート:
AllowServiceExternalIPs デフォルト: true

service.spec.externalIPsは、非特権ユーザーが適切な認可または検証なしに任意のアドレスを要求することを許可していました。中間者攻撃およびその他のエクスプロイトを可能にする可能性があるため、長くセキュリティ上のリスクと見なされています。

⚠️ Kubernetes 1.36以降、このフィールドは廃止されます。プロセス全体は4つのステージで実行されます:

  • 1.36 AllowServiceExternalIPs機能ゲートを追加して、kube-proxyがexternalIPsのルール設定を停止します。
  • 1.40で、機能ゲートがデフォルトで無効になります。
  • 1.43で、機能ゲートは完全に無効になり、関連コードはkube-proxyから削除されます。
  • 1.46で、AllowServiceExternalIPs機能ゲートとDenyServiceExternalIPsアドミッション制御が削除されます。

AllowServiceExternalIPs機能ゲートをできるだけ早く無効にしてください。externalIPsを積極的に使用している場合は、より安全な代替案の実装を計画してください。

#3104 kubectlユーザー設定をクラスター設定から分離

SIGグループ: sig-cli
ステージ: 主要な変更からベータ
機能ゲート:
StorageVersionMigrator デフォルト: true

Kubernetes 1.35以降、新しいkuberc設定ファイルがクラスター認証情報とサーバー設定をユーザー固有の設定から明確に分離しています。

Kubernetes 1.36では、kubectl kuberc setを介した認証情報プラグインポリシー/許可リストのサポートなどの機能が追加されました。

⚠️ アルファからの重要な変更:commandのエイリアスと見なされていたnameフィールドは、廃止されました。

✅ 設定ファイルを確認し、ユーザー固有の設定のnameフィールドをcommandに置き換えてください。

#4317 Pod証明書

SIGグループ: sig-auth
ステージ: 主要な変更からベータ
機能ゲート:
PodCertificateRequest デフォルト: true

Kubernetes 1.35では、この拡張機能により証明書署名要求APIを使用してワークロード用の証明書を提供できました。これにはPodCertificateRequest APIとPodCertificateボリュームソースが含まれていました。

⚠️ Kubernetes 1.36は、PKIXPublicKeyProofOfPossessionフィールドを新しいStubPKCS10Requestフィールドに統合します。これは、証明書を発行する際にPKCS10要求を入力として必要とする最も一般的なCA実装とより良く整合しています。

PodCertificateRequest設定を確認し、1.36にアップグレードする際に設定を更新してください。

#4858 IP/CIDR検証の改善

SIGグループ: sig-network
ステージ: ベータに卒業
機能ゲート: StrictIPCIDRValidation デフォルト: true

この拡張機能は、CVE-2021-29923で説明されているようなセキュリティインシデントにつながる可能性のある曖昧な値を避けるため、IPおよびCIDRの検証を強化します。

特に、012.000.001.002のような先頭ゼロを含むアドレス、および::ffff:1.2.3.4のようなIPv4アドレスがIPv6にマッピングされたアドレスをカバーしています。

⚠️ 既存の値はクラスターを破壊しませんが、新しい無効な値を含む設定を適用するとエラーがスローされます。

✅ 設定を確認し、必要に応じて値を修正してください。

その他の廃止予定事項

これらは、Kubernetes 1.36にアップグレードする際に念頭に置いておくべき古い廃止予定事項です:

Kubernetes 1.36の新しいセキュリティ拡張機能

#5793 マニフェストベースのアドミッション制御設定

SIGグループ: sig-api-machinery
ステージ: 新規からアルファ
機能ゲート: ManifestBasedAdmissionControlConfig デフォルト: false

この変更は、現在etcdに保存されているアドミッション制御設定を、kube-apiserverのファイルベースマニフェストに移動することを目的としています。

歴史的に、Kubernetesはetcdを信頼のソースとして信頼してきました。これにはセキュリティルールも含まれます。セキュリティシステムが保護している同じ場所に保存されているため、これは循環依存の問題を表します。これにはいくつかの問題が生じます:

  • スタートアップギャップ:これらのオブジェクトはアドミッション制御で作成されており、スタートアップ時はアクティブではありません。つまり、ポリシーがまだ適用されていないウィンドウが存在し、脆弱性が生じます。
  • ポリシー削除:十分な権限を持つ悪意のある行為者はアドミッションポリシーを削除できます。
  • スタートアップetcd依存性:スタートアップ時にetcdが破損したり利用不可になったりした場合、アドミッションポリシーが適切に読み込まれません。

⚠️ 機能フラグをオンにするだけでは、この変更を有効にするのに十分ではありません。admission-config.yamlファイルを追加する必要があります。

AdmissionConfigurationファイルを有効にし、以下を追加してください:

--admission-control-config-file=/etc/kubernetes/admission-config.yaml

Kubernetes 1.36はこれらのセキュリティ機能をデフォルトで有効にします

#4828 Kubernetesコンポーネント用Flagz

SIGグループ: sig-instrumentation
ステージ: ベータに卒業
機能ゲート: ComponentFlagz デフォルト: true

statusZページと同様に、flagzエンドポイントはKubernetesコンポーネントのランタイム診断を提供します。特に、コンポーネントを起動するために使用されたコマンドライン引数を提供します。

クラスター管理者はこのツールを使用して、すべてのコンポーネントが期待される設定で実行されており、セキュリティポリシーから逸脱していないことを確認できます。

ℹ️ Kubernetes 1.32 – 新機能は何ですか?をお読みください

#5284 制限付き偽装

SIGグループ: sig-auth
ステージ: ベータに卒業
機能ゲート: ConstrainedImpersonation デフォルト: true

偽装により、ユーザーは別のユーザーとして動作でき、認可ポリシーをデバッグする管理者などの内部ツールに便利です。

問題は、現在のメカニズムでは、ユーザーは意図したよりも多くの権限を持つ他のユーザーを偽装することもできるという点です。これが、新しい制限付き偽装機能が偽装時にユーザーの権限を制限するための追加チェックを追加する理由です。

ℹ️ Kubernetes 1.35 – 新機能は何ですか?をお読みください

その他の既存機能におけるKubernetes 1.36の変更

#4192 ストレージバージョンマイグレーターをインツリーに移動

SIGグループ: sig-api-machinery
ステージ: 主要な変更からベータ
機能ゲート: StorageVersionMigrator デフォルト: true

Kubernetes 1.30では、この拡張機能は保存データを内部で移行できるようにしました。その前は、新しいスキーマバージョンまたは新しい暗号化キーに移行するには、kubectl get <resource> | kubectl replace -を使用してデータを手動で抽出および再書き込みする必要がありました。

これはスケーリングしないだけでなく、すべてのこのデータを抽出することはセキュリティリスクです。

この拡張機能のおかげで、kubectl apply -fを実行するだけで済みます。

⚠️ Kubernetes 1.36以降、CRDのstatus.storedVersionsフィールドには最新バージョンのリソースのみが含まれるため、管理者は古いバージョンを削除できます。

ℹ️ この機能のドキュメントを確認して、完全な詳細を確認してください。

#5607 HostNetworkポッドでユーザーネームスペースを使用できるようにする

SIGグループ: sig-node
ステージ: 主要な変更からアルファ
機能ゲート: UserNamespacesHostNetworkSupport デフォルト: false

Kubernetes 1.35以降、hostNetwork: trueでホストネットワークに直接アクセスするポッドは、hostUsers: falseを使用してホストではなくユーザーネームスペースを使用することもできます。ユーザーネームスペースでは、侵害されたコンテナをエスケープするのに成功した攻撃者は、ホストレベルで権限が低下します。

ℹ️ Kubernetes 1.36では、hostNetwork: truehostUsers: falseを使用するノードは、この機能をサポートすることを明示的に宣言するノードでのみスケジュールされます。

Kubernetes 1.36のセキュリティ機能が安定版に卒業

#127 ポッドでユーザーネームスペースをサポート

SIGグループ: sig-node
ステージ: 安定版に卒業

ユーザーネームスペースは、コンテナで実行中のプロセスをホストのユーザーから分離することにより、ポッドの分離を強化します。

これは、特にrootで実行する必要があるポッドに便利です。ユーザーネームスペースを活用して、ポッド内でプロセスをrootとして実行できるが、実際にはホストで非特権として実行されます。

そのようなポッドが侵害され、攻撃者がコンテナから脱出することができた場合、影響は限定的です。攻撃者は非特権ユーザーになるためです。

ポッド記述でhostUsers: falseを設定することで、この機能を有効にできます。

ℹ️ Kubernetes 1.25 – 新機能は何ですか?をお読みください

#740 サービスアカウントトークンの外部署名用API

SIGグループ: sig-auth
ステージ: 安定版に卒業

長い間、kube-apiserverは外部キー管理ソリューションを使用してサービスアカウント認証情報に署名および検証することができました。この機能は安定していると見なされるようになりました。

ℹ️ ドキュメントを確認して、完全な情報を確認してください。

#1710 再帰的SELinuxラベル変更を高速化

SIGグループ: sig-storage
ステージ: 安定版に卒業

この機能は、SELinuxを使用する場合のPersistentVolumesのマウントを高速化します。マウント時にcontextオプションを使用することにより、Kubernetesはセキュリティコンテキストを個々のファイルに再帰的に変更する代わりに、ボリュー全体に適用します。

この拡張機能はKubernetes 1.24以降開発されており、ようやく安定していると見なされています。

ℹ️ Kubernetes 1.30 – 新機能は何ですか?をお読みください

#2862 細粒度Kubelet API認可

SIGグループ: sig-node
ステージ: 安定版に卒業

この改善は、ノードエンドポイントの現在のアクセス制御にさらなる粒度を与えます。たとえば、ノード上のポッドをリストする必要があるエージェントがあったと想像してください。以前は、nodes/proxy権限を付与する必要がありました。これは最小権限の原則に明らかに違反しています!

細粒度Kubelet API認可により、以下のようなリソースへのアクセスを許可できます:

  • nodes/configz
  • nodes/healtz
  • nodes/pods

ℹ️ Kubernetes 1.33 – 新機能は何ですか?をお読みください

#3962 ミューティングアドミッションポリシー

SIGグループ: sig-api-machinery
ステージ: 安定版に卒業

アドミッション制御が行うミューテーションのほとんどは、ラベルとフィールドを設定したりサイドカーを追加したりするような単純な編集です。この拡張機能は、Common Expression Language(CEL)を使用してYAMLでこれらの変更を直接定義するメカニズムを追加し、ほとんどの場合、webhookの必要性を排除しました。

ℹ️ Kubernetes 1.31 – 新機能は何ですか?をお読みください

#2258 ノードログクエリ

SIGグループ: sig-windows
ステージ: 安定版に卒業

この拡張機能は、ノードで実行中のシステムのログを表示するためのkubeletネイティブAPIを導入し、ノードにSSHでログを表示する必要性を排除しました。

たとえば、ノードからkubeletログをフェッチするには、以下を使用できます:

kubectl get --raw "/api/v1/nodes/node-1/logs?query=kubelet"

ℹ️ Kubernetes 1.27 – 新機能は何ですか?をお読みください

#4205 cgroupv2に基づくPSIをサポート

SIGグループ: sig-node
ステージ: 安定版に卒業

PSI(Pressure Stall Information)は2018年に導入されたLinuxカーネル機能で、以下を測定します:

  • CPU圧力
  • メモリ圧力
  • I/O圧力

使用量に依存する(例えば、CPU使用率が45%)代わりに、プレッシャーはタスクがリソースを待機するのに費やす時間を測定し、一部のアプリケーションにとってより正確なメトリクスである可能性があります。

ℹ️ この機能を使用するには、PSIサポート(通常はそのはず)を使用してLinuxで実行しており、cgroup v2を有効にする必要があることに注意してください。

#4265 ProcMountオプションを追加

SIGグループ: sig-node
ステージ: 安定版に卒業

Linuxシステムでは、/procファイルシステムはカーネルデータ構造のインターフェースであり、以下に関する情報を提供します:

  • プロセス
  • ハードウェア
  • システム状態
  • その他

Kubernetesでは、セキュリティを強制するために、/procの一部がマスキングされ、ホスト情報の偶発的な公開を防ぎます。ただし、特定の部分をマスク解除したい場合があります。

そのような場合の1つは、containers-in-containersシナリオまたは別のコンテナを実行する必要があるコンテナで作業する場合です。これはKubernetes Pod内でコンテナイメージをビルドする必要があるCI/CDパイプラインでは非常に一般的です。これらの場合、親コンテナはネストされたコンテナの/procに書き込む必要があります。

この機能の前に、ユーザーは完全に特権を持つコンテナを実行する必要がありました。これは、はるかに危険なシナリオです。

この機能は、securityContext定義に新しいProcMountType文字列を追加します。2つの可能な値があります:DefaultUnmasked

ℹ️ hostUsers: falseを使用する必要があります。そうしないと、APIサーバーがProcMountType変更を拒否します。

#4639 VolumeSource:OCIアーティファクトおよび/またはイメージ

SIGグループ: sig-node
ステージ: 安定版に卒業

Kubernetesは、OCIアーティファクトとイメージをボリュームソースとして使用できるようになりました。

簡単な使用例は、nginx、すべてのWebサイトポッドが同じベースイメージ(イメージボリュームを使用するように適応)を使用でき、設定とWebアセットを別の最小限のイメージにデプロイできるようなWebサーバーです。

⚠️ このようにOCIイメージのマウントを許可することは、潜在的な攻撃ベクトルへのドアを開きます。

✅ この機能を有効にする前に、セキュリティポリシーを強化し、信頼できないレジストリからのイメージのマウントや実行可能なコンテンツを含むイメージを許可しないでください。イメージボリュームを定義するポッドをブロックすることを検討してください。

ℹ️ Kubernetes 1.35 – 新機能は何ですか?をお読みください

#5018 DRA:ResourceClaimsおよびResourceClaimTemplatesの管理者アクセス

SIGグループ: sig-node
ステージ: 安定版に卒業

Dynamic Resource Allocation(DRA)は、特殊なハードウェア(GPUやFPGAなど)へのアクセスをより良く割り当てるためにKubernetesに追加された機能です。実際には、別のユーザーによって既に使用中のデバイスへの特権アクセスを得ることを意味します。

この拡張機能は、セキュリティを損なわずに、この特権アクセスを許可します。

ResourceClaimおよびResourceClaimTemplateの新しいadminAccessフラグを介してアクセスをリクエストできます:

apiVersion: resource.k8s.io/v1beta1
kind: ResourceClaim
metadata:
  name: admin-resource-claim
  namespace: admin-namespace
spec:
  devices:
    requests:
      - deviceClassName: admin-resource-class
        adminAccess: true

ネームスペースは、これらのクレームの作成を許可するために、管理者アクセスでマークされている必要があります:

resource.kubernetes.io/admin-access: "true"

#5538 SecretsフィールドでのCSIドライバーのサービスアカウントトークンへのオプトイン

SIGグループ: sig-storage
ステージ: 安定版に卒業

この拡張機能は、クラウドバケットをマウントするために使用されるアカウントトークンなどの機密データを安全に保存するための新しいSecretsフィールドを導入しています。serviceAccountTokenInSecretsフィールドがtrueの場合、CSIドライバーはSecretsフィールドでトークンを検索します。

ℹ️ Kubernetes 1.35 – 新機能は何ですか?をお読みください

#5589 Kubernetes APIタイプのgogo protobuf依存関係を削除

SIGグループ: sig-api-machinery
ステージ: 主要な変更から安定版

Kubernetes APIはgogo protobufに依存しています。ただし、このライブラリは2021年に廃止されました。これはセキュリティリスクをもたらす可能性があるため、この依存関係を削除するための作業が進行中です。

この拡張機能は、Kubernetes APIオブジェクトからこれらの依存関係を削除することに焦点を当てています。代わりに、標準のgolang protobufライブラリが使用されます。

ℹ️ Kubernetes 1.36では、作業はProtoMessageメソッドを削除することに焦点を当てています。実装の詳細を確認するか、PRに入ってみてください

まとめ

これが気に入った場合は、前の「Kubernetesの新機能」版を確認することをお勧めします:

Kubernetesプロジェクトに関与してください:

翻訳元: https://webflow.sysdig.com/blog/kubernetes-1-36-new-security-features

ソース: webflow.sysdig.com