Slide 1

Slide 1 text

IAM Role for Pods と Instance Meta Data Service 2020/01/23 岡野兼也(@Juju_62q) JAWS-UGコンテナ支部 #16@AWS

Slide 2

Slide 2 text

Okano Kenya / @Juju_62q Belonging: - “CyberAgent, Inc” Team: “OpenSaaS Studio” Role: - “Backend Engineer” - “ほうれん草エバンジェリスト” - “銀の弾丸” Interest: - Microservices - “Domain Driven Development” - “Developer Experience” 22

Slide 3

Slide 3 text

皆さんも銀の弾丸になりませんか? 33 地上最高のTシャツを SUZURIで販売しています。 着ているので興味ある人は 見るに来てください

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

2019/09にEKSユーザに激震が走りました 55

Slide 6

Slide 6 text

IAM Role for ServiceAccount 66

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

88 Pod S3 (service account A) Pod Dynamo (service account B) ここで にcredentialがマウントされる /var/run/secrets/eks.amazonaws.com/serviceaccount/token

Slide 9

Slide 9 text

ServiceAccountごとにIAM Roleが制御できた 99

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

それはそう。 11 11

Slide 12

Slide 12 text

なので 12 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

あなたのAWS SDK新しいですか? ● 自身のアプリのAWS SDKはアップデートしていますか? ● 依存ライブラリ・OSSのAWS SDKは全て新しいですか? ○ kubernetes-sigの対応は早かった ○ 全てのOSSがK8sを前提にしているわけじゃない ○ メンテが続いていてもまだ対応していないことも 14 14

Slide 15

Slide 15 text

僕は違いました 15 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

kiamとは ● IAM Role for ServiceAccountが出る前によく使われてい たIAM Role for Podsのツール ● PodのアノテーションでIAM Roleを管理 ● kube2iamというツールをもとにそこからRace Condition を排除し、セキュアにしたもの ● AWS Traditional IAM Role Managementに対応 ● uSwitch社が開発 17 17

Slide 18

Slide 18 text

アーキテクチャを見る前に 18 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

“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" }

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

続kiamとは 22 22 引用元: https://www.bluematador.com/blog/iam-access-in-kubernetes-kube2iam-vs-kiam

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

IAM Roleが取得できた! 27 27

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

IMDSv2とは ● IMDSv1は中に入りさえすれば簡単にmetadataを 取得できてしまっていた ● やばいのでセキュアにしたやつ ● LTで詳しく解説すると終わるので気になったら 調べてみましょう 29 29

Slide 30

Slide 30 text

“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" }

Slide 31

Slide 31 text

“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リクエストでセッショントークンを取得

Slide 32

Slide 32 text

“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" } ヘッダにトークンをつけてアクセスをメタデータサーバにアクセス

Slide 33

Slide 33 text

色々セキュアになりました 33 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Current Status 36 36 ※ Production環境ではありません 新しいAWS SDKでのIMDSv2に対するアクセスが全てエラーに。。。

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

まとめ ● 古いAWS SDKは早いとこ窓から投げ捨てましょう ● 早めにIAM Role for ServiceAccountに移行するといい ● 古いものを使わないといけない場合 ○ 古いものでのみkiamやkube2iamを使う ○ それを”負債である”と認知する ○ ライブラリバージョンアップ施策を進めましょう 38 38 一応kiamにもISSUEが立ってるので対応してくれるかも https://github.com/uswitch/kiam/issues/359