Slide 1

Slide 1 text

Docker/ECSで IAMロールを利利⽤用する Docker  Meetup  #4  LT classmethod.jp 1 2015/1/17 クラスメソッド株式会社 ⼤大瀧隆太

Slide 2

Slide 2 text

classmethod.jp 2 ⾃自⼰己紹介 •  ⽒氏名  :  ⼤大瀧隆太                    @takipone •  会社  :  クラスメソッド •  ポジション  :      AWSコンサル部    エンジニア  /  研修講師 classmethod.jp 2

Slide 3

Slide 3 text

前段のお話をブログに書きました classmethod.jp 3 http://dev.classmethod.jp/cloud/creds-‐‑‒design-‐‑‒pattern-‐‑‒in-‐‑‒docker/

Slide 4

Slide 4 text

Dockerコンテナのクレデンシャル管理理 1.  DockerfileのADDなどで設定ファイルを Dockerイメージに埋め込む – クレデンシャル更更新によるイメージの作り直し – Docker  HubへのPushは漏漏洩につながってしまう 2.  環境変数をdocker  run  -‐‑‒-‐‑‒envで渡す – GKE/ECSだと環境変数を定義ファイルに記述す るので、そのファイルの管理理が必要 3.  クラウドサービスを利利⽤用することで、 クレデンシャルが外出しできる – AWS  :  IAMロール – GCE  :  Service  Account classmethod.jp 4

Slide 5

Slide 5 text

classmethod.jp 5 AWS  IAMロールの仕組み EC2 AWS  IAM メタデータ サーバー 169.254.169.254 S3 ⼀一時キー ⼀一時キー GET  /latest/meta-‐‑‒data/iam/ security-‐‑‒credentials/role-‐‑‒name ⼀一時キーでS3にアクセス

Slide 6

Slide 6 text

classmethod.jp 6 DockerコンテナからのIAMロール EC2 AWS  IAM メタデータ サーバー 169.254.169.254 S3 ⼀一時キー インスタンスと同じ⼀一時キー が取得できる/できちゃう

Slide 7

Slide 7 text

DockerコンテナからのIAMロール •  コンテナとインスタンスで区別できない – インスタンスと同等の権限が全コンテナから参照 できてしまう •  コンテナ単位の権限分けができない – fluentコンテナはs3:PutObject権限を、 phpコンテナはcloudwatch:PutMetricData権限 を付与したい! •  現在のECSでは、インスタンスの権限(ecs:*) と全コンテナの権限の合算を設定することで 対応 classmethod.jp 7

Slide 8

Slide 8 text

classmethod.jp 8 メタデータサーバーの⾃自前実装 http://qiita.com/j3tm0t0/items/b63d456cafd20b1624fd

Slide 9

Slide 9 text

classmethod.jp 9 こうする。 AWS  IAM メタデータ サーバー 169.254.169.254 S3 ⼀一時キー sts:AssumeRole メタデータサーバーへ のトラフィックを⾃自前 サーバーにフック ⾃自前メタデータ サーバー

Slide 10

Slide 10 text

classmethod.jp 10 こうする。(⾃自前サーバーの実⾏行行) $ ruby ec2-role.rb arn:aws:iam::XXXXXXXXXXXX:role/exc_web [2015-01-16 15:04:44] INFO WEBrick 1.3.1 [2015-01-16 15:04:44] INFO ruby 2.1.5 (2014-11-13) [x86_64-linux-gnu] == Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick [2015-01-16 15:04:44] INFO WEBrick::HTTPServer#start: pid=2425 port=4567 { "Code" : "Success", "AccessKeyId" : "ASIAJUGBBWGPOE5LB2DA", "SecretAccessKey" : "F1UCLL1xus3i/HX5UjmJRoPzothnnAza9WRCRbSn", "Token" : "AQoDYXdzEPD////////// wEakAJ5SVuBEVHPmjjCMmaAJ7zX6MJsRy09k62S92wCO5rGImeVeKx +IB4AVZJ4eE8E0kRGpI7RDpW1l3UEqfeWon6AKwuNJQxgrcKOuB91zKSi3BeH8nT/ d2JUoY2deUVyBMLg3LoebPIlAzl1l83mbQ1Dds1vsj6pSn+nhU0w +hFJxypQcEGDSUrGyJMw15xDD/DQ+9G001ocbp0yBD4otjInNxWgB/ kME1KBPVANSLcJKSTubvNqjwyVgQpPGdu5p/eutns/sSvvRfYgKU9eSEdZzJ5y3djSEoo +J4Rmwrtol4p0fS1VhzsQOxPpH5nCaJwJiW3LnUfPbaDGoCwk2kq6z8sH8sx1t0Du +VT9Xp0qYSCM0eSlBQ==", "Expiration" : "2015-01-16T16:04:44Z" }

Slide 11

Slide 11 text

classmethod.jp 11 こうする。(トラフィックのフック) $ sudo iptables -t nat \ -A PREROUTING -j DNAT \ -i docker0 \ -p tcp \ ! --src 172.17.0.2 \ --dst 169.254.169.254 --dport 80 \ --to 172.17.42.1:4567

Slide 12

Slide 12 text

classmethod.jp 12 できた。 $ docker exec 2de1f31fcb3d curl -s 169.254.169.254/latest/meta-data/iam/ security-credentials/temp { "Code" : "Success", "AccessKeyId" : "ASIAJUGBBWGPOE5LB2DA", "SecretAccessKey" : "F1UCLL1xus3i/HX5UjmJRoPzothnnAza9WRCRbSn", "Token" : "AQoDYXdzEPD////////// : $ ruby ec2-role.rb arn:aws:iam::XXXXXXXXXXXX:role/exc_web : 172.17.0.3 - - [17/Jan/2015:04:58:54 +0000] "GET /latest/meta-data/iam/ security-credentials/temp HTTP/1.1" 200 590 0.0003 ip-172-17-0-3.ec2.internal - - [17/Jan/2015:04:58:54 UTC] "GET /latest/ meta-data/iam/security-credentials/temp HTTP/1.1" 200 590 - -> /latest/meta-data/iam/security-credentials/temp •  コンテナからメタデータサーバーにリクエスト •  ⾃自前メタデータサーバーにアクセスログが表⽰示

Slide 13

Slide 13 text

classmethod.jp 13 今後の課題 •  ⾃自家メタデータサーバー⾃自体をコンテナに •  コンテナごとにロールを切切り替えたい •  Dockerコンテナのクレデンシャル管理理は、 もっとディスカッションされてもいい話題