CIS ベンチマーク

このドキュメントでは、CIS Kubernetes Benchmark の概要とベンチマークに関するコンプライアンスの監査方法について説明します。自身で実装できない推奨事項については、推奨事項に対処するために GDCV for Bare Metal がどのように機能するかについて説明します。

CIS ベンチマークの使用

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

バージョン

次の表に、このドキュメントで説明する評価の実行に使用した GKE on Bare Metal のバージョン、Kubernetes と CIS Kubernetes Benchmark のバージョンを示します。

Anthos のバージョン Kubernetes のバージョン CIS Kubernetes Benchmark のバージョン
1.16.0 1.27.4 V1.23 (1.0.1)

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

CIS Kubernetes Benchmark

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

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

推奨レベル

CIS Kubernetes Benchmark では、

レベル 説明
レベル 1

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

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

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

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

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

    評価ステータスはすべての推奨事項に含まれます。評価ステータスは、提案された最適化案の実装が自動化できるか、または手動で手順を進める必要があるかを示します。どちらのステータスも重要であり、次の定義のように決定、サポートされます。

    スコア付け 説明
    自動 技術制御の評価を完全に自動化でき、合否の状態を判定できる場合の推奨事項を表します。推奨事項には、自動化を実装するために必要な情報が含まれます。
    手動 技術制御の評価を完全に自動化できず、期待された構成状態になっていることを確認するために手動で全体または一部の手順を行う必要がある推奨事項を表します。期待される状態は環境によって異なります。

    GKE on Bare Metal での評価

    次の値を使用して、GKE on Bare Metal の Kubernetes 推奨事項のステータスを表します。

    ステータス 説明
    Pass ベンチマークの推奨事項に準拠している。
    失敗 ベンチマークの推奨事項に準拠していない。
    同等の統制 ベンチマーク推奨事項の条件には完全に準拠していないものの、GKE on Bare Metal には同等のセキュリティ統制を提供する他のメカニズムが存在する。
    環境に依存 GKE on Bare Metal では、この推奨事項に関連する項目は構成されない。ユーザー側の構成により、環境がベンチマークの推奨事項を遵守しているかどうか決まる。

    GKE on Bare Metal のアーキテクチャ

    GKE on Bare Metal は、複数のクラスタ構成とクラスタタイプをサポートしています。サポートされているすべてのクラスタタイプ(管理者、ユーザー、ハイブリッド、スタンドアロン)は、CIS ベンチマークに対して評価されます。サポートされているすべてのクラスタタイプには、次の評価と理由が適用されます。GKE on Bare Metal でサポートされるクラスタ構成については、デプロイモデルの選択をご覧ください。

    GKE on Bare Metal のステータス

    以下のセクションでは、GKE on Bare Metal の指定されたバージョンで作成された新しいクラスタの評価について説明します。これらの評価は、ユーザー ワークロードのない新しいクラスタが CIS Kubernetes Benchmark に対してどのようなパフォーマンスを示すかを示す指標です。自分でベンチマークを監査する前に独自のワークロードをデプロイすると、結果が異なる場合があります。

    GKE on Bare Metal クラスタのステータス:

    # 推奨 レベル ステータス
    1 cis-1.23
    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 Pass
    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 Pass
    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 Pass
    1.2.24 --service-account-lookup 引数が true に設定されていることを確認する(自動) L1 Pass
    1.2.25 --service-account-key-file 引数が適切に設定されていることを確認する(自動) L1 Pass
    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 Pass
    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 Pass
    1.3.3 --use-service-account-credentials 引数が true に設定されていることを確認する(自動) L1 Pass
    1.3.4 --service-account-private-key-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.3.5 --root-ca-file 引数が適切に設定されていることを確認する(自動) L1 合格
    1.3.6 RotateKubeletServerCertificate 引数が true に設定されていることを確認する(自動) L2 Pass
    1.3.7 --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) L1 合格
    1.4 スケジューラ
    1.4.1 --profiling 引数が false に設定されていることを確認する(自動) L1 Pass
    1.4.2 --bind-address 引数が 127.0.0.1 に設定されていることを確認する(自動) L1 合格
    2 cis-1.23
    2 Etcd ノードの構成
    2.1 --cert-file 引数と --key-file 引数が適切に設定されていることを確認する(自動) L1 Pass
    2.2 --client-cert-auth 引数が true に設定されていることを確認する(自動) L1 Pass
    2.3 --auto-tls 引数が true に設定されていないことを確認する(自動) L1 合格
    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 合格
    3 cis-1.23
    3.1 認証と認可
    3.1.1 クライアント証明書の認証をユーザーに使用していないことを確認する(手動) L2 合格
    3.2 ロギング
    3.2.1 最小限の監査ポリシーが作成されていることを確認する(手動) L1 合格
    3.2.2 監査ポリシーの対象に重要なセキュリティ問題が含まれていることを確認する(手動) L2 同等の統制
    4 cis-1.23
    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 Pass
    4.2.12 RotateKubeletServerCertificate 引数が true に設定されていることを確認する(手動) L1 Pass
    4.2.13 Kubelet が強力な暗号のみを使用していることを確認する(手動) L1 同等の統制
    GKE on Bare Metal の管理クラスタの障害と同等の統制に関する説明:
    # 推奨 レベル ステータス 理由
    1.1.9 Container Network Interface のファイルの権限が、644 またはそれより制限された値に設定されていることを確認する(手動) L1 同等の統制 755 ベアメタル版 Anthos クラスタのコンテナ ネットワーク インターフェースのパスは /opt/cni/bin で、通常のクラスタ オペレーションに対して権限が 755 に設定されています。
    1.1.11 etcd データ ディレクトリの権限が、700 またはそれより制限された値に設定されていることを確認する(自動) L1 同等の統制 755 etcd データ ディレクトリにはデフォルトで 755 権限が設定されていますが、サブディレクトリは 700 です。
    1.1.12 etcd データ ディレクトリのオーナー権限が etcd:etcd に設定されていることを確認する(自動) L1 同等の統制 2003:2003 etcd データ ディレクトリである /var/lib/etcd は、強化されたセキュリティのためのルートレス コントロール プレーンの結果として、2003:2003 によって所有されます。
    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.10 アドミッション コントロール プラグインの EventRateLimit が設定されていることを確認する(手動) L1 警告
    1.2.12 アドミッション コントロール プラグインの AlwaysPullImages が設定されていることを確認する(手動) L1 警告 未設定 AlwaysPullImages アドミッション コントローラは、非協調型のマルチテナント クラスタの非公開レジストリ イメージを保護しますが、クラスタ全体で新しい Pod を作成する際にコンテナ レジストリが単一障害点となります。ベアメタル版 Anthos クラスタでは AlwaysPullImages アドミッション コントローラは有効になりません。クラスタ管理者がこのトレードオフを判断し、アドミッション ポリシーを実装するかどうか決める必要があります。
    1.2.13 PodSecurityPolicy が使用されていない場合は、アドミッション コントロール プラグインの SecurityContextDeny が設定されていることを確認する(手動) L1 警告 未設定 Anthos clusters on bare metal は、Pod セキュリティ ポリシーを有効にしません。Kubernetes 1.23 クラスタではデフォルトで、Pod セキュリティ アドミッションが有効になっています。https://kubernetes.io/docs/concepts/security/pod-security-admission/ をご覧ください。
    1.2.19 --audit-log-path 引数が設定されていることを確認する(自動) L1 不合格 デフォルトで未設定。Cloud Audit Logging が無効になっている場合にのみ /var/log/apiserver/audit.log を設定 Anthos clusters on bare metal のクラスタは、デフォルトで Kubernetes API サーバーの監査ログを Google Cloud に送信します。
    1.2.20 --audit-log-maxage 引数が 30 または適切な値に設定されていることを確認する(自動) L1 不合格 デフォルトで未設定。Cloud Audit Logging が無効になっている場合にのみ 30 を設定 Anthos clusters on bare metal のクラスタは、デフォルトで Kubernetes API サーバーの監査ログを Google Cloud に送信します。
    1.2.21 --audit-log-maxbackup 引数が 10 または適切な値に設定されていることを確認する(自動) L1 不合格 デフォルトで未設定。Cloud Audit Logging が無効になっている場合にのみ 10 を設定 Anthos clusters on bare metal のクラスタは、デフォルトで Kubernetes API サーバーの監査ログを Google Cloud に送信します。
    1.2.22 --audit-log-maxsize 引数が 100 または適切な値に設定されていることを確認する(自動) L1 不合格 デフォルトで未設定。Cloud Audit Logging が無効になっている場合にのみ 100 を設定 Anthos clusters on bare metal のクラスタは、デフォルトで Kubernetes API サーバーの監査ログを Google Cloud に送信します。
    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 on bare metal クラスタのマシンは、Kubernetes からカーネルのデフォルトを保護しません。これは、お客様のワークロードで変更される可能性があるためです。
    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 clusters on bare metal のノードでは、kubelet はデフォルトの Go 暗号スイートを使用します。Anthos clusters on bare metal には、暗号スイートの選択をカスタマイズするための構成オプションはありません。最新のクライアントは暗号スイートをネゴシエートし、強力な暗号が互いに利用可能な場合に、脆弱な暗号を使用しないことに留意してください。

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

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

    CIS Kubernetes Benchmark の自動監査

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

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

    kube-bench node --benchmark cis-1.23