このドキュメントでは、CIS Kubernetes Benchmark の概要、ベンチマークでコンプライアンスを監査する方法について説明します。また、推奨事項を自分で実装できないベアメタル版の Anthos クラスタの構成についても説明します。
CIS ベンチマークの使用
Center for Internet Security(CIS)ではベスト プラクティスのセキュリティに関する推奨事項のベンチマークを公開しています。CIS Kubernetes Benchmark は、強固なセキュリティ状態を維持できるように Kubernetes を構成するための一連の推奨事項を提供します。ベンチマークは特定の Kubernetes リリースに関連付けられています。CIS Kubernetes Benchmark は、オープンソースの Kubernetes ディストリビューション用に記述されており、できる限り多くのディストリビューションに広く適用できるように構成されています。
バージョン
使用する 2 つのベンチマークのバージョン番号が同じとは限りませんので注意してください。
このドキュメントでは、次のバージョンを参照しています。
Anthos のバージョン | Kubernetes のバージョン | CIS Kubernetes Benchmark のバージョン |
---|---|---|
1.9.0 | 1.20.4 | 1.20 |
CIS Kubernetes Benchmark
ベンチマークへのアクセス
CIS Kubernetes Benchmark は CIS ウェブサイトで入手できます。
推奨レベル
CIS Kubernetes Benchmark では、
レベル | 説明 |
---|---|
レベル 1 | 推奨事項は以下を目的としています: |
レベル 2 | レベル 1 のプロファイルを拡張します。 推奨事項には、次の 1 つ以上の特徴があります。 |
評価ステータス
評価ステータスはすべての推奨事項に含まれます。評価ステータスは、提案された最適化案の実装が自動化できるか、または手動で手順を進める必要があるかを示します。どちらのステータスも重要であり、次の定義のように決定、サポートされます。
スコア付け | 説明 |
---|---|
自動 | 技術制御の評価を完全に自動化でき、合否の状態を判定できる場合の推奨事項を表します。推奨事項には、自動化を実装するために必要な情報が含まれます。 |
手動 | 技術制御の評価を完全に自動化できず、期待された構成状態になっていることを確認するために手動で全体または一部の手順を行う必要がある推奨事項を表します。期待される状態は環境によって異なります。 |
ベアメタル版の Anthos クラスタでの評価
ベアメタル版 Anthos クラスタでは、Kubernetes 推奨事項のステータスは、次の値を使用して指定します。
ステータス | 説明 |
---|---|
Pass | ベンチマークの推奨事項に準拠している。 |
失敗 | ベンチマークの推奨事項に準拠していない。 |
同等の統制 | ベンチマークの推奨事項を厳密には準拠していないが、同等のセキュリティ コントロールを提供する別のメカニズムがベアメタル版の Anthos クラスタに存在する。 |
環境に依存 | ベアメタル版の Anthos クラスタでは、この推奨事項に関連する項目は構成されない。ユーザー側の構成により、環境がベンチマークの推奨事項を遵守しているかどうか決まる。 |
ベアメタル版の Anthos クラスタ アーキテクチャ
ベアメタル版 Anthos クラスタは、複数のクラスタ構成とクラスタタイプをサポートしています。サポートされているすべてのクラスタタイプ(管理者、ユーザー、ハイブリッド、スタンドアロン)は、CIS ベンチマークに対して評価されます。サポートされているすべてのクラスタタイプには、次の評価と理由が適用されます。ベアメタル版 Anthos クラスタでサポートされるクラスタ構成については、デプロイモデルの選択をご覧ください。
ベアメタル版 Anthos クラスタのステータス
指定されたバージョンで新しいクラスタを作成すると、CIS Kubernetes Benchmark に対して以下のステータスを示します。
ベアメタル版 Anthos クラスタのクラスタのステータス:
# | 推奨 | レベル | ステータス |
---|---|---|---|
1 | cis-1.20 | ||
1.1 | マスターノード構成ファイル | ||
1.1.1 | API サーバーの Pod 仕様ファイルの権限が、644 またはそれより制限された値に設定されている確認する(自動) |
L1 | Pass |
1.1.2 | API サーバーの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
1.1.3 | コントローラ マネージャーの Pod 仕様ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.4 | コントローラ マネージャーの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
1.1.5 | スケジューラの Pod 仕様ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.6 | スケジューラの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
1.1.7 | etcd の Pod 仕様ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.8 | etcd の Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
1.1.9 | Container Network Interface のファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(手動) |
L1 | 同等の統制 |
1.1.10 | Container Network Interface のファイルのオーナー権限が root:root に設定されていることを確認する(手動) |
L1 | 同等の統制 |
1.1.11 | etcd データ ディレクトリの権限が、700 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.12 | etcd データ ディレクトリのオーナー権限が etcd:etcd に設定されていることを確認する(自動) |
L1 | 同等の統制 |
1.1.13 | admin. conf ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.14 | admin. conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
1.1.15 | scheduler. conf ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.16 | scheduler. conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 |
1.1.17 | controller-manager. conf ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
1.1.18 | controller-manager. conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 |
1.1.19 | Kubernetes PKI ディレクトリとファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 |
1.1.20 | Kubernetes PKI 証明書ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(手動) |
L1 | Pass |
1.1.21 | Kubernetes PKI 鍵ファイルの権限が 600 に設定されていることを確認する(手動) |
L1 | 同等の統制 |
1.2 | API サーバー | ||
1.2.1 | --anonymous-auth 引数が false に設定されていることを確認する(手動) |
L1 | 警告 |
1.2.2 | --token-auth-file パラメータが設定されていないことを確認する(自動) |
L1 | Pass |
1.2.3 | --kubelet-https 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
1.2.4 | --kubelet-client-certificate 引数と --kubelet-client-key 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.5 | --kubelet-certificate-authority 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.6 | --authorization-mode 引数が AlwaysAllow に設定されていないことを確認する(自動) |
L1 | Pass |
1.2.7 | --authorization-mode 引数にノードが含まれていることを確認する(自動) |
L1 | Pass |
1.2.8 | --authorization-mode 引数に RBAC が含まれていることを確認する(自動) |
L1 | Pass |
1.2.9 | アドミッション コントロール プラグインの EventRateLimit が設定されていることを確認する(手動) | L1 | 警告 |
1.2.10 | アドミッション コントロール プラグインの AlwaysAdmit が設定されていないことを確認する(自動) | L1 | Pass |
1.2.11 | アドミッション コントロール プラグインの AlwaysPullImages が設定されていることを確認する(手動) | L1 | 警告 |
1.2.12 | PodSecurityPolicy が使用されていない場合は、アドミッション コントロール プラグインの SecurityContextDeny が設定されていることを確認する(手動) | L1 | 警告 |
1.2.13 | アドミッション コントロール プラグインの ServiceAccount が設定されていることを確認する(自動) | L1 | Pass |
1.2.14 | アドミッション コントロール プラグインの NamespaceLifecycle が設定されていることを確認する(自動) | L1 | Pass |
1.2.15 | アドミッション コントロール プラグインの PodSecurityPolicy が設定されていることを確認する(自動) | L1 | 失敗 |
1.2.16 | アドミッション コントロール プラグインの NodeRestriction が設定されていることを確認する(自動) | L1 | Pass |
1.2.17 | --insecure-bind-address 引数が設定されていないことを確認する(自動) |
L1 | Pass |
1.2.18 | --insecure-port 引数が 0 に設定されていることを確認する(自動) |
L1 | Pass |
1.2.19 | --secure-port 引数が 0 に設定されていないことを確認する(自動) |
L1 | Pass |
1.2.20 | --profiling 引数が false に設定されていることを確認する(自動) |
L1 | Pass |
1.2.21 | --audit-log-path 引数が設定されていることを確認する(自動) |
L1 | Pass |
1.2.22 | --audit-log-maxage 引数が 30 または適切な値に設定されていることを確認する(自動) |
L1 | Pass |
1.2.23 | --audit-log-maxbackup 引数が 10 または適切な値に設定されていることを確認する(自動) |
L1 | Pass |
1.2.24 | --audit-log-maxsize 引数が 100 または適切な値に設定されていることを確認する(自動) |
L1 | Pass |
1.2.25 | --request-timeout 引数が適切に設定されていることを確認する(手動) |
L1 | 警告 |
1.2.26 | --service-account-lookup 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
1.2.27 | --service-account-key-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.28 | --etcd-certfile 引数と --etcd-keyfile 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.29 | --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.30 | --client-ca-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.31 | --etcd-cafile 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.2.32 | --encryption-provider-config 引数が適切に設定されていることを確認する(手動) |
L1 | 合格 |
1.2.33 | 暗号化プロバイダが適切に構成されていることを確認する(手動) | L1 | 合格 |
1.2.34 | API サーバーが強力な暗号のみを使用していることを確認する(手動) | L1 | Pass |
1.3 | コントローラ マネージャー | ||
1.3.1 | --terminated-pod-gc-threshold 引数が適切に設定されていることを確認する(手動) |
L1 | Pass |
1.3.2 | --profiling 引数が false に設定されていることを確認する(自動) |
L1 | Pass |
1.3.3 | --use-service-account-credentials 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
1.3.4 | --service-account-private-key-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.3.5 | --root-ca-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
1.3.6 | RotateKubeletServerCertificate 引数が true に設定されていることを確認する(自動) | L2 | Pass |
1.3.7 | --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) |
L1 | Pass |
1.4 | スケジューラ | ||
1.4.1 | --profiling 引数が false に設定されていることを確認する(自動) |
L1 | Pass |
1.4.2 | --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) |
L1 | Pass |
2 | cis-1.20 | ||
2 | Etcd ノードの構成ファイル | ||
2.1 | --cert-file 引数と --key-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
2.2 | --client-cert-auth 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
2.3 | --auto-tls 引数が true に設定されていないことを確認する(自動) |
L1 | Pass |
2.4 | --peer-cert-file 引数と --peer-key-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
2.5 | --peer-client-cert-auth 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
2.6 | --peer-auto-tls 引数が true に設定されていないことを確認する(自動) |
L1 | Pass |
2.7 | 固有の認証局が etcd に使用されていることを確認する(手動) | L2 | Pass |
3 | cis-1.20 | ||
3.1 | 認証と認可 | ||
3.1.1 | クライアント証明書の認証をユーザーに使用していないことを確認する(手動) | L2 | Pass |
3.2 | ロギング | ||
3.2.1 | 最小限の監査ポリシーが作成されていることを確認する(手動) | L1 | Pass |
3.2.2 | 監査ポリシーの対象に重要なセキュリティ問題が含まれていることを確認する(手動) | L2 | 同等の統制 |
4 | cis-1.20 | ||
4.1 | ワーカーノード構成ファイル | ||
4.1.1 | kubelet サービス ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
4.1.2 | kubelet サービス ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
4.1.3 | プロキシ kubeconfig ファイルが存在する場合は、権限が 644 またはそれより制限された値設定されていることを確認する(手動) |
L1 | Pass |
4.1.4 | プロキシの kubeconfig ファイルが存在する場合、所有権が root:root に設定されていることを確認する(手動) |
L1 | Pass |
4.1.5 | --kubeconfig kubelet. conf ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | 合格 |
4.1.6 | --kubeconfig kubelet . conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 合格 |
4.1.7 | 認証局ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(手動) |
L1 | Pass |
4.1.8 | クライアント認証局ファイルのオーナー権限が root:root に設定されていることを確認する(手動) |
L1 | Pass |
4.1.9 | kubelet の --config 構成ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) |
L1 | Pass |
4.1.10 | kubelet の --config 構成ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | Pass |
4.2 | Kubelet | ||
4.2.1 | anonymous-auth 引数が false に設定されていることを確認する(自動) | L1 | Pass |
4.2.2 | --authorization-mode 引数が AlwaysAllow に設定されていないことを確認する(自動) |
L1 | Pass |
4.2.3 | --client-ca-file 引数が適切に設定されていることを確認する(自動) |
L1 | Pass |
4.2.4 | --read-only-port 引数が 0 に設定されていることを確認する(手動) |
L1 | 失敗 |
4.2.5 | --streaming-connection-idle-timeout 引数が 0 に設定されていないことを確認する(手動) |
L1 | Pass |
4.2.6 | --protect-kernel-defaults 引数が true に設定されていることを確認する(自動) |
L1 | 失敗 |
4.2.7 | --make-iptables-util-chains 引数が true に設定されていることを確認する(自動) |
L1 | Pass |
4.2.8 | --hostname-override 引数が設定されていないことを確認する(手動) |
L1 | Pass |
4.2.9 | --event-qps 引数が 0 か、適切なイベント キャプチャを維持するレベルに設定されていることを確認する(手動) |
L2 | 警告 |
4.2.10 | --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する(手動) |
L1 | 同等の統制 |
4.2.11 | --rotate-certificates 引数が false に設定されていないことを確認する(手動) |
L1 | Pass |
4.2.12 | RotateKubeletServerCertificate 引数が true に設定されていることを確認する(手動) | L1 | Pass |
4.2.13 | Kubelet が強力な暗号のみを使用していることを確認する(手動) | L1 | 同等の統制 |
ベアメタル版の Anthos クラスタの管理クラスタにおける障害と同等の統制に関する説明:
# | 推奨 | レベル | ステータス | 値 | 理由 |
---|---|---|---|---|---|
1.1.9 | Container Network Interface のファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(手動) |
L1 | 同等の統制 | 755 |
ベアメタル版 Anthos クラスタのコンテナ ネットワーク インターフェースのパスは /opt/cni/bin で、通常のクラスタ オペレーションに対して権限が 755 に設定されています。 |
1.1.10 | Container Network Interface のファイルのオーナー権限が root:root に設定されていることを確認する(手動) |
L1 | 同等の統制 | ベアメタル版 Anthos クラスタのコンテナ ネットワーク インターフェースのパスは /opt/cni/bin で、その所有権は root:root に設定されています。 |
|
1.1.12 | etcd データ ディレクトリのオーナー権限が etcd:etcd に設定されていることを確認する(自動) |
L1 | 同等の統制 | root:root |
etcd コンテナが root として実行され、etcd データ ディレクトリが root:root によって所有されています。 |
1.1.16 | scheduler. conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 | 2002:2002 |
リリース 1.9.0 以降のベアメタル版 Anthos クラスタは、セキュリティを強化するためにルートレス コントロール プレーンを実装しています。 |
1.1.18 | controller-manager. conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 | 2001:2001 |
リリース 1.9.0 以降のベアメタル版 Anthos クラスタは、セキュリティを強化するためにルートレス コントロール プレーンを実装しています。 |
1.1.19 | Kubernetes PKI ディレクトリとファイルのオーナー権限が root:root に設定されていることを確認する(自動) |
L1 | 同等の統制 | variable:variable |
リリース 1.9.0 以降のベアメタル版 Anthos クラスタは、セキュリティを強化するためにルートレス コントロール プレーンを実装しています。 |
1.1.21 | Kubernetes PKI 鍵ファイルの権限が 600 に設定されていることを確認する(手動) |
L1 | 同等の統制 | 600~640 |
リリース 1.9.0 以降のベアメタル版 Anthos クラスタは、セキュリティを強化するためにルートレス コントロール プレーンを実装しています。 |
1.2.1 | --anonymous-auth 引数が false に設定されていることを確認する(手動) |
L1 | 警告 | 未設定 | HA など一部のベアメタル版 Anthos クラスタのオペレーションでは、匿名認証を有効にする必要があります。 |
1.2.9 | アドミッション コントロール プラグインの EventRateLimit が設定されていることを確認する(手動) | L1 | 警告 | 未設定 | ベアメタル版 Anthos クラスタは、Kubernetes のアルファ版機能である Event Rate Limit アドミッション コントローラをサポートしていません。 |
1.2.11 | アドミッション コントロール プラグインの AlwaysPullImages が設定されていることを確認する(手動) | L1 | 警告 | 未設定 | AlwaysPullImages アドミッション コントローラは、非協調型のマルチテナント クラスタの非公開レジストリ イメージを保護しますが、クラスタ全体で新しい Pod を作成する際にコンテナ レジストリが単一障害点となります。ベアメタル版 Anthos クラスタでは AlwaysPullImages アドミッション コントローラは有効になりません。クラスタ管理者がこのトレードオフを判断し、アドミッション ポリシーを実装するかどうか決める必要があります。 |
1.2.12 | PodSecurityPolicy が使用されていない場合は、アドミッション コントロール プラグインの SecurityContextDeny が設定されていることを確認する(手動) | L1 | 警告 | 未設定 | ベアメタル版 Anthos クラスタは、デフォルトで Security Context アドミッション コントローラを有効にしません。ポッド セキュリティ ポリシーを使用すると制御がより簡単になるため、ポリシーの使用が望ましいとされます。 |
1.2.15 | アドミッション コントロール プラグインの PodSecurityPolicy が設定されていることを確認する(自動) | L1 | 失敗 | 未設定 | ベアメタル版 Anthos クラスタは、ポリシーの設定が必要なため、デフォルトでは Pod Security Policy アドミッション コントローラを有効にしません。ベアメタル版 Anthos のクラスタは、PodSecurityPolicy を有効にできます。 |
1.2.25 | --request-timeout 引数が適切に設定されていることを確認する(手動) |
L1 | 警告 | 未設定 | ベアメタル版 Anthos クラスタは、デフォルトのタイムアウト(1 分)を使用します。 |
3.2.2 | 監査ポリシーの対象に重要なセキュリティ問題が含まれていることを確認する(手動) | L2 | 同等の統制 | 未設定 | ベアメタル版 Anthos クラスタは監査ログをキャプチャしますが、これらのフラグは監査に使用しません。詳しくは、ロギングとモニタリングをご覧ください。 |
4.2.4 | --read-only-port 引数が 0 に設定されていることを確認する(手動) |
L1 | 失敗 | 10255 | ベアメタル版 Anthos クラスタは現在、kubelet から指標を収集するために --read-only-port 引数を 10255 に設定します。 |
4.2.6 | --protect-kernel-defaults 引数が true に設定されていることを確認する(自動) |
L1 | 失敗 | false |
ベアメタル版 Anthos クラスタを使用すると、kubelet が必要なカーネル設定を行うことができます。 |
4.2.9 | --event-qps 引数が 0 か、適切なイベント キャプチャを維持するレベルに設定されていることを確認する(手動) |
L2 | 警告 | 未設定 | イベントは、etcd に格納されている Kubernetes オブジェクトです。過大な etcd を避けるために、これらは 1 時間だけ保持されますが、これは適切なセキュリティ監査メカニズムではありません。このコントロールで提案されている無制限のイベントを許可すると、クラスタは不要な DoS のリスクにさらされることになり、アドミッション EventRateLimits の使用に関する推奨事項に矛盾します。永続ストレージを必要とするセキュリティ関連のイベントは、ログに送信する必要があります。 |
4.2.10 | --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する(手動) |
L1 | 同等の統制 | 未設定 | ベアメタル版 Anthos クラスタでは、--rotate-server-certificates フラグを使用して kubelet サーバーの TLS を管理します。 |
4.2.13 | Kubelet が強力な暗号のみを使用していることを確認する(手動) | L1 | 同等の統制 | ベアメタル版 Anthos クラスタの kubelet では、デフォルトの暗号を使用します。 |
ベンチマークを監査する方法
各推奨事項を監査するための具体的な手順は、関連する CIS ベンチマークの一環として利用できます。ただし、これらのチェックの一部を自動化して、お客様の環境でのこれらのコントロールの検証を簡素化することもできます。以下のツールは、この問題を解決するのに有効です。
CIS Kubernetes Benchmark の自動監査
オープンソース ツール kube-bench
を使用して、CIS Kubernetes Benchmark に対してクラスタ構成をテストできます。
適切なバージョンを指定してください。たとえば、
kube-bench node --benchmark cis-1.20