CIS ベンチマーク

このドキュメントでは CIS Kubernetes Benchmark を紹介します。また、次のことについても説明します。

  • ベンチマークへのコンプライアンスを監査する方法
  • ある推奨事項をユーザー自身で実装できない場合に GKE on AWS はどのように構成されるか。

CIS ベンチマークの使用

Center for Internet Security(CIS)ではベスト プラクティスのセキュリティに関する推奨事項のベンチマークを公開しています。CIS Kubernetes Benchmark は、強固なセキュリティ ポスチャーをサポートするように Kubernetes を構成するための推奨事項をまとめたものです。ベンチマークは特定の Kubernetes リリースに関連付けられています。CIS Kubernetes Benchmark は、オープンソースの Kubernetes ディストリビューション用に記述されており、できる限り多くのディストリビューションに広く適用できるように構成されています。

バージョン

使用する 2 つのベンチマークのバージョン番号が同じとは限りませんので注意してください。

このドキュメントでは、次のバージョンを参照しています。

Anthos のバージョン Kubernetes のバージョン CIS Kubernetes Benchmark のバージョン
1.14.0 1.25.3 1.23

CIS Kubernetes Benchmark

ベンチマークへのアクセス

CIS Kubernetes Benchmark は CIS のウェブサイトで入手できます。

推奨事項のレベル

CIS Kubernetes Benchmark の推奨事項には、2 つのレベルがあります。

レベル 説明
レベル 1

推奨事項は以下を目的としています:

  • 実用的かつ慎重
  • セキュリティ上の明確なメリットの提供
  • 許容可能な範囲を超えて技術の有用性を阻害しないこと
  • レベル 2

    レベル 1 のプロファイルを拡張します。

    推奨事項には、次の 1 つ以上の特徴があります。

  • セキュリティが最も重要な環境やユースケースを対象としている。
  • 多層防御として機能する。または、
  • テクノロジーの実用性やパフォーマンスを阻害する可能性がある。
  • 評価ステータス

    評価ステータスはすべての推奨事項に含まれます。評価ステータスは、該当する推奨事項が自動化できるか、それとも実装するために手動での手順が必要かを示します。どちらのステータスも等しく重要であり、次の定義に示すとおりに決定されてサポートされます。

    スコアリング 説明
    自動 その推奨事項の技術的統制の評価を完全自動化でき、検証を行って合否の状態を判定できることを表します。推奨事項には、自動化を実装するために必要な情報が含まれます。
    手動 その推奨事項の技術的統制の評価を完全自動化することはできず、構成済みの状態が期待どおりに設定されていることを検証する手順の全体または一部を手動で行う必要があることを表します。期待される状態は環境によって異なります。

    GKE on AWS の評価

    GKE on AWS での Kubernetes に関する推奨事項のステータスを表すために使用される値は次のとおりです。

    ステータス 説明
    合格 ベンチマークの推奨事項に準拠している。
    不合格 ベンチマークの推奨事項に準拠していない。
    同等の統制 ベンチマーク推奨事項の条件に完全には準拠していないが、GKE on AWS に存在する他のメカニズムによって同等のセキュリティ統制が行われている。
    環境に依存 この推奨事項に関連する項目が GKE on AWS によって構成されることはない。ユーザーの環境がベンチマークの推奨事項に準拠するかどうかは、ユーザー側の構成によって決まる。

    GKE on AWS のステータス

    指定されたバージョンの新しいクラスタを作成するときに、CIS Kubernetes Benchmark に照らした評価の結果は次のようになります。

    GKE on AWS クラスタのステータス:

    # 推奨 レベル ステータス
    1 コントロール プレーンのセキュリティ構成
    1.1 コントロール プレーンノード構成ファイル
    1.1.1 API サーバーの Pod 仕様ファイルへのアクセス許可が、644 またはそれより制限された値に設定されている確認する(自動) L1 合格
    1.1.2 API サーバーの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.3 コントローラ マネージャーの Pod 仕様ファイルへのアクセス許可が、644 またはそれより制限された値に設定されていることを確認する(自動) L1 合格
    1.1.4 コントローラ マネージャーの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.5 スケジューラの Pod 仕様ファイルへのアクセス許可が、644 またはそれより制限された値に設定されていることを確認する(自動) L1 合格
    1.1.6 スケジューラの Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.7 etcd の Pod 仕様ファイルへのアクセス許可が、644 またはそれより制限された値に設定されていることを確認する(自動) L1 合格
    1.1.8 etcd の Pod 仕様ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.9 Container Network Interface のファイルへのアクセス許可が、644 またはそれより制限された値に設定されていることを確認する(手動) L1 同等の統制
    1.1.10 Container Network Interface のファイルのオーナー権限が root:root に設定されていることを確認する(手動) L1 同等の統制
    1.1.11 etcd データ ディレクトリの権限が、700 またはそれより制限された値に設定されていることを確認する(自動) L1 同等の統制
    1.1.12 etcd データ ディレクトリのオーナー権限が etcd:etcd に設定されていることを確認する(自動) L1 同等の統制
    1.1.13 admin.conf ファイルへのアクセス許可が 600 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 同等の統制
    1.1.14 admin.conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 同等の統制
    1.1.15 scheduler.conf ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 合格
    1.1.16 scheduler.conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.17 controller-manager.conf ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 合格
    1.1.18 controller-manager.conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.19 Kubernetes PKI ディレクトリとファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    1.1.20 Kubernetes PKI 証明書ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(手動) L1 合格
    1.1.21 Kubernetes PKI 鍵ファイルへのアクセス許可が 600 に設定されていることを確認する(手動) L1 合格
    1.2 API サーバー
    1.2.1 --anonymous-auth 引数が false に設定されていることを確認する(手動) L1 合格
    1.2.2 --token-auth-file パラメータが設定されていないことを確認する(自動) L1 合格
    1.2.3 --DenyServiceExternalIPs が設定されていないことを確認する(自動) L1 合格
    1.2.4 --kubelet-https 引数が true に設定されていることを確認する(自動) L1 合格
    1.2.5 --kubelet-client-certificate 引数と --kubelet-client-key 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.6 --kubelet-certificate-authority 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.7 --authorization-mode 引数が AlwaysAllow に設定されていないことを確認する(自動) L1 合格
    1.2.8 --authorization-mode 引数にノードが含まれていることを確認する(自動) L1 合格
    1.2.9 --authorization-mode 引数に RBAC が含まれていることを確認する(自動) L1 合格
    1.2.10 アドミッション コントロール プラグインの EventRateLimit が設定されていることを確認する(手動) L1 警告
    1.2.11 アドミッション コントロール プラグインの AlwaysAdmit が設定されていないことを確認する(自動) L1 合格
    1.2.12 アドミッション コントロール プラグインの AlwaysPullImages が設定されていることを確認する(手動) L1 警告
    1.2.13 PodSecurityPolicy が使用されていない場合は、アドミッション コントロール プラグインの SecurityContextDeny が設定されていることを確認する(手動) L1 同等の統制
    1.2.14 アドミッション コントロール プラグインの ServiceAccount が設定されていることを確認する(自動) L1 合格
    1.2.15 アドミッション コントロール プラグインの NamespaceLifecycle が設定されていることを確認する(自動) L1 合格
    1.2.16 アドミッション コントロール プラグイン NodeRestriction が設定されていることを確認する(自動) L1 合格
    1.2.17 --secure-port 引数が 0 に設定されていないことを確認する(自動) L1 合格
    1.2.18 --profiling 引数が false に設定されていることを確認する(自動) L1 合格
    1.2.19 --audit-log-path 引数が設定されていることを確認する(自動) L1 同等の統制
    1.2.20 --audit-log-maxage 引数が 30 または適切な値に設定されていることを確認する(自動) L1 同等の統制
    1.2.21 --audit-log-maxbackup 引数が 10 または適切な値に設定されていることを確認する(自動) L1 同等の統制
    1.2.22 --audit-log-maxsize 引数が 100 または適切な値に設定されていることを確認する(自動) L1 同等の統制
    1.2.23 --request-timeout 引数が適切に設定されていることを確認する(手動) L1 合格
    1.2.24 --service-account-lookup 引数が true に設定されていることを確認する(自動) L1 合格
    1.2.25 --service-account-key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.26 --etcd-certfile 引数と --etcd-keyfile 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.27 --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.28 --client-ca-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.29 --etcd-cafile 引数が適切に設定されていることを確認する(自動) L1 合格
    1.2.30 --encryption-provider-config 引数が適切に設定されていることを確認する(手動) L1 合格
    1.2.31 暗号化プロバイダが適切に構成されていることを確認する(手動) L1 合格
    1.2.32 API サーバーが強力な暗号のみを使用していることを確認する(手動) L1 合格
    1.3 コントローラ マネージャー
    1.3.1 --terminated-pod-gc-threshold 引数が適切に設定されていることを確認する(手動) L1 合格
    1.3.2 --profiling 引数が false に設定されていることを確認する(自動) L1 合格
    1.3.3 --use-service-account-credentials 引数が true に設定されていることを確認する(自動) L1 合格
    1.3.4 --service-account-private-key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.3.5 --root-ca-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.3.6 RotateKubeletServerCertificate 引数が true に設定されていることを確認する(自動) L2 合格
    1.3.7 --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) L1 合格
    1.4 スケジューラ
    1.4.1 --profiling 引数が false に設定されていることを確認する(自動) L1 合格
    1.4.2 --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) L1 合格
    2 Etcd ノードの構成
    2 Etcd ノードの構成
    2.1 --cert-file 引数と --key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    2.2 --client-cert-auth 引数が true に設定されていることを確認する(自動) L1 合格
    2.3 --auto-tls 引数が true に設定されていないことを確認する(自動) L1 合格
    2.4 --peer-cert-file 引数と --peer-key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    2.5 --peer-client-cert-auth 引数が true に設定されていることを確認する(自動) L1 合格
    2.6 --peer-auto-tls 引数が true に設定されていないことを確認する(自動) L1 合格
    2.7 固有の認証局が etcd に使用されていることを確認する(手動) L2 合格
    3 コントロール プレーンの設定
    3.1 認証と認可
    3.1.1 クライアント証明書の認証をユーザーに使用していないことを確認する(手動) L2 同等の統制
    3.2 ロギング
    3.2.1 最小限の監査ポリシーが作成されていることを確認する(手動) L1 合格
    3.2.2 監査ポリシーの対象に重要なセキュリティ問題が含まれていることを確認する(手動) L2 同等の統制
    4 ワーカーノードのセキュリティ構成
    4.1 ワーカーノード構成ファイル
    4.1.1 kubelet サービス ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 合格
    4.1.2 kubelet サービス ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    4.1.3 プロキシ kubeconfig ファイルが存在する場合は、権限が 644 またはそれより制限された値設定されていることを確認する(手動) L1 合格
    4.1.4 プロキシ kubeconfig ファイルが存在する場合に、オーナー権限が root:root に設定されていることを確認する(手動) L1 合格
    4.1.5 --kubeconfig kubelet.conf ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 合格
    4.1.6 --kubeconfig kubelet.conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    4.1.7 認証局ファイルへのアクセス許可が 644 またはそれより制限が厳しい値に設定されていることを確認する(手動) L1 合格
    4.1.8 クライアント認証局ファイルのオーナー権限が root:root に設定されていることを確認する(手動) L1 合格
    4.1.9 kubelet の --config 構成ファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(自動) L1 合格
    4.1.10 kubelet の --config 構成ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 合格
    4.2 Kubelet
    4.2.1 --anonymous-auth 引数が false に設定されていることを確認する(自動) L1 合格
    4.2.2 --authorization-mode 引数が AlwaysAllow に設定されていないことを確認する(自動) L1 合格
    4.2.3 --client-ca-file 引数が適切に設定されていることを確認する(自動) L1 合格
    4.2.4 --read-only-port 引数が 0 に設定されていることを確認する(手動) L1 不合格
    4.2.5 --streaming-connection-idle-timeout 引数が 0 に設定されていないことを確認する(手動) L1 合格
    4.2.6 --protect-kernel-defaults 引数が true に設定されていることを確認する(自動) L1 不合格
    4.2.7 --make-iptables-util-chains 引数が true に設定されていることを確認する(自動) L1 合格
    4.2.8 --hostname-override 引数が設定されていないことを確認する(手動) L1 合格
    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 合格
    4.2.12 RotateKubeletServerCertificate 引数が true に設定されていることを確認する(手動) L1 合格
    4.2.13 Kubelet が強力な暗号のみを使用していることを確認する(手動) L1 合格
    GKE on AWS 管理クラスタの不合格と「同等の統制」に関する説明:
    # 推奨 レベル ステータス 理由
    1.1.9 Container Network Interface のファイルへのアクセス許可が、644 またはそれより制限された値に設定されていることを確認する(手動) L1 同等の統制 755 Anthos clusters on AWS コンテナ ネットワーク インターフェースのパスは /opt/cni/bin で、その権限は通常のクラスタ オペレーションを行うために 755 に設定されています。
    1.1.10 Container Network Interface のファイルのオーナー権限が root:root に設定されていることを確認する(手動) L1 同等の統制 root:root Anthos clusters on AWS コンテナ ネットワーク インターフェースのパスは /opt/cni/bin で、そのオーナー権限は root:root に設定されています。
    1.1.11 etcd データ ディレクトリの権限が、700 またはそれより制限された値に設定されていることを確認する(自動) L1 同等の統制 755 etcd データ ディレクトリ /opt/data/var/lib/etcd にはデフォルトの 755 権限が設定されていますが、サブディレクトリは 700 です。
    1.1.12 etcd データ ディレクトリのオーナー権限が etcd:etcd に設定されていることを確認する(自動) L1 同等の統制 root:root etcd コンテナが root として実行され、etcd データ ディレクトリが root:root によって所有されています。
    1.1.13 admin.conf ファイルへのアクセス許可が 600 またはそれより制限が厳しい値に設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS では kubeadm はサポートされません。
    1.1.14 admin.conf ファイルのオーナー権限が root:root に設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS では kubeadm はサポートされません。
    1.2.10 アドミッション コントロール プラグインの EventRateLimit が設定されていることを確認する(手動) L1 警告 未設定 Event Rate Limit アドミッション コントローラは Kubernetes のアルファ版機能であるため、Anthos clusters on AWS ではサポートされません。
    1.2.12 アドミッション コントロール プラグインの AlwaysPullImages が設定されていることを確認する(手動) L1 警告 未設定 AlwaysPullImages アドミッション コントローラを使用すると、非協調型マルチテナント クラスタ内で限定公開のレジストリ イメージをある程度保護できますが、それと引き換えに、クラスタ全体で新しい Pod を作成する際にコンテナ レジストリが単一障害点となります。GKE on AWS によって AlwaysPullImages アドミッション コントローラが有効化されることはなく、このトレードオフを受け入れるアドミッション ポリシーを実装するかどうかはクラスタ管理者に一任されます。
    1.2.13 PodSecurityPolicy が使用されていない場合は、アドミッション コントロール プラグインの SecurityContextDeny が設定されていることを確認する(手動) L1 同等の統制 未設定 Anthos clusters on AWS ではデフォルトのセキュリティ ポリシーが定義されています。セキュリティ関連のオプションは、セキュリティ コンテキストを使用して設定できます。詳細については、セキュリティの概要をご覧ください。
    1.2.19 --audit-log-path 引数が設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS には、クラウド監査ロギング オプションが用意されています。詳しくは、Cloud Audit Logs をご覧ください。
    1.2.20 --audit-log-maxage 引数が 30 または適切な値に設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS には、クラウド監査ロギング オプションが用意されています。詳しくは、Cloud Audit Logs をご覧ください。
    1.2.21 --audit-log-maxbackup 引数が 10 または適切な値に設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS には、クラウド監査ロギング オプションが用意されています。詳しくは、Cloud Audit Logs をご覧ください。
    1.2.22 --audit-log-maxsize 引数が 100 または適切な値に設定されていることを確認する(自動) L1 同等の統制 未設定 Anthos clusters on AWS には、クラウド監査ロギング オプションが用意されています。詳しくは、Cloud Audit Logs をご覧ください。
    3.1.1 クライアント証明書の認証をユーザーに使用していないことを確認する(手動) L2 同等の統制 Anthos clusters on AWS では、クラスタへの接続の認証メカニズムの 1 つとして OIDC がサポートされています。詳細については、クラスタに接続して認証するをご覧ください。
    3.2.2 監査ポリシーの対象に重要なセキュリティ問題が含まれていることを確認する(手動) L2 同等の統制 未設定 Anthos clusters on AWS には、クラウド監査ロギング オプションが用意されています。詳しくは、Cloud Audit Logs をご覧ください。
    4.2.4 --read-only-port 引数が 0 に設定されていることを確認する(手動) L1 不合格 10255 Anthos clusters on AWS では現在、kubelet から指標を収集するために --read-only-port 引数が 10255 に設定されています。
    4.2.6 --protect-kernel-defaults 引数が true に設定されていることを確認する(自動) L1 不合格 false Anthos clusters on AWS では、必要なカーネル設定を設定することが 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 clusters on AWS は serverTLSBootstrap フラグを使用して kubelet サーバー TLS を管理します。

    ベンチマークを監査する方法

    各推奨事項を監査するための具体的な手順は、関連する CIS ベンチマークの一部として用意されています。ただし、これらのチェックの一部を自動化して、お客様の環境でのこれらのコントロールの検証を簡素化することもできます。以下のツールは、この問題を解決するのに有効です。

    CIS Kubernetes Benchmark の自動監査

    オープンソースのツール kube-bench を使用して、実際のクラスタ構成を CIS Kubernetes Benchmark に照らしてテストできます。

    適切なバージョンを指定してください。たとえば、

    kube-bench node --benchmark cis-1.23