📲

【AWS】MFAユーザでaws cliを使用する

2023/01/31に公開

はじめに

aws cli を使おうとして時、IAM の権限設定は問題ないのになんでかアクセスが拒否される。

$ aws s3 ls --profile PROFILE_NAME

# 結果
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

そんな時は MFA の設定があるかどうかを確認してみましょう。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/

MFA の確認

MFA が設定してある場合、AWS のマネジメントコンソール画面から IAM を検索。
ユーザー認証情報 から MFAデバイスの割り当て で MFA の ARN が付与されていることが確認できます。

一時的なアクセス情報を発行する

MFA が設定されている場合は aws sts コマンドで有効期限付きの一時的なアクセス情報を発行する必要があります。

アクセス情報の発行には以下のコマンドを各オプションの説明に沿って適宜値を修正して実行します。

$ aws sts get-session-token \
--serial-number MFAに割り当てられたIAM \
--token-code MFAに割り当てられたIAM \
--profile AWSアカウントのプロフィール名

各オプションで設定する値の概要は以下です。

  • MFAに割り当てられたIAM
    • 先ほどの「MFA の確認」の項にて添付したキャプチャの MFAデバイスの割り当て 記載の ARN 情報
  • MFA認証に使用してるアプリのコード
    • 自身の MFA に使用している多要素認証用のアプリのコード。(google Authenticator など)
  • AWSアカウントのプロフィール名
    • .aws/credentials に記載されている以下の xxx の箇所
    [xxx]
    aws_access_key_id = *****
    aws_secret_access_key = *****
    
    • xxx の値が default になっている場合は省略しても大丈夫です。

実行結果として以下のレスポンスが返ってきます。

{
    "Credentials": {
        "AccessKeyId": "*****",
        "SecretAccessKey": "*****",
        "SessionToken": "*****",
        "Expiration": "2022-10-19T19:38:53+00:00"
    }
}

レスポンスの値を元に .aws/credentials の値を修正します。

.aws/credentials
[xxx]
aws_access_key_id = AccessKeyId
aws_secret_access_key = SecretAccessKey
aws_session_token = SessionToken

動作確認として適当なコマンドを実行して問題なくレスポンスが返ればオッケーです。

$ aws s3 ls --profile {xxx}

さいごに

さいごまで読んでいただきありがとうございます。

MFA アカウントで CLI を実行する場合はこんな感じでいくつかの工程が発生しますし、一時的な権限のため期限が切れれば再度同じことを行わなければ行けないので少々面倒ですね。

コンソール画面での作業用の MFA ユーザー、プログラムアクセス用の MFA なしのユーザーと分けて管理すると幾分楽ですが、何にせよ MFA なしのアカウントが 1 つはできてしまうことになるのでこの辺はどう運用していくかはプロジェクト、チーム単位での検討が必要そうですね。

間違いの指摘やリクエストなどありましたら加筆していきたので是非、ご意見をいただけたらと思います。

それではまた次の記事でお会いしましょう。

GitHubで編集を提案

Discussion