Google Kubernetes Engine(GKE)のセキュア カーネル モジュールの読み込みを使用すると、署名付きのツリー外(OOT)カーネル モジュールを必要とするワークロードを安全な Container-Optimized OS イメージで実行できます。セキュア カーネル モジュールの読み込みにより、署名検証を使用して CPU ノードまたは TPU ノードにモジュールを読み込む際の制御を強化することで、クラスタとノードプールのセキュリティ対策を強化できます。
セキュア カーネル モジュールの読み込みの仕組み
デフォルトでは、GKE ノードはノードタイプに応じて、さまざまなセキュリティ構成のさまざまな Container-Optimized OS イメージを使用します。
- CPU ノードと TPU ノード: Linux Security Module(LSM)Loadpin が有効になっている Container-Optimized OS イメージを使用します。Loadpin は、OOT カーネル モジュールの読み込みを制限します。この設定は安全ですが、OOT モジュールの読み込みが阻止されます。
- GPU ノード: Loadpin が無効になっている Container-Optimized OS イメージを使用します。この設定では、NVIDIA ドライバのインストールなどの OOT モジュールを読み込みが許可されますが、デフォルトでは安全性が低くなります。
セキュア カーネル モジュールの読み込みを有効にするには、ノードプールの LinuxNodeConfig で NodeKernelModuleLoading.Policy 設定を使用するか、クラスタまたはノードプールの作成時または更新時に --enable-kernel-module-signature-enforcement フラグを渡します。ポリシーを ENFORCE_SIGNED_MODULES に設定すると、CPU または TPU ノードプールで Loadpin が有効になりますが、ルート ファイルシステムの外部からのカーネル モジュールの読み込みを許可するように構成されます。モジュールは署名されている必要があり、システムは Google によって署名されたモジュールのみを許可します。
セキュア カーネル モジュールの読み込みを使用する場合
Google によって署名された OOT カーネル モジュール(カスタム ドライバや Lustre などのファイル システムなど)を任意の GKE ノードタイプで読み込む必要がある場合は、セキュア カーネル モジュールの読み込みを使用します。この機能を使用すると、ノードのセキュリティ ポスチャーを低下させることなく、こうしたモジュールを使用できます。たとえば、制限が緩い GPU イメージタイプを使用しなくても、必要なドライバを CPU ノードに読み込むことが可能です。
要件と制限事項
ノードプールでセキュア カーネル モジュールの読み込みを有効にすると、次の要件と制限事項が適用されます。
- サポートされるモジュール: Google によって署名された OOT モジュールのみが許可されます。
- cgroup v2: ノードプールで cgroup v2 を使用する必要があります。Google Kubernetes Engine API は、cgroup v1 を使用するノードプールでこのポリシーを有効にするリクエストを拒否します。詳細については、Kubernetes cgroup のドキュメントをご覧ください。
- GKE バージョン: この機能は、GKE クラスタ バージョン 1.34.1-gke.2364000 以降で使用できます。
- GPU イメージタイプ: CPU イメージと TPU イメージのみが、セキュア カーネル モジュールの読み込みをサポートします。GPU はサポートされていません。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
セキュア カーネル モジュールの読み込みポリシーを構成する
セキュア カーネル モジュールの読み込みポリシーは、個々のクラスタで構成することも、ノードプールの設定として構成することもできます。使用可能なポリシーは次のとおりです。
ENFORCE_SIGNED_MODULES: ツリー外のカーネル モジュールが Google によって署名されることを強制します。このポリシーでは、ノードプールで cgroup v2 を使用する必要があります。DO_NOT_ENFORCE_SIGNED_MODULES: 署名付きまたは署名なしの任意のカーネル モジュールを読み込むことが可能です。これはデフォルトの動作です。
ポリシーを指定しない場合、GKE はデフォルトの動作を使用します。この動作では、署名付きモジュールは適用されません。
クラスタでセキュア カーネル モジュールの読み込みを有効にする
クラスタでセキュア カーネル モジュールの読み込みを有効にするには、次のいずれかの操作を行います。
新しいクラスタで有効にするには、次のコマンドを実行します。
Standard
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementAutopilot
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcement次のように置き換えます。
CLUSTER_NAME: 新しいクラスタの名前。LOCATION: クラスタのリージョンまたはゾーン。PROJECT_ID: プロジェクト ID。
既存のクラスタで有効にするには、次のコマンドを実行します。
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcement次のように置き換えます。
CLUSTER_NAME: クラスタの名前。LOCATION: クラスタのリージョンまたはゾーン。PROJECT_ID: プロジェクト ID。
既存のクラスタを更新すると、メンテナンスの時間枠によって妨げられない限り、次回の利用可能な機会でノードが再作成されます。
ノードプールでセキュア カーネル モジュールの読み込みを有効にする
ノードプールでセキュア カーネル モジュールの読み込みを有効にするには、次のいずれかの操作を行います。
新しいノードプールで有効にするには、次のコマンドを実行します。
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcement次のように置き換えます。
NODEPOOL_NAME: 新しいノードプールの名前。CLUSTER_NAME: クラスタの名前。LOCATION: クラスタのリージョンまたはゾーン。PROJECT_ID: プロジェクト ID。
既存のノードプールで有効にするには、次のコマンドを実行します。
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcement次のように置き換えます。
NODEPOOL_NAME: 更新するノードプールの名前。CLUSTER_NAME: クラスタの名前。LOCATION: クラスタのリージョンまたはゾーン。PROJECT_ID: プロジェクト ID。
セキュア カーネル モジュール ポリシーが設定されていることを確認する
クラスタにポリシーが設定されていることを確認するには、次のコマンドを実行します。
gcloud container node-pools describe NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID
出力で、linuxNodeConfig セクションを確認します。kernelModuleLoading フィールドには、現在のポリシーが表示されます。
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
セキュア カーネル モジュールの読み込みを無効にする
セキュア カーネル モジュールの読み込みを無効にするには、次のいずれかの手順を行います。
クラスタで無効にするには、次のコマンドを実行します。
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement既存のノードプールで無効にするには、次のコマンドを実行します。
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement
次のステップ
- クラスタのセキュリティを強化する方法について理解する。