🐐

Kubernetes Goat で楽しくセキュリティを学ぶ

2022/12/21に公開

本記事は 3-shake Advent Calendar 2022 の20日目の記事です。
先日イベントで発表した内容を整理・加筆し、改めて Kubernetes Goat についてご紹介します。

発表資料はこちら↓

Kubernetes Goat とは?

Kubernetes のセキュリティを学習、実践するために、あえて脆弱に作られたクラスタとアプリケーション群です。いわゆる「やられ Kubernetes」というやつですね。
用意されたシナリオに沿って、脆弱なクラスタ上で様々なセキュリティ演習を行うことができます。

https://madhuakula.com/kubernetes-goat/

特徴としては、

  • セットアップが非常に簡単であること
  • AWS, Google Cloud, kind, k3s など、各々好きな環境で実行できること
  • 様々なシナリオが用意されており、演習形式でセキュリティを学習できること

が挙げられます。レベル感は初級〜中級者向けの印象です。
1つ1つのシナリオも長くないので、サクサク進められると思います。

セットアップ

今回は kind を使用して環境構築しました。
用意されているスクリプトを実行するだけでよく、非常に簡単です。
クラスタとアプリを立ち上げ後、port-forward でWebページにアクセスできるようにします。

# 環境構築(kind)
# https://madhuakula.com/kubernetes-goat/docs/how-to-run/kind
git clone https://github.com/madhuakula/kubernetes-goat.git
cd kubernetes-goat/platforms/kind-setup
bash setup-kind-cluster-and-goat.sh

# Kubernetes Goat home へのアクセス
# https://madhuakula.com/kubernetes-goat/docs/getting-started
cd ../..
bash access-kubernetes-goat.sh

https://madhuakula.com/kubernetes-goat/docs/how-to-run/kind

https://madhuakula.com/kubernetes-goat/docs/getting-started

http://127.0.0.1:1234 から Kubernetes Goat Home にアクセスできます。

以上でセットアップ完了です。この後は Kubernetes Goat Home と、公式ドキュメントを参考にしてシナリオを進めていってください。

シナリオ

Kubernetes Goat には、現在20のシナリオがあります(うち1つは Deprecated)。
クラスタへ攻撃を試みる、攻撃の痕跡を調査する、セキュリティ強化のツールや設定を導入するといったシナリオが用意されています。特に順序はないため、ご自身の興味に合わせて取り組んでみると良いでしょう。

  1. Sensitive keys in codebases
  2. DIND (docker-in-docker) exploitation
  3. SSRF in the Kubernetes (K8S) world
  4. Container escape to the host system
  5. Docker CIS benchmarks analysis
  6. Kubernetes CIS benchmarks analysis
  7. Attacking private registry
  8. NodePort exposed services
  9. Helm v2 tiller to PwN the cluster - [Deprecated]
  10. Analyzing crypto miner container
  11. Kubernetes namespaces bypass
  12. Gaining environment information
  13. DoS the Memory/CPU resources
  14. Hacker container preview
  15. Hidden in layers
  16. RBAC least privileges misconfiguration
  17. KubeAudit - Audit Kubernetes clusters
  18. Falco - Runtime security monitoring & detection
  19. Popeye - A Kubernetes cluster sanitizer
  20. Secure network boundaries using NSP

ここでは、いくつかのシナリオをピックアップしてご紹介します。
ノーヒントで進めたい方もいると思いますので、ネタバレのない範囲で説明しています(どうしてもネタバレしてしまう場合は折り畳みにしました)。

4. Container escape to the host system

https://madhuakula.com/kubernetes-goat/docs/scenarios/scenario-4

定番とも言えるコンテナエスケープの演習です。
このシナリオで利用するテクニックは初歩的なもので、コンテナエスケープを初めて体験する方にはちょうど良い題材です。
とはいえ事前知識は相応に必要になるため、ヒントや回答のサンプルコマンドを実行しつつ、理解を深めるのが良いでしょう。

コンテナエスケープにはより高度なテクニックや、脆弱性を利用した攻撃も存在します。(私の以前のブログでは、ある脆弱性を利用したコンテナエスケープについて調査しています)
このシナリオを通して興味を持った方は、深掘って調べてみることをお勧めします。

エスケープ後のサンプルコマンドが動かない(ネタバレ注意)

エスケープ後、dockerkubectl で情報収集するサンプルコマンドが用意されていますが、私の環境では正しく動作しませんでした。

root@kubernetes-goat-cluster-control-plane:/# docker ps
bash: docker: command not found

root@kubernetes-goat-cluster-control-plane:/# cat /var/lib/kubelet/kubeconfig
cat: /var/lib/kubelet/kubeconfig: No such file or directory

これは kind で作成したクラスタノードが containerd で動作していること、kubeconfig のパスが変わっていることが原因です。

nerdctl のインストールを試みましたがダウンロードが上手くいかず、こちらは一旦諦めました(方法はあるかもしれませんが、コンテナの情報は別の手段でも取れるので...)。
kubeconfig についてはプロセスから正しいパスを確認し、kubectl を実行することができました。

root@kubernetes-goat-cluster-control-plane:/# ps aux | grep /usr/bin/kubelet
root         797  7.5  3.5 2105636 73152 ?       Ssl  12:19  17:25 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --node-ip=172.18.0.2 --node-labels= --pod-infra-container-image=registry.k8s.io/pause:3.8 --provider-id=kind://docker/kubernetes-goat-cluster/kubernetes-goat-cluster-control-plane --fail-swap-on=false --cgroup-root=/kubelet

root@kubernetes-goat-cluster-control-plane:/# kubectl --kubeconfig /etc/kubernetes/kubelet.conf get po -n kube-system 
NAME                                                            READY   STATUS    RESTARTS   AGE
coredns-565d847f94-m8njt                                        1/1     Running   0          5h8m
coredns-565d847f94-z7fk9                                        1/1     Running   0          5h8m
...

10. Analyzing crypto miner container

https://madhuakula.com/kubernetes-goat/docs/scenarios/scenario-10

Kubernetes のマルウェアといえば、クリプトマイナーがよく話題に上がりますね。
このシナリオでは、コンテナ内に不正なプロセスが含まれる実例をもとに、不正なプロセスを発見する方法を学ぶことができます。

ボリュームは少なく、回答を見ながら進めるとシナリオ自体はすぐに終わってしまいます。
今回は実行されたコンテナを事後調査する内容ですが、不正なプロセスがクラスタ内で実行されないよう、防御する側の視点で考えてみても面白いと思います。

マニフェストのデプロイ時、コンテナ(プロセス)の起動時など、各タイミングでどのように防御することができるでしょうか?

14. Hacker container preview

https://madhuakula.com/kubernetes-goat/docs/scenarios/scenario-14

hacker

コンテナ内での情報摂取、攻撃や診断に使えるツール群を含む hacker-container が用意されています。
hacker-container をデプロイし、ぜひ色々と触ってみてください。

kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh

利用できるツール一覧は↓で確認できます。知らないツールがあれば調べてみることをお勧めします。
https://github.com/madhuakula/hacker-container/blob/master/list.todo

ちなみに hacker-container のデプロイでなぜかエラーが出るのですが、pod は作成されているので exec すれば入れます。

$ kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh
error: timed out waiting for the condition

$ kubectl get po hacker-container
NAME               READY   STATUS    RESTARTS   AGE
hacker-container   1/1     Running   0          23m

$ kubectl exec -it hacker-container -- sh
~ # 

Security Reports

Kubernetes Goat の公式ドキュメントには、KICS, Checov, Kubescape によるセキュリティスキャンの結果が載せられています。

https://madhuakula.com/kubernetes-goat/docs/security-reports

結果を眺めるだけでも非常に参考になりますが、各ツールの検出内容、出力形式を比較することでツールの選定にも利用できそうです。
また他のスキャンツールを自身で実行してみるのも楽しいと思います。

私は trivy k8s を実行してみました。結果を全て添付することはできなかったので、ぜひ各自で試してみてください。

さいごに

本記事を読んで、Kubernetes Goat に少しでも興味を持っていただけましたら幸いです。
お手軽に楽しく取り組めるコンテンツですので、皆さんも年末年始のお供にいかがでしょうか🐐

Discussion