7 ポイント 投稿者 ironlung 2023-10-05 | まだコメントはありません。 | WhatsAppで共有
  • この内容は、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を暗号化

まだコメントはありません。

まだコメントはありません。