EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効期限は短くできるのでしょうか
2021/08/20
「EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効期限を短くする」方法がわからなかったので、CLIで無理やり実験してみました。
目次
結論
EC2インスタンスプロファイルに頼るのではなく、sts:AssumeRoleをCLIやSDKで実行して有効期限を指定してあげたほうがいいですね。
IAMロール
S3:ListAllMyBucketsのみ許可したIAMロールを作ってEC2インスタンスに設定しました。
あとセッションマネージャー使いたいのでAWS管理ポリシーのAmazonSSMManagedInstanceCoreはアタッチしてます。
1 2 3 4 5 6 7 8 9 10 11 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" } ] } |
EC2メタデータから取得
1 2 |
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/S3LSforEC2 |
EC2インスタンスにセッションマネージャーで接続して、メタデータから認証情報を取得しました。
1 2 3 4 |
export AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY= export AWS_SESSION_TOKEN= |
取得した認証情報をローカルのmacOSのターミナルで環境変数に設定しました。
1 2 3 4 5 6 7 |
$ aws sts get-caller-identity { "UserId": "AROARFDUEEVTDCNWI5K3W:i-092e5563d3b1e27a9", "Account": "123456789012", "Arn": "arn:aws:sts::123456789012:assumed-role/S3LSforEC2/i-092e5563d3b1e27a9" } |
sts get-caller-identityコマンドで確認してみるとIAMロールにたいしてEC2インスタンスプロファイルが取得したセッションの認証になっていることがわかりました。
1 2 |
$ aws s3 ls |
s3 lsコマンドで該当のバケット一覧を確認しました。
EC2からIAMロールをデタッチしてみる
CloudShellから以下 CLIでAssociationIdを確認しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ aws ec2 describe-iam-instance-profile-associations { "IamInstanceProfileAssociations": [ { "AssociationId": "iip-assoc-0daa74c36a84893ac", "InstanceId": "i-092e5563d3b1e27a9", "IamInstanceProfile": { "Arn": "arn:aws:iam::123456789012:instance-profile/S3LSforEC2", "Id": "AIPARFDUEEVTKCUPD6M4M" }, "State": "associated" } ] } |
そのままCloudShellからIAMロールのEC2との関連付けをデタッチしてみました。
1 2 3 |
$ aws ec2 disassociate-iam-instance-profile \ --association-id iip-assoc-0daa74c36a84893ac |
EC2との関連付けをデタッチしたあとに認証はまだ有効なのか?
有効です。
そのまま10分ぐらい経過しても aws s3 lsでバケット一覧は取得できました。
関連付けがなくなるだけで認証情報が無効化されたわけではないのですね。
セッション無効化しないといけないのか?
マネジメントコンソールの[アクティブなセッション無効化]を実行すると以下のインラインポリシーがアタッチされます。
[policy creation time]には無効化を実行した時間が入ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "DateLessThan": { "aws:TokenIssueTime": "[policy creation time]" } } } ] } |
無効化してからmacOSのターミナルで試してみます。
1 2 3 |
$ aws s3 ls An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied |
aws:TokenIssueTimeが指定時間よりも過去になる条件が追加されたので拒否されました。
そりゃそうですね。
まとめ
- 無効化するためには、条件つきのインラインポリシーを追加する。
- “aws:TokenIssueTime”がインラインポリシーよりも後の認証情報を作成するために、IAMプロファイルインスタンスをdisassociateして、associateする。
って、こんなことするのであれば、sts:AssumeRoleで有効期限を指定するのが普通のやりかたですね。
EC2インスタンスプロファイルのローテーション期間を指定できるのなら嬉しいですが。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
API Gatewayで顧客レベルの使用量プランを設定する
API GatewayのAPIキーを使って使用量プランでのスロットリングも設定し …
-
AWSアカウントでルートユーザーが使用されたときにTeamsへ投稿する
Organizations組織内のアカウントのいずれかでルートユーザーが使用され …
-
Amazon Cognito User Poolsのデモをしてみました
AWS Summit 2016 Tokyoのアップデートおっかけ会をJAWS-U …
-
ALBにWAFを関連付けて特定のヘッダー以外はブロックする
おかげさまで、ブログのアクセスも増えてきて、t3.nano EC2インスタンス単 …
-
AWSセルフマネージドAD環境にEC2 Windowsサーバーをドメイン参加する
AWSクイックスタートのActive Directory Domain Serv …
-
JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを作る側からの物申す〜に参加、運営、登壇しました
先日、JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを …
-
AWS Snowファミリーのジョブ作成画面を確認
使わないのですが、画面を見ておきたかったので確認しました。 Snowファミリージ …
-
AWS BatchでPandocコンテナイメージを実行する
「ECR(Amazon Elastic Container Registry)に …
-
Mountpoint for Amazon S3を試しました
このブログでは、画像などの配信にS3を使用しています。 WordPressのプラ …
-
ヤマムギvol.23 Amazon RDS for MySQLとAmazon Aurora Serverlessの起動のデモをしました
ゴールデンウィーク毎朝デモ勉強会は終わったのですが、土曜日にやれるときがあれば、 …