- この内容は、Kubernetesセキュリティの重要性を喚起することが目的
- Secretの保存場所
- ユーザーが
kubectlコマンドでリソースを宣言すると、Kubernetesはそのリソースを定義したマニフェストファイルを作成してetcdに保存
- ユーザーがSecretリソースを宣言すると、Secretもetcdに保存
- ユーザーがSecretをボリュームまたは環境変数として読み込むpodを作成すると、Secretはそのpodに保存
- Secretが保存されるetcdと、secretが使われるpodをハックすると、Secretに保存されたパスワードを知ることができる
- 事前準備
kubeadmでクラスターを作成
- 実習のために3つのリソースを事前に作成: Secret
credit-card、pod app1、pod app2
- 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 コマンドで事前に作ったパスワードを見つける
- podのハック
kubectl execで取得
- Kubernetesを参照できる適切な権限があれば、
kubectlコマンドでパスワードを取得できる
- コンテナに直接アクセスして取得
- ワーカーノードで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を暗号化
まだコメントはありません。