EKSを使う際に注意すべきという情報をゲットしたのでまとめます。
IMDSとは?
AWS EC2におけるインスタンスメタデータサービス(Instance Meta Data Service)のこと。
http://169.254.169.254/latest/meta-data/にアクセスすることで、EC2自身のデータなどを取得できる便利な機能です。これを使うことでEC2自体にて、自分がどう言う存在の EC2なのか?を判断させることができます。
AWSだけではなく他のクラウドにもある機能ですね。
ちなみに脆弱性の対象になることも…
こちらで紹介されていますがSSRFという攻撃はIMDSをターゲットにした攻撃です。外部からIMDSを叩くことで対象のEC2のクレデンシャルを不正に取得するものです。
これに対してAWSではIMDSv2と呼ばれる新機能を発表していますが、根本的な解決ではないため徳丸さんの記事に書かれている通りiptablesによるアクセスブロックなどが紹介されています。
EKSにおけるIMDS
さて、ではEKSなどのようにEC2の上にpodがいる場合はどのようになるのでしょうか?
結論はEC2に割り当てたIAMロールの認証情報がpodにも適用されます。
要するにEC2がS3にアクセスできるなら、Podも同じくS3にアクセスできるわけです。Podをそういった要件で起動する場合を除き、セキュリティの原則は最小限となっていますので、すべてのPodにEC2と同等の権限を持たせるのはやりすぎですね。
結局どうすればいい?
2パターン分かれます。
- PodにIMDSを使わせる場合(ただしIMDS v1は無効にする)
- PodにIMDSを使わせない場合
基本的にはPodに対してIRSAを使用したWeb FederationでPod単体に対してIAMの権限をAssumeする機能を使いますので2で良いかなと思います。一方でPodがどのEC2インスタンスで動いているのかを判別して挙動を変更するという設定をしたいのであれば1を選ぶ必要があります。
1の場合は、EC2インスタンスの起動設定にてIMDSへのアクセスを限定的にする方法がAWSのドキュメントに記載されていますのでそれを設定しましょう。
2の場合は、これまたAWSのドキュメントにiptablesを利用したIMDS向け通信をブロックする方法が記載されていますのでそれを設定しましょう。
注意事項
- いずれの設定をした場合でもhostnetworkが設定されたpodはIMDSが使用できます(kube-proxy や CNI プラグインなど)
- Calicoを導入しNetwork Policyを使用している場合はiptablesで入れたルールが上書きされる可能性があるので、注意しましょう
- AWS VPC CNIでSecurity GroupをPodに適用している場合は使っているインターフェースがvlan(ブランチネットワークインターフェース)になっているので、追加のコマンドを入力しましょう
- EBS CSIやdatadogではMetadataを利用していたため無効化したらただしくPodが起動しなくなりました