Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
IAMロールはどこから来て、どこへ行くのか / Where do IAM rolls come from and where to go?
Ryotaro Tamura
November 04, 2017
Technology
2
2k
IAMロールはどこから来て、どこへ行くのか / Where do IAM rolls come from and where to go?
JAWS FESTA 2017
Ryotaro Tamura
November 04, 2017
Tweet
Share
More Decks by Ryotaro Tamura
See All by Ryotaro Tamura
Prometheus setup with long term storage
tokibi
7
5.2k
nanafshiを使って簡単に作るFUSEの動的ファイル
tokibi
0
350
monotips #3 - fzfる
tokibi
0
97
Other Decks in Technology
See All in Technology
- Rでオブジェクト指向プログラミング- クラス設計入門の入門
kotatyamtema
1
640
WINTICKET QA における Autify 活用
kj455
1
180
LINEにおけるネットワーク自動化チーム / Network Automation Team in LINE
line_developers
PRO
0
230
UIFlowの2.0がやってきた! / ビジュアルプログラミングIoTLT vol.13
you
0
210
OCIコンテナサービス関連の技術詳細 /oke-ocir-details
oracle4engineer
PRO
0
750
OpenShiftでスポットVMを使おう.pdf
jpishikawa
1
120
AKIBA.SaaS資料
yasumuusan
0
160
IoT から見る AWS re:invent 2022 ― AWSのIoTの歴史を添えて/Point of view the AWS re:invent 2022 with IoT - with a history of IoT in AWS
ma2shita
0
140
PHPのimmutable arrayとは
hnw
1
130
SmartHRからOktaへのSCIM連携で作り出すHRドリブンのアカウント管理
jousysmiler
1
100
Cloudflare Workersで動くOG画像生成器
aiji42
1
450
EMになって最初の失敗談 - コミュニケーション編 -
fukuiretu
1
330
Featured
See All Featured
Support Driven Design
roundedbygravity
88
8.9k
A Philosophy of Restraint
colly
193
15k
The Invisible Customer
myddelton
113
12k
What the flash - Photography Introduction
edds
64
10k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
The Web Native Designer (August 2011)
paulrobertlloyd
76
2.2k
What's new in Ruby 2.0
geeforr
336
30k
jQuery: Nuts, Bolts and Bling
dougneiner
57
6.6k
Atom: Resistance is Futile
akmur
256
24k
Rails Girls Zürich Keynote
gr2m
87
12k
Infographics Made Easy
chrislema
235
17k
Building Adaptive Systems
keathley
27
1.3k
Transcript
Copyright © 2017. All rights reserved. ハンズラボ株式会社 田村龍太郎 IAMロールはどこから来て どこへ行くのか
JAWS FESTA 2017
1 自己紹介 • 名前:田村 龍太郎 • 所属:ハンズラボ株式会社 • 入社:2017年3月 •
出身地:徳島県 • AWS歴:8ヶ月 • 初登壇で緊張してます
2 まえおき サポーターセッションなのにIAMの話? ハンズラボ関係なくない?
3 まえおき ハンズラボ四国代表として登壇が決まるものの
4 まえおき 15分も喋ることが思いつかなかった
5 まえおき この人→ 会社の取り組みは、弊社CEOが色んな所で喋ってるので
6 まえおき 今日は、社内勉強会こんな感じでやってるよ というご紹介も兼ねて、10分ぐらいのお話をします
7 はじめに AWSを使いはじめてからずっと気になっていたこと
8 はじめに IAMロールが何なのかよくわからない
9 何がわからないのか • ドキュメントを読めば、設定方法や使い方はわかる • 実装レベルで何が起きてるのかわからない • もやもやする → 調べよう!
10 よくあるユースケース EC2 Lambda S3 DynamoDB ロール • EC2のインスタンス等にロールを設定することで、 権限に応じたAWS
リソースを呼び出し可能 • 例: S3のバケットにファイルをアップロード • リソースの利用権限はロールにアタッチされたポリシーによって決まる ポリシー リソースを 呼び出し アタッチ ロール
11 疑問その1 どうやってリソースの利用権限を取得しているのか
12 IAMユーザーの場合 • マネジメントコンソールでアクセスキーを生成 • AWS CLIの場合は aws configure を実行してキー情報を入力
• デフォルトだと ~/.aws/credentials に記録される • IAMユーザーが持つ権限通りにリソースが利用ができる • ではIAMロールは?
13 EC2インスタンスで追ってみた • ロールの設定はEC2インスタンスに対して行う。 • インスタンス内で自身の情報を取ってる方法は? • インスタンスメタデータ (http://169.254.169.254)にリクエスト •
ロールの情報もあるはず! • 設定されているロールを取得できた $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ sample-role
14 EC2インスタンスで追ってみた • ロール名を指定してリクエストするとCredentialがJSONで返ってくる • 見覚えのある文字が • 何が行われたのか? $ curl
http://169.254.169.254/latest/meta-data/iam/security-credentials/sample-role { "Code" : "Success", "LastUpdated" : "2017-10-30T06:54:40Z", "Type" : "AWS-HMAC", "AccessKeyId" : "ASIAXXXXXXXXXXXXXXXX", "SecretAccessKey" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Token" : "xxxxx...", "Expiration" : "2017-10-30T13:04:40Z" }
EC2インスタンス EC2サービス STS IAM ① ⑤ ② ④ ③ 15
メタデータの動作イメージ AssumeRole 実行 一時的なCredential メタデータを リクエスト アタッチ メタデータの レスポンス AssumeRolePolicy 確認 IAMポリシー
16 AssumeRoleとは • AWS Security Token Service(STS)に用意されているAPI • 指定したIAMロールの持つ権限を、一時的に引き受ける(Assume)機能 •
AssumeRoleという動作の主体になるのは権限を必要とする側 • 今回の例では、EC2がSTSに「オレにそのロールの権限使わせてよ」 と伝える感じ ① 権限ください ③ あげる ② Credential生成
17 AssumeRoleとは • 権限を要求する主体は、ロールと同じAWSアカウント内に限定されない • 別のAWSアカウントにいるIAMユーザー • Amazon, Facebook, Google,
Cognito で認証されたユーザー • 任意のOpenID ConnectおよびSAMLのIDプロバイダで認証されたユーザー ① 認証 ⑥ あげる ⑤ Credential生成 ② トークン取得 ③ ください(トークン付) ④ 検証
18 AssumeRoleとは • STSが誰にでもホイホイ権限を渡してしまうとセキュリティに問題がある • 渡しても良い相手(Trusted entity)をIAMロールで事前に設定しておく • これがAssumeRolePolicyになる(IAMポリシーとは別に存在) ください
ください AssumeRolePolicy IAMポリシー Trusted entity確認
19 AssumeRolePolicyの設定画面
20 回答その1 どうやってリソースの利用権限を取得しているのか STSのAssumeRoleを通して 一時的なCredentialを取得している
21 余談 • わざわざメタデータにリクエスト送らなくても、インスタンス内のCLIで 直接AssumeRoleを実行すればいいのでは? $ aws sts assume-role --role-arn
arn:aws:iam::111122223333:role/sample-role --role-session-name "hogehoge" • できない (aws configureなどを行っていない状態) • ロールのAssumeRolePolicyでは • 特定のEC2インスタンスを信頼しているのではない • EC2サービス(マネージドな部分)を信頼している • インスタンスにロールを設定するということは • AssumeRoleを行う権限を与えているのではない • メタデータの該当ロールのURIへリクエストを送る権限を与えている • EC2サービス(メタデータ)を経由する必要がある
22 疑問その2 Credentialが取得できるのはわかったけど これどうするの?
23 回答? CLIとかSDKがうまいこと使ってくれます
24 もうちょっと詳しく • AWSの各サービスにはリソースにアクセスするためのAPIと、リクエ ストを送るエンドポイントが用意されている • CLIやSDKでも、内部ではエンドポイントへのHTTPリクエストが行わ れている • 下の画像はIAMのユーザー一覧を取得するリクエスト
引用元: https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4_signing.html
引用元: https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4_signing.html 25 もうちょっと詳しく ここ重要 • AWSの各サービスにはリソースにアクセスするためのAPIと、リクエ ストを送るエンドポイントが用意されている • CLIやSDKでも、内部ではエンドポイントへのHTTPリクエストが行わ
れている • 下の画像はIAMのユーザー一覧を取得するリクエスト
26 Authorizationヘッダの全体 はみ出てる部分を項目ごとに改行すると大きく4つに分かれる AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b59 24a6f2b5d7 • アクセスキーID:Credentialの項目に含まれる(AKI〜)
• シークレットアクセスキー:Signatureのハッシュ値計算に使用される
27 回答その2 Credentialが取れるのはわかったけど これどうするの? Credentialを使用して、(CLIとかSDKが) APIへのリクエストにAuthorizationヘッダを付与している
28 余談: Authorizationヘッダの各項目 • AWS4-HMAC-SHA256 • 署名に使用したアルゴリズム • 2017/11/04時点で推奨される署名バージョン4では HMAC-SHA256
• Credential (AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request) • アクセスキーID • タイムスタンプ (yyyymmdd) • 対象リージョン • 対象サービス名 • 固定文字列 (aws4_request) • SignedHeaders (content-type;host;x-amz-date) • 署名されたHTTPリクエストのヘッダ一覧(Authorizationヘッダは除く) • 「署名された」というのは後述のSignature内に含まれるという意味
29 余談: Authorizationヘッダの各項目 • Signature (5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7) • シークレットアクセスキー • タイムスタンプ
• 固定文字列 (AWS-HMAC-SHA256) • CredentialString (AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request) • HTTPリクエストの中身 (CanonicalStringと呼ぶらしい) • メソッド • URI • クエリ文字列 • 元のHTTPリクエストに含まれる全ヘッダ名 (content-type;host;x-amz-date) • BodyのSHA256ハッシュ値 • 以上の文字列をHMAC-SHA256で複数回計算してハッシュ値にしている • 詳細な実装を追いたい場合は、SDKなどを参考にしてください • GolangのSDKだとこの辺に書いてます • https://github.com/aws/aws-sdk-go/blob/master/aws/signer/v4/v4.go
30 さいごに IAMロールはどこから来て、どこへ行くのか AssumeRoleによるCredential取得から来て、 AuthorizationヘッダとしてAPIエンドポイントに行く
Thank you!