自分用IAMユーザのAccess key / secret keyが何かの間違いで流出 & 悪用されたら嫌ですよね!
ということで、aws-cliを利用する時にMFAの認証を通したいときのやり方、何個か記事はあるんですが、微妙に色んな情報が混じっていてわかりずらかったので、最短のパスをここにまとめてみました。
全体の流れ
- 必要な権限を持ったassumeするためのIAM Roleを作成
- ↑で作ったRoleをassumeして使えるIAM Userを作成。
- ↑で作ったUserにMFAデバイスの紐付けを行う。
- ~/.aws/credentials, ~/.aws/config の設定
-
aws
コマンドを実行してみる!
IAM Role作成
trusted entityには"Another AWS account" を選択。ここが地味に混乱しやすいポイントですが、同一のアカウントで使う場合も、これを選択して、そのアカウントのIDを入力すればOKです。プラスで、Require MFA
にチェックを入れてroleの作成をしていきます。
Roleの権限は、aws-cli を実行するユーザに持たせたい権限(EC2操作、S3操作、Admin etc...)にしてください。
IAM User作成
Programmatic accessを有効にした、何の権限も持たないIAM Userを作成し、以下のpolicyを直接attachする(CREATED_ROLEの部分は先の工程で作ったrole名を入力)。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/CREATED_ROLE"
}
]
}
IAMユーザにMFA deviceの紐付けを行う
作成したIAMユーザの詳細画面を開き、"Security Credentials"タブ -> Assigned MFA device を選んで設定する。
~/.aws/credentials, ~/.aws/config の設定
Key pair, Role, MFAの設定は先に作成したモノに置換してください。
[test_iam_user]
aws_access_key_id=ACCESS_KEY_OF_CREATED_USER
aws_secret_access_key=SECRET_KEY_OF_CREATED_USER
region=ap-northeast-1
[profile test]
role_arn = arn:aws:iam::123456789012:role/CREATED_ROLE
source_profile = test_iam_user
mfa_serial = arn:aws:iam::123456789012:mfa/CREATED_MFA
region=ap-northeast-1
aws コマンドを実行してみる!
MFA codeの入力が求められればOK!
$ aws --profile test s3 ls
Enter MFA code:
IAM UserとしてはAssumeRole
の権限しか持っておらず、新しいセッションでこのRoleをassumeしてAPIを実行しようとする場合、MFA codeの入力が求められるので、万一、IAM Userのkey pairが流出しても悪さされません!!
参考
AWS CLI 経由で AWS リソースへのアクセスを認証するには、どのように MFA トークンを使用したらよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/
AWS CLIがAssumeRoleによる自動クレデンシャル取得とMFAに対応しました!
https://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/
(タイトルなしの英語記事)
https://dogsec.io/2017/06/03/awscli-mfa.html
初めてのAssumeRole
https://dev.classmethod.jp/etc/sugano-005-s3/
(直接は関係ないですが、AssumeRole
とは何ぞや?ってのがキレイにまとまっていました)