Center for Internet Security (CIS) Kubernetes ベンチマーク
Azure Kubernetes Service (AKS) は安全なサービスとして、SOC、ISO、PCI DSS、HIPAA の各標準に準拠しています。 この記事では、CIS Kubernetes ベンチマークに基づいて AKS に適用されるセキュリティ ハードニングについて説明します。 AKS のセキュリティについて詳しくは、「Azure Kubernetes Service (AKS) でのアプリケーションとクラスターに対するセキュリティの概念」をご覧ください。 詳細については、Center for Internet Security (CIS) ベンチマークに関するページを参照してください。
Kubernetes CIS ベンチマーク
AKS での CIS Kubernetes V1.27 Benchmark v1.9.0 推奨事項の結果を次に示します。 この結果は AKS 1.27.x から AKS 1.29.x に適用されます。
セキュリティ レベル
CIS ベンチマークには 2 つのレベルのセキュリティ設定があります。
- L1 (レベル 1) は、あらゆるシステムで構成でき、サービスの中断や機能の低下をほとんど、またはまったく引き起こさない、不可欠となる基本セキュリティ要件を推奨しています。
- L2 (レベル 2) は、機能の低下を引き起こす可能性のある、より高度なセキュリティを必要とする環境向けのセキュリティ設定を推奨しています。
評価の状態
すべての推奨事項について、評価の状態が含まれます。 評価の状態は、特定の推奨事項を自動化できるか、または実装するために手動による手順が必要であるかを示します。 どちらの状態も同様に重要であり、以下に定義するように決定され、サポートされます。
- "自動": 技術的な制御の評価を完全に自動化でき、合格/不合格の状態を検証できる場合の推奨事項を表します。 推奨事項には、自動化を実装するために必要な情報が含まれます。
- "手動": 技術的な制御の評価を完全には自動化できず、構成された状態が想定どおりに設定されていることを検証するために、すべてまたは一部の手順を手動で行う必要がある場合の推奨事項を表します。 想定される状態は、環境によって異なる可能性があります。
"自動" の推奨事項は、これが適用されていない場合、ベンチマーク スコアに影響しますが、"手動" の推奨事項は影響しません。
構成証明の状態
推奨事項には、構成証明について次のいずれかの状態が含まれます。
- "合格": 推奨事項は適用されています。
- "不合格": 推奨事項は適用されていません。
- "N/A": 推奨事項は、AKS に関連しないマニフェスト ファイルのアクセス許可の要件に関するものです。 既定では、Kubernetes クラスターはマニフェストモデルを使用してコントロール プレーン ポッドをデプロイします。これは、ノード VM のファイルに依存しています。 CIS Kubernetes ベンチマークでは、これらのファイルに特定のアクセス許可の要件を指定する必要があることが推奨されています。 ASK クラスターは Helm チャートを使用してコントロール プレーン ポッドをデプロイし、ノード VM のファイルには依存しません。
- "環境に依存": 推奨事項はユーザー固有の環境内で適用され、AKS によって制御されません。 "自動": 推奨事項は、推奨事項がユーザー固有の環境に適用されるかどうかに関係なく、ベンチマーク スコアに影響します。
- "同等の制御": 推奨事項は、同等の異なる方法で実装されています。
ベンチマークの詳細
CIS ID | 推奨事項の説明 | 評価の状態 | Level | 状態 |
---|---|---|---|---|
1 | コントロール プレーンのコンポーネント | |||
1.1 | コントロール プレーン ノードの構成ファイル | |||
1.1.1 | API サーバーのポッド仕様ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.2 | API サーバー ポッド仕様ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.3 | コントローラー マネージャーのポッド仕様ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.4 | コントローラー マネージャー ポッド仕様ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.5 | スケジューラのポッド仕様ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.6 | スケジューラ ポッド仕様ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.7 | etcd のポッド仕様ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.8 | etcd ポッド仕様ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.9 | Container Network Interface ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 手動 | L1 | 該当なし |
1.1.10 | コンテナー ネットワーク インターフェイス ファイルの所有権が 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 ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.16 | scheduler.conf ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.17 | controller-manager.conf ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.18 | controller-manager.conf ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.19 | Kubernetes PKI ディレクトリとファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 該当なし |
1.1.20 | Kubernetes PKI 証明書ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 手動 | 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-client-certificate 引数と --kubelet-client-key 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.5 | --kubelet-certificate-authority 引数が適切に設定されていることを確認する |
自動化 | L1 | 失敗 |
1.2.6 | --authorization-mode 引数が AlwaysAllow に設定されていないことを確認する |
自動化 | L1 | 合格 |
1.2.7 | --authorization-mode 引数に Node が含まれていることを確認する |
自動化 | L1 | 合格 |
1.2.8 | --authorization-mode 引数に RBAC が含まれていることを確認する |
自動化 | L1 | 合格 |
1.2.9 | アドミッション コントロール プラグイン EventRateLimit が設定されていることを確認する | 手動 | L1 | 失敗 |
1.2.10 | アドミッション コントロール プラグイン AlwaysAdmit が常に設定されていないことを確認する | 自動化 | L1 | 合格 |
1.2.11 | アドミッション コントロール プラグイン AlwaysPullImages が設定されていることを確認する | 手動 | L1 | 失敗 |
1.2.12 | アドミッション コントロール プラグイン ServiceAccount が設定されていることを確認する | 自動化 | L2 | 失敗 |
1.2.13 | アドミッション コントロール プラグイン NamespaceLifecycle が設定されていることを確認する | 自動化 | L2 | パス |
1.2.14 | アドミッション コントロール プラグイン NodeRestriction が設定されていることを確認する | 自動化 | L2 | パス |
1.2.15 | --profiling 引数が false に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.16 | --audit-log-path 引数が設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.17 | --audit-log-maxage 引数が 30 または適切な値に設定されていることを確認する |
自動化 | L1 | 同等の制御 |
1.2.18 | --audit-log-maxbackup 引数が 10 または適切な値に設定されていることを確認する |
自動化 | L1 | 同等の制御 |
1.2.19 | --audit-log-maxsize 引数が 100 または適切な値に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.20 | --request-timeout 引数が適切に設定されていることを確認する |
手動 | L1 | パス |
1.2.21 | --service-account-lookup 引数が true に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.22 | --service-account-key-file 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.23 | --etcd-certfile 引数と --etcd-keyfile 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.24 | --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.25 | --client-ca-file 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.26 | --etcd-cafile 引数が適切に設定されていることを確認する |
自動化 | L1 | 合格 |
1.2.27 | --encryption-provider-config 引数が適切に設定されていることを確認する |
手動 | L1 | 環境に依存 |
1.2.28 | 暗号化プロバイダーが適切に構成されていることを確認する | 手動 | L1 | 環境に依存 |
1.2.29 | 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 | Scheduler | |||
1.4.1 | --profiling 引数が false に設定されていることを確認する |
自動化 | L1 | 合格 |
1.4.2 | --bind-address 引数が 127.0.0.1 に設定されていることを確認する |
自動化 | L1 | 同等の制御 |
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 | クライアント証明書認証をユーザーに使用しない | 手動 | L1 | 合格 |
3.1.2 | サービス アカウント トークン認証をユーザーに使用しない | 手動 | L1 | 合格 |
3.1.3 | ブートストラップ トークン認証をユーザーに使用しない | 手動 | L1 | 合格 |
3.2 | ログの記録 | |||
3.2.1 | 最小限の監査ポリシーが作成されていることを確認する | 手動 | L1 | 合格 |
3.2.2 | 監査ポリシーが重要なセキュリティ問題に対応していることを確認する | 手動 | L2 | 合格 |
4 | ワーカー ノード | |||
4.1 | ワーカー ノード構成ファイル | |||
4.1.1 | kubelet サービス ファイルのアクセス許可が、600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 合格 |
4.1.2 | kubelet サービス ファイルの所有権が root:root に設定されていることを確認する | 自動化 | L1 | 合格 |
4.1.3 | プロキシ kubeconfig ファイルが存在する場合は、アクセス許可が 600 またはより制限された値に設定されていることを確認する | 手動 | L1 | 該当なし |
4.1.4 | プロキシ kubeconfig ファイルが存在する場合は、所有権が root:root に設定されていることを確認する | 手動 | L1 | 該当なし |
4.1.5 | --kubeconfig kubelet.conf ファイルのアクセス許可が 600 またはより制限された値に設定されていることを確認する |
自動化 | L1 | 合格 |
4.1.6 | --kubeconfig kubelet.conf ファイルの所有権が root:root に設定されていることを確認する |
自動化 | L1 | 合格 |
4.1.7 | 証明機関ファイルのアクセス許可が 600 またはより制限された値に設定されていることを確認する | 手動 | L1 | 合格 |
4.1.8 | クライアント証明機関ファイルの所有権が root:root に設定されていることを確認する | 手動 | L1 | 合格 |
4.1.9 | kubelet config.yaml 構成ファイルを使っている場合は、アクセス許可が 600 またはより制限された値に設定されていることを確認する | 自動化 | L1 | 合格 |
4.1.10 | kubelet config.yaml 構成ファイルを使っている場合は、ファイルの所有権が 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 | --make-iptables-util-chains 引数が true に設定されていることを確認する |
自動化 | L1 | 合格 |
4.2.7 | --hostname-override 引数が設定されていないことを確認する |
手動 | L1 | 合格 |
4.2.8 | --eventRecordQPS 引数が、適切なイベント キャプチャを保証するレベルに設定されていることを確認する |
手動 | L2 | パス |
4.2.9 | --tls-cert-file 引数と --tls-private-key-file 引数が適切に設定されていることを確認する |
手動 | L1 | 合格 |
4.2.10 | --rotate-certificates 引数が false に設定されていないことを確認する |
自動化 | L1 | 合格 |
4.2.11 | RotateKubeletServerCertificate 引数が true に設定されていることを検証する | 手動 | L1 | 失敗 |
4.2.12 | Kubelet が強力な暗号のみを使用していることを確認する | 手動 | L1 | 合格 |
4.2.13 | ポッド PID に制限が設定されていることを確認する | 手動 | L1 | 合格 |
4.3 | kube-proxy | |||
4.3.1 | kube-proxy メトリック サービスが localhost にバインドされていることを確認する | 自動化 | L1 | 合格 |
5 | ポリシー | |||
5.1 | RBAC とサービス アカウント | |||
5.1.1 | cluster-admin ロールが、必要な場合にのみ使用されていることを確認する | 自動化 | L1 | 環境に依存 |
5.1.2 | シークレットへのアクセスを最小限に抑える | 自動化 | L1 | 環境に依存 |
5.1.3 | Roles および ClusterRoles でのワイルドカードの使用を最小限に抑える | 自動化 | L1 | 環境に依存 |
5.1.4 | ポッド作成のためのアクセスを最小限に抑える | 自動化 | L1 | 環境に依存 |
5.1.5 | 既定のサービス アカウントがアクティブに使用されていないことを確認する | 自動化 | L1 | 環境に依存 |
5.1.6 | サービス アカウント トークンが必要な場合にのみマウントされていることを確認する | 自動化 | L1 | 環境に依存 |
5.1.7 | system:masters グループを使用しない | 手動 | L1 | 環境に依存 |
5.1.8 | Kubernetes クラスターでの Bind、Impersonate、Escalate アクセス許可の使用を制限する | 手動 | L1 | 環境に依存 |
5.1.9 | 永続ボリュームを作成するためのアクセスを最小限に抑える | 手動 | L1 | 環境に依存 |
5.1.10 | ノードのプロキシ サブリソースへのアクセスを最小限に抑える | 手動 | L1 | 環境に依存 |
5.1.11 | certificatesigningrequests オブジェクトの承認サブリソースへのアクセスを最小限に抑える | 手動 | L1 | 環境に依存 |
5.1.12 | Webhook 構成オブジェクトへのアクセスを最小限に抑える | 手動 | L1 | 環境に依存 |
5.1.13 | サービス アカウント トークン作成へのアクセスを最小限に抑える | 手動 | L1 | 環境に依存 |
5.2 | ポッドのセキュリティ標準 | |||
5.2.1 | クラスターに少なくとも 1 つのアクティブなポリシー制御メカニズムが配置されていることを確認する | 手動 | L1 | 環境に依存 |
5.2.2 | 特権付きコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.3 | ホスト プロセス ID の名前空間の共有を希望するコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.4 | ホスト IPC の名前空間の共有を希望するコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.5 | ホスト ネットワークの名前空間の共有を希望するコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.6 | allowPrivilegeEscalation を使用してコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.7 | ルート コンテナーの許可を最小限に抑える | 手動 | L2 | 環境に依存 |
5.2.8 | NET_RAW 機能を使用してコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.9 | 追加された機能を使用してコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.10 | 割り当てられた機能を使用してコンテナーの許可を最小限に抑える | 手動 | L2 | 環境に依存 |
5.2.11 | Windows HostProcess コンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.12 | HostPath ボリュームの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.2.13 | HostPorts を使用するコンテナーの許可を最小限に抑える | 手動 | L1 | 環境に依存 |
5.3 | ネットワーク ポリシーと CNI | |||
5.3.1 | 使用中の CNI がネットワーク ポリシーをサポートしていることを確認する | 手動 | L1 | 合格 |
5.3.2 | すべての名前空間にネットワーク ポリシーが定義されていることを確認する | 手動 | L2 | 環境に依存 |
5.4 | シークレットの管理 | |||
5.4.1 | シークレットを環境変数として使用するのではなく、シークレットをファイルとして使用する | 手動 | L2 | 環境に依存 |
5.4.2 | 外部シークレット ストレージを検討する | 手動 | L2 | 環境に依存 |
5.5 | 拡張可能なアドミッション コントロール | |||
5.5.1 | ImagePolicyWebhook アドミッション コントローラーを使用してイメージの出所を構成する | 手動 | L2 | 失敗 |
5.6 | 一般ポリシー | |||
5.6.1 | 名前空間を使用してリソース間の管理境界を作成する | 手動 | L1 | 環境に依存 |
5.6.2 | ポッド定義で seccomp プロファイルが docker/default に設定されていることを確認する | 手動 | L2 | 環境に依存 |
5.6.3 | ポッドとコンテナーにセキュリティ コンテキストを適用する | 手動 | L2 | 環境に依存 |
5.6.4 | 既定の名前空間が使用されていない | 手動 | L2 | 環境に依存 |
注意
Kubernetes CIS ベンチマークの他に AKS CIS ベンチマークも利用できます。
その他のメモ
- セキュリティが強化された OS は、AKS 専用に構築および保守されており、AKS プラットフォーム以外ではサポートされていません。
- 攻撃面領域をさらに減らすために、OS では、一部の不要なカーネル モジュール ドライバーが無効になっています。
次のステップ
AKS のセキュリティに関する詳細については、次の記事をご覧ください。
Azure Kubernetes Service