21. Developer
Kubernetes Cluster
Worker Node #1
Worker Node #2
Manifest
Container
Image
Service A
Service B
Service C
$ kubectl apply
Master Node
Webサイトを
コンテナとしてデプロイ
あるチームではKubernetesをコンテナ基盤として利用しており、
アプリ開発者は様々なサービスをコンテナ(Pod)としてデプロイしています。
ある時、新たにWebサービスをユーザーに提供しようとコンテナをデプロイしました。
※今回のケースではWebサービスデプロイに用いるコンテナイメージ、Kubernetes Manifest(コンテナ起動設定)
にセキュリティリスクを含んでおり、攻撃者はそれらを利用して攻撃を仕掛けます
セキュリティリスクを含む
2.1. コンテナへの攻撃事例 -概要-
22. Developer
Kubernetes Cluster
Worker Node #1
Worker Node #2
Service A
Service B
Service C
Web
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web 1/1 Running 0 3m
service_a 1/1 Running 0 15h20m
service_b 1/1 Running 0 9h17m
service_c 1/1 Running 0 7h11m
Master Node
2.1. コンテナへの攻撃事例 -概要-
あるチームではKubernetesをコンテナ基盤として利用しており、
アプリ開発者は様々なサービスをコンテナ(Pod)としてデプロイしています。
ある時、新たにWebサービスをユーザーに提供しようとコンテナをデプロイしました。
※今回のケースではWebサービスデプロイに用いるコンテナイメージ、Kubernetes Manifest(コンテナ起動設定)
にセキュリティリスクを含んでおり、攻撃者はそれらを利用して攻撃を仕掛けます
23. User
Kubernetes Cluster
Worker Node #1
Worker Node #2
Service A
Service B
Service C
Web NW
Master Node
Webサイトにアクセス
ユーザーは新たに公開されたWebサービスにアクセスし、サービスを利用します。
2.1. コンテナへの攻撃事例 -概要-
27. Attacker
Kubernetes Cluster
Worker Node #1
Worker Node #2
Service A
Service B
Service C
Web NW
Master Node
悪意のあるユーザー(攻撃者)がWebサービスのセキュリティリスクを発見し、攻撃を仕掛けようと試みます。
なお、今回の例で攻撃者は一般ユーザーと同じくインターネット越しにサービスにアクセスするものとします。
※本来攻撃を仕掛ける際は攻撃者がどのようにセキュリティリスクを発見するか、どのように攻撃対象の構成を知るか、
といった観点も考慮する必要がありますが、今回の趣旨とは話が逸れるため省略させていただきます。
Attack!!
2.1. コンテナへの攻撃事例 -概要-
28. Attacker
Container Host(Worker Node #1)
Service A
Web
今回のシナリオでは攻撃者は以下の2つの攻撃を試みます。
[シナリオ①] コンテナを乗っ取る
Webサービスに不正なリクエストを送りつけることでコンテナにバックドアを仕掛けて侵入する。
その後、Webサイトのリンクを書き換える。
[シナリオ②] コンテナホストを乗っ取る
侵入したコンテナからコンテナホストに対して不正なコマンドを発行する。
コマンド実行によりバックドアを仕掛けることでコンテナホストに侵入する。
①-1. コンテナ内に侵入
①-2. Webサイトを書き換え
cmd
②-1. コンテナホストに対して不正なコマンドを実行
Back Door
②-2. バックドアを作成
②-3. バックドアを経由して侵入
2.1. コンテナへの攻撃事例 -概要-
※開発者がセキュリティリスクを含むコンテナをデプロイしているケースを想定した攻撃デモを目的と
しているため、意図的に脆弱な環境を作成しています
また、コンテナレイヤのリスクを表現するため、あえて基盤管理レイヤへのセキュリティ対策は
行っていません
43. 攻撃者端末において、ターミナル3でコマンドを発行するとその実行結果がターミナル2に表示されるようになりました。
これで攻撃者は自身の端末からコンテナホストに対して任意のコマンドを発行できるようになりました。
(コンテナホストを乗っ取ることができた)
# nc -l 8023
uid=0(root) gid=0(root) groups=0(root)
k8s-cluster1-worker01
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT POD ID
f73e6d0a32955 b00e04dc37e5b 15 minutes ago Running web 0 6e32489bcb40e
f090ed1dec116 20e6ceb085463 29 hours ago Running service_a 0 3fd1801877dbe
4fe0ae03678de bbad1636b30d8 5 days ago Running kube-proxy 0 59c4d874c0a5b
6698a0c797f1e 8d147537fb7d1 5 days ago Running coredns 0 b52984d75ce11
攻撃者端末(ターミナル2)
# nc 192.168.2.154 9023
id
hostname
crictl ps
Attacker
Container Host(Worker Node #1)
Web
攻撃者はバックドアを経由して任意の
コマンドを実行できるようになった
8023ポート待ち受け
Back Door
(9023ポート待ち受け) 9023ポート宛通信
id
hostname
crictl
攻撃者端末(ターミナル3)
2.3. コンテナへの攻撃事例 -②コンテナホストを乗っ取る-
57. 代表的なイメージのセキュリティリスクに対処するためのプラクティス
■概念
NIST SP800-190 アプリケーションコンテナセキュリティガイド(IPA日本語翻訳版)
- 4.1 イメージの対策
https://www.ipa.go.jp/
fi
les/000085279.pdf
■具体的な設定
CIS Benchmark Docker
- 4 Container Images and Build File Con
fi
guration
https://www.cisecurity.org/benchmark/docker
Best practices for writing Docker
fi
les
https://docs.docker.com/develop/develop-images/docker
fi
le_best-practices/
3.2. コンテナセキュリティの考え方 -イメージ- 対策
66. Container Host
OS
process A
process B
process C
process D
コンテナとして起動するプロセス
コンテナはあくまでOS上で実行される1プロセスに過ぎません。
rootfs(/)
3.3. コンテナセキュリティの考え方 -コンテナ-
基本
原則
67. Container Host
OS
process A
rootfs(/)
process B
process C
rootfs(/)
process D
Container
Isolation
Namespace:プロセスの実行空間を隔離
pivot_root + OverlayFS:rootfsを隔離
Limitation
cgroup:リソースを制限
Restriction
Capability:プロセスの権限範囲を制限
Seccomp:システムコールを制限
MAC(AppArmor/SELinux):ファイルアクセスを制限
ReadOnlyMount:重要なファイルシステム(/procや/sys等)をROでマウント
etc
一般的なプロセスとコンテナの違いは、コンテナとして実行されるプロセスはLinuxカーネルの持つ様々な仕組みを使って
他のプロセスから隔離されている点です。
3.3. コンテナセキュリティの考え方 -コンテナ-
基本
原則
68. Container Host
Container Host
process
Container A
process
Container B
コンテナとしての隔離性が高い状態 コンテナとしての隔離性が低い状態
コンテナ内で動くプロセスの動作が
ホストに影響しない
コンテナ内で動くプロセスの一部の
動作がホストに影響してしまう
コンテナの隔離性を維持する
3.3. コンテナセキュリティの考え方 -コンテナ-
基本
原則
<< セキュリティリスク <<
小 大
73. mount ¦ grep cgroup
(略)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
(略)
(特権コンテナ)
今回のケースでは特権を与えたことによりcgroupへのアクセス権がRWに設定されました
今回の攻撃事例ではコンテナに特権を付与したことで、
本来コンテナの仕組み上ReadOnlyが設定されるべきcgroupへの書き込みが可能な状態となっていました。
これによりcgroupをコンテナ内から操作して、ホスト上で任意のプログラムを実行するという攻撃に繋げることが
できてしまいました。
mount ¦ grep cgroup
(略)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/rdma type cgroup (ro,nosuid,nodev,noexec,relatime,rdma)
(略)
(非特権コンテナ)
通常コンテナではcgroupへのアクセス権はROに設定されます
3.3. コンテナセキュリティの考え方 -コンテナ- リスク
74. mkdir /sys/fs/cgroup/rdma/x
・
・
・
sh -c "echo $$ > /sys/fs/cgroup/rdma/x/cgroup.procs"
本来コンテナからは許可されていない
cgroupの操作を通じたプログラムの実行
mkdir /sys/fs/cgroup/rdma/x
mkdir: cannot create directory '/sys/fs/cgroup/rdma/x': Read-only
fi
le system
(非特権コンテナ)
cgroupへのアクセス権がROなのでcgroupの作成が許可されていない
(特権コンテナ)
cgroupへのアクセス権がRWに設定されておりcgroupの作成や設定変更が可能
3.3. コンテナセキュリティの考え方 -コンテナ-
今回の攻撃事例ではコンテナに特権を付与したことで、
本来コンテナの仕組み上ReadOnlyが設定されるべきcgroupへの書き込みが可能な状態となっていました。
これによりcgroupをコンテナ内から操作して、ホスト上で任意のプログラムを実行するという攻撃に繋げることが
できてしまいました。
リスク