EKS Best Practices Guide for Security を読んだ
EKS と銘打たれている通り、 Kubernetes ではなく EKS にフォーカスした記述は少なくない。例えば暗号化についての項では、 Nitro におけるトラフィックのデフォルト暗号化に触れていたりする。しかし大半は Kubernetes あるいは Docker そのもののプラクティスになっていて、 EKS に限らずとも、 Kubernetes 使用者にとって学べることは多い。内容は Identity and Access Management に始まり、 Pod や Network 、 Runtime といった各要素のセキュリティプラクティスを俯瞰し、 PCI DSS のようなコンプライアンス関係についても少し記述を割いている、かなり包括的な内容となっている。
すべてオープンソースでの公開となっており、 https://github.com/aws/aws-eks-best-practices から issue や Pull Request を出すこともできる。また、 for Security
と銘打っている以上、他にも for XXX
が続くのではないかと期待されるところだが、レポジトリに GitHub Project が設けられており、そこから Performance 、 Reliability 、 Cost Optimization などが計画されていることが垣間見える。つい先日は for Cluster Autoscaler
が追加された。個人的に、 AWS のドキュメントを読んで組めるのは「とりあえず使える Kubernetes」であり、そこからプラスアルファで行うべきプラクティスは非常に多く、なかなか捉えどころも難しいように感じている。何年か前の状況に置き換えると、 EC2 で nginx と Rails を動かすだけならそれなりに簡単だけど、セキュリティグループや LB をきちんと扱えているか、 Scaling をどうするのかといった非機能的要件になると話が変わってくるようなイメージだ。それがオフィシャルな Best Practices としてまとまり、さらにオープンに編集可能というのは非常に嬉しいことだなと感じている。
以下、自分が読んだ中でメモした箇所をいくつか挙げておく。
- Pod Security
- コンテナイメージに shell を入れるべきではない
sh
ぐらいは入れていることがあるので、そこまで徹底出来る方が確かに好ましそう
- Pod Security Policy
- https://kubernetes.io/docs/concepts/policy/pod-security-policy/
- root での起動を許可しないなどいくつかルールを定め、そのルールに従った Pod 以外は起動できなくするもの
- まだ beta だが使ってみたいところ
- コンテナイメージに shell を入れるべきではない
- Multi-tenancy
- Namespace を使った Soft multi-tenancy や、 cluster 自体分離する Hard multi-tenancy について説明されている
- 個人的には Soft で限りなく済ませておきたい気持ちが強い
- Kubernetes Multi-Tenancy – A Best Practices Guide | Loft Blog あたりも参考に
- Namespace を使った Soft multi-tenancy や、 cluster 自体分離する Hard multi-tenancy について説明されている
- Detective Controls
- audit log の解析や監視
- 同様に CloudTrail log も
- 地力で監視するのはどう考えても大変なので自動化して何か考えたいが。。
- Infrastructure Security
- aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark
- CIS Kubernetes Benchmark に則っているかチェックしてくれるツール
- Amazon Inspector の活用
- aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark
- Incident response and forensics
- 実際にセキュリティインシデントが発生したら、どう対処するか
- Network Policy を使った通信の遮断
- 該当 node に対して cordon を実施
- 問題のある node や pod に label を付与してわかりやすくしてから対処する
- などなど
- 実際にセキュリティインシデントが発生したら、どう対処するか
- Image Security
- 大原則として、余計なソフトウェアなどは極力入っていないことが望ましい
- 可能であれば
FROM scratch
する
- 可能であれば
- wagoodman/dive: A tool for exploring each layer in a docker image などを使ってイメージを縮小する
- projectatomic/dockerfile_lint を使って Dockerfile に lint をかける
- 大原則として、余計なソフトウェアなどは極力入っていないことが望ましい