KubernetesをハックしてSecretリソースに保存されたパスワードを見つける方法
(insight.infograb.net)- この内容は、Kubernetesセキュリティの重要性を喚起することが目的
- Secretの保存場所
- ユーザーが
kubectlコマンドでリソースを宣言すると、Kubernetesはそのリソースを定義したマニフェストファイルを作成してetcdに保存 - ユーザーがSecretリソースを宣言すると、Secretもetcdに保存
- ユーザーがSecretをボリュームまたは環境変数として読み込むpodを作成すると、Secretはそのpodに保存
- Secretが保存されるetcdと、secretが使われるpodをハックすると、Secretに保存されたパスワードを知ることができる
- ユーザーが
- 事前準備
kubeadmでクラスターを作成- 実習のために3つのリソースを事前に作成: Secret
credit-card、podapp1、podapp2
- etcdのハック
- etcd: Kubernetesクラスターの状態を保存するキー・バリューデータストア。Kubernetesに宣言されたすべての情報がここに保存される。Secretもetcdを参照すれば分かる
- 1.1
etcdctlでパスワードを見つけるkube-apiserverのマニフェストを参照して、etcdサーバーのcertificate authority、公開鍵、秘密鍵を取得- etcdを手軽に操作する
etcdctlコマンドでパスワードを見つける
- 1.2 etcd DBに直接アクセスして取得
- etcdが動作しているプロセスを見つけ、そのプロセスのデータをすべて探索してパスワードを見つける
ps aux | grep etcd- etcd PIDを取得ll /proc/<pid>/fdを見ると、dbと書かれたlinkファイルが見えるcat /proc/<pid>fd/<db> | grep -A10 -B10 credit-cardコマンドで事前に作ったパスワードを見つける
- etcdが動作しているプロセスを見つけ、そのプロセスのデータをすべて探索してパスワードを見つける
- podのハック
kubectl execで取得- Kubernetesを参照できる適切な権限があれば、
kubectlコマンドでパスワードを取得できる
- Kubernetesを参照できる適切な権限があれば、
- コンテナに直接アクセスして取得
- ワーカーノードでDockerコマンドを自由に使えるなら、パスワードを抜き取れる
- pod
app1がスケジュールされたワーカーノードでコンテナを見つけ、コンテナに登録された環境変数一覧を抽出できるcrictl pods-app1のPod IDを見つけるcrictl ps- Pod IDに対応するコンテナを見つけるcrictl inspect <container id> | grep -A16 env- そのコンテナの詳細を参照して環境変数を抽出
- Secretにアクセス権のあるServiceAccountで取得
- PodのServiceAccountがSecretへのアクセス権を持っていれば、pod内部でAPI呼び出しによりパスワードを見つけられる
- 上で説明したハックを防ぐ方法
- 「最小権限の原則」に従い、不必要な権限を持つservice accountを作らない
- ソーシャルエンジニアリングなどの脅威に備え、ユーザーcredentialを露出させない
EncryptionConfigurationリソースによってetcdを暗号化
まだコメントはありません。