前書き
CIS Benchmarkは、IT システムおよびデータをサイバー攻撃から守るためのセキュリティ規格とし、 何千もの企業で採用され規範的なガイダンスを提供しています。
セキュリティ保護の規格として導入することがまったく珍しくない現環境下において各クラウドプラットフォームでCIS Benchmarkに準拠しているのかを確認する方法をこちらについて記載させていただきます。
前提として
まず前提としてクラウドプラットフォームにおけるKubernetesクラスタのセキュリティ責任範囲を理解しておく必要があります。
Kubernetesは大まかな構成として各コンテナを動作させるための実行ホストとなるWorkerNode、そして各WorkerNodeとコンテナリソースを管理するMasterNodeの2つあります。クラウドプラットフォームでのMasterNodeに付随するコンポーネントの管理と保守はベンダーによって行われるため、利用者側の範囲対象外、言い換えれば利用者でCIS Benchmarkの導入、およびポリシーに準拠しているかの確認はできないことになります。つまり、利用者側確認できる範囲はWorkerNodeの範囲となります。
また、確認方法はAqua Security社が開発、提供しているkube-benchを用いてCIS Kubernetes Benchmark に記載されている推奨事項に準拠しているかどうかをチェックしていきます。
AKS(Azure Kubernetes Service)での導入方法
1.まず、kubectl-node_shellプラグイン(以前はkubectl-enterという名称でした)を作成し、対象のWorkerNodeにアクセスします。
$ curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell
$ chmod +x ./kubectl-node_shell
$ sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell
$ kubectl node-shell <node_name>
2.確認として以下のコマンドを実行します。
$ docker run --rm -v `pwd`:/host aquasec/kube-bench:latest install ./kube-bench node
3.下記のような実行結果が出力されれば問題なしとなります。
[INFO] 2 Worker Node Security Configuration
[INFO] 2.1 Kubelet
[PASS] 2.1.1 Ensure that the --anonymous-auth argument is set to false (Scored)
[PASS] 2.1.2 Ensure that the --authorization-mode argument is not set to AlwaysAllow (Scored)
[PASS] 2.1.3 Ensure that the --client-ca-file argument is set as appropriate (Scored)
[FAIL] 2.1.4 Ensure that the --read-only-port argument is set to 0 (Scored)
[PASS] 2.1.5 Ensure that the --streaming-connection-idle-timeout argument is not set to 0 (Scored)
[PASS] 2.1.6 Ensure that the --protect-kernel-defaults argument is set to true (Scored)
[PASS] 2.1.7 Ensure that the --make-iptables-util-chains argument is set to true (Scored)
[PASS] 2.1.8 Ensure that the --hostname-override argument is not set (Scored)
[PASS] 2.1.9 Ensure that the --event-qps argument is set to 0 (Scored)
[PASS] 2.1.10 Ensure that the --tls-cert-file and --tls-private-key-file arguments are set as appropriate (Scored)
※ベンダーによってはCIS BenchmarkのMasterNodeの準拠項目をサポートに確認し、回答いただける場合もございます。つきましては、今回の導入手順はCIS BenchmarkのWorkerNodeに対する項目が確認できる手順となります。
EKS(Elastic Kubernetes Service)での導入方法
1.Amazon Elastic Container Registry(ECR)リポジトリを作成して、kube-benchコンテナイメージをホストします。
aws ecr create-repository --repository-name k8s/kube-bench --image-tag-mutability MUTABLE
2.kube-benchコンテナイメージをダウンロードしてビルドし、ECRリポジトリにプッシュします。
$ git clone https://github.com/aquasecurity/kube-bench.git
$ cd kube-bench
$ aws ecr get-login-password --region <AWS_REGION> | docker login --username <AWS_USERNAME>
--password-stdin <AWS_ACCT_NUMBER>.dkr.ecr.<AWS_REGION>.amazonaws.com
$ docker build -t k8s/kube-bench .
$ docker tag k8s/kube-bench:latest <AWS_ACCT_NUMBER>.dkr.ecr.<AWS_REGION>.amazonaws.com/k8s/kube-bench:latest
$ docker push <AWS_ACCT_NUMBER>.dkr.ecr.<AWS_REGION>.amazonaws.com/k8s/kube-bench:latest
3. 2で記載した「.dkr.ecr..amazonaws.com/k8s/kube-bench:latest」をコピーし、job-eks.yamlの値をコピーした値に書き換えます。
4.job-eks.yamlをデプロイし、作成されたポッドを確認します。
$ kubectl apply -f job-eks.yaml
$ kubectl get pods --all-namespaces
5.kubectl get pods –all-namespacesで確認したポッドの値を取得し、以下のコマンドを出力し、レポートを出力させます。
レポートに下記のような出力があれば完了です。
[INFO] 2 Worker Node Security Configuration
[INFO] 2.1 Kubelet
[FAIL] 2.1.1 Ensure that the –allow-privileged argument is set to false (Scored)
[PASS] 2.1.2 Ensure that the –anonymous-auth argument is set to false (Scored)
[PASS] 2.1.3 Ensure that the –authorization-mode argument is not set to AlwaysAllow (Scored)
[PASS] 2.1.4 Ensure that the –client-ca-file argument is set as appropriate (Scored)
[FAIL] 2.1.5 Ensure that the –read-only-port argument is set to 0 (Scored)
[PASS] 2.1.6 Ensure that the –streaming-connection-idle-timeout argument is not set to 0 (Scored)
【外伝】GKE(Google Kubernetes Engine)での導入方法
GKEにおいては、AWSと同じく「https://github.com/aquasecurity/kube-bench.git」に含まれているGKE用kube-benchコンテナから確認することができますが、そもそもCIS Benchmarkの対応状況が公式資料に記載されていますのでそちらを確認する方が確実かと思います。
https://cloud.google.com/kubernetes-engine/docs/concepts/cis-benchmarks