91933
ローカル環境でaws cli使用してmfa認証後にコマンドを実行できるようにしたいです。

以下は私が試した設定です。

cat ~/.aws/credentials

```

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
    [mfa]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
```

~/.aws/config

```

    [profile default]
    region = ap-northeast-1
    output = json
    
    
    スイッチロールして管理者用アカウントで作業するのに使用
    [profile mfa]
    role_arn = arn:aws:iam::スイッチ先のID:role/SwitchRole
    source_profile = default
    mfa_serial = arn:aws:iam::スイッチ元のID:mfa/mfa
    
```

試しにコマンドを実行します．MFAコードを入れててもエラーが出ます．

$ aws s3 ls --profile mfa

しかし、対策をしても下のようなエラーが出てしまいます。  
エラー内容はMFAコードが間違えてるようですが間違いなくあっています。

```

    An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
    
```

原因特定⇒解決に向けて動くためのアプローチありましたらご教授お願い致します。
CC BY-SA 4.0
2022-11-01T06:35:57.180
91922
2022-11-03T21:19:48.007
36855
question
aws aws-cli
aws cliによる mfa認証を設定したのですがうまくいきません
質問はMFAですが原因は違います。スイッチロールにより２つの権限を混ぜたことにより、どちらに何を設定をする必要があるのかわからなくなっていることが原因です。

## スイッチロール元

質問文では`default`プロファイルに書かれています。こちらにMFAを設定する必要があります。

### `~/.aws/credentials`

```

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
```

### `~/.aws/config`

```

    [default]
    region = ap-northeast-1
    output = json
    mfa_serial = arn:aws:iam::スイッチ元のID:mfa/mfa
    
```

この状態でまずは `aws s3 ls` など確認してください。MFAが要求されるはずです。

## スイッチロール先

そもそもロールにはMFAは存在しません。なのでこちらはMFAは必要ありません。

### `~/.aws/credentials`

不要です。

### `~/.aws/config`

```

    [profile mfa]
    region = ap-northeast-1
    output = json
    role_arn = arn:aws:iam::スイッチ先のID:role/SwitchRole
    source_profile = default
    
```

* * *

## 以上を組み合わせて

### `~/.aws/credentials`

```

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
```

### `~/.aws/config`

```

    [default]
    region = ap-northeast-1
    output = json
    mfa_serial = arn:aws:iam::スイッチ元のID:mfa/mfa
    
    [profile mfa]
    region = ap-northeast-1
    output = json
    role_arn = arn:aws:iam::スイッチ先のID:role/SwitchRole
    source_profile = default
    
```

組み合わせた状態で `aws s3 ls --profile mfa` を確認してください。

* * *

> その設定だと二段階認証が発生しないようです。

失礼しました。改めて確認したところ
[多要素認証を使用する](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-
configure-role.html#cli-configure-role-mfa) の記述ですと質問文に記載の設定でおおよそ正しく、あとはRole側に

```

    "Condition": { "Bool": { "aws:multifactorAuthPresent": true } }
    
```

とMFAを要求する必要があるようです。ただし、リンクしたAWSドキュメントには

  1. cli-userプロファイルが存在しない（本来はanikaプロファイルを指定したかったのか？）
  2. SwitchRole先のプロファイルでSwitchRole元のMFAデバイスを指定している

など不可解な点があり、あまりレビューされていない印象です。英語版でも同様の記述なので翻訳ミスではないです。

* * *

別の方法として、[`aws sts get-session-
token`で短期アクセスキーを取得し環境変数に指定](https://aws.amazon.com/jp/premiumsupport/knowledge-
center/authenticate-mfa-
cli/)することもできます。こちらの方法ですとMFA済みのアクセスキーが生成されますので、Role側で明示的にMFAを要求する必要はなくなります。  
短期アクセスキーは１時間など有効期限が設けられているため、`~/.aws/credentials`などプロファイルに保存する意味はありません。
CC BY-SA 4.0
2022-11-01T11:39:24.613
91933
2022-11-03T21:19:48.007
2022-11-03T21:19:48.007
4236
4236
91922
answer