IAM Role for Pods and Instance Meta Data Service

IAM Role for Pods and Instance Meta Data Service

0b5a8c592b267d1cc8d5d6a9577bdd34?s=128

@ジュジュ

January 23, 2020
Tweet

Transcript

  1. IAM Role for Pods と Instance Meta Data Service 2020/01/23

    岡野兼也(@Juju_62q) JAWS-UGコンテナ支部 #16@AWS
  2. Okano Kenya / @Juju_62q Belonging: - “CyberAgent, Inc” Team: “OpenSaaS

    Studio” Role: - “Backend Engineer” - “ほうれん草エバンジェリスト” - “銀の弾丸” Interest: - Microservices - “Domain Driven Development” - “Developer Experience” 22
  3. 皆さんも銀の弾丸になりませんか? 33 地上最高のTシャツを SUZURIで販売しています。 着ているので興味ある人は 見るに来てください

  4. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 44
  5. 2019/09にEKSユーザに激震が走りました 55

  6. IAM Role for ServiceAccount 66

  7. 77 IAM Role S3 IAM Role Dynamo Master Node Worker

    Node service account A service account B Pod S3 (service account A) Pod Dynamo (service account B) S3 Dynamo OpenID Connect
  8. 88 Pod S3 (service account A) Pod Dynamo (service account

    B) ここで にcredentialがマウントされる /var/run/secrets/eks.amazonaws.com/serviceaccount/token
  9. ServiceAccountごとにIAM Roleが制御できた 99

  10. でもその方法、今までなかった方法じゃない? 10 10

  11. それはそう。 11 11

  12. なので 12 12

  13. 古いAWS SDKからは読めません 13 13

  14. あなたのAWS SDK新しいですか? • 自身のアプリのAWS SDKはアップデートしていますか? • 依存ライブラリ・OSSのAWS SDKは全て新しいですか? ◦ kubernetes-sigの対応は早かった

    ◦ 全てのOSSがK8sを前提にしているわけじゃない ◦ メンテが続いていてもまだ対応していないことも 14 14
  15. 僕は違いました 15 15

  16. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 16 16
  17. kiamとは • IAM Role for ServiceAccountが出る前によく使われてい たIAM Role for Podsのツール

    • PodのアノテーションでIAM Roleを管理 • kube2iamというツールをもとにそこからRace Condition を排除し、セキュアにしたもの • AWS Traditional IAM Role Managementに対応 • uSwitch社が開発 17 17
  18. アーキテクチャを見る前に 18 18

  19. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 19 19
  20. “IAM Roleがアタッチされている” in IMDSv1 20 20 $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ hogehoge

    $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/hogehoge { "Code" : "Success", "LastUpdated" : "2019-12-08T07:20:38Z", "Type" : "AWS-HMAC", "AccessKeyId" : "*****", "SecretAccessKey" : "******", "Token" : "*****", "Expiration" : "2019-12-08T13:49:31Z" }
  21. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 21 21
  22. 続kiamとは 22 22 引用元: https://www.bluematador.com/blog/iam-access-in-kubernetes-kube2iam-vs-kiam

  23. 23 23 kiam-serverがSTSとやりとりしてcredentialを取得

  24. 24 24 kiam-agentがホストマシンのIMDSへのアクセスを kiam-agentにiptablesで書き換える

  25. 25 25 kiam-agentがkiam-serverとアクセスしてcredentialを取得

  26. 26 26 PodがIMDSにアクセスしようとして kiam-agentにアクセスし、credentialを取得

  27. IAM Roleが取得できた! 27 27

  28. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 28 28
  29. IMDSv2とは • IMDSv1は中に入りさえすれば簡単にmetadataを 取得できてしまっていた • やばいのでセキュアにしたやつ • LTで詳しく解説すると終わるので気になったら 調べてみましょう 29

    29
  30. “IAM Roleがアタッチされている” in IMDSv2 30 30 $ curl -X PUT

    http://169.254.169.254/latest/api/token \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" ${TOKEN} $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ \ -H "X-aws-ec2-metadata-token: ${TOKEN}" hogehoge $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/hogehoge \ -H "X-aws-ec2-metadata-token: ${TOKEN}" { "Code" : "Success", "LastUpdated" : "2019-12-08T07:20:38Z", "Type" : "AWS-HMAC", "AccessKeyId" : "*****", "SecretAccessKey" : "******", "Token" : "*****", "Expiration" : "2019-12-08T13:49:31Z" }
  31. “IAM Roleがアタッチされている” in IMDSv2 31 31 $ curl -X PUT

    http://169.254.169.254/latest/api/token \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" ${TOKEN} $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ \ -H "X-aws-ec2-metadata-token: ${TOKEN}" hogehoge $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/hogehoge \ -H "X-aws-ec2-metadata-token: ${TOKEN}" { "Code" : "Success", "LastUpdated" : "2019-12-08T07:20:38Z", "Type" : "AWS-HMAC", "AccessKeyId" : "*****", "SecretAccessKey" : "******", "Token" : "*****", "Expiration" : "2019-12-08T13:49:31Z" } PUTリクエストでセッショントークンを取得
  32. “IAM Roleがアタッチされている” in IMDSv2 32 32 $ curl -X PUT

    http://169.254.169.254/latest/api/token \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" ${TOKEN} $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ \ -H "X-aws-ec2-metadata-token: ${TOKEN}" hogehoge $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/hogehoge \ -H "X-aws-ec2-metadata-token: ${TOKEN}" { "Code" : "Success", "LastUpdated" : "2019-12-08T07:20:38Z", "Type" : "AWS-HMAC", "AccessKeyId" : "*****", "SecretAccessKey" : "******", "Token" : "*****", "Expiration" : "2019-12-08T13:49:31Z" } ヘッダにトークンをつけてアクセスをメタデータサーバにアクセス
  33. 色々セキュアになりました 33 33

  34. ところで、kiamを覗きましょう 34 34

  35. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 35 35
  36. Current Status 36 36 ※ Production環境ではありません 新しいAWS SDKでのIMDSv2に対するアクセスが全てエラーに。。。

  37. Contents 1. 2020年のイケてるIAM Role管理 for K8s on AWS 2. kiamとは

    3. “IAM Roleがアタッチされている” in IMDSv1 4. 続kiamとは 5. “IAM Roleがアタッチされている” in IMDSv2 6. Current Status 7. まとめ 37 37
  38. まとめ • 古いAWS SDKは早いとこ窓から投げ捨てましょう • 早めにIAM Role for ServiceAccountに移行するといい •

    古いものを使わないといけない場合 ◦ 古いものでのみkiamやkube2iamを使う ◦ それを”負債である”と認知する ◦ ライブラリバージョンアップ施策を進めましょう 38 38 一応kiamにもISSUEが立ってるので対応してくれるかも https://github.com/uswitch/kiam/issues/359