AWS CLI を通じてAWS リソースへのアクセスを認証する方法(MFA使用)

# 1.初めに
近年セキュリティを強化するために多要素認証（MFA）を活用する機会が非常に増えており、GoogleのAuthenticatorアプリを手放せない日々を過ごしている方が多いかと思います。
セキュアになるのは大変有難いことですが、認証プロセスに追加の手続きが必要となり多少厄介なこともありますよね。

私の場合は業務で時折AWSのS3バケットからデータをダウンロードする機会があるため、今回はMFA設定時にAWS CLIを使ってAWS S3のバケットへ保存されているリソースへアクセスする方法の一つについて、自分の備忘のためも兼ねてまとめておこうと思います。

# 2.全体の流れ
以下の流れで、get-session-token コマンドを利用して一時的な認証情報を発行することでアクセスを可能にします。

1. AWS CLIのダウンロード、インストール
2. 認証ファイル(credentials)の設定 - アクセスキー及びシークレットアクセスキーの設定
3. 認証ファイル(credentials)の設定 - MFAの設定

### 前提事項
以下の内容は、IAMユーザーの作成やアクセス許可設定が適切に行われていることを前提とします。

# 3.本編
## 3.1 AWS CLIのダウンロード、インストール
コマンドラインで下記のコマンドを実行し、aws-cliのバージョンを確認します。
以下の実行でバージョン情報が返ってこない場合はAWS CLIがインストールされていないため、環境に合わせてインストールを行いましょう。
```
aws --version
```

## 3.2 認証ファイル(credentials)の設定 - アクセスキー及びシークレットアクセスキーの設定
一時的な認証情報を発行するために、アクセスキーとシークレットアクセスキーの設定が必要となります。
ユーザのホームディレクトリに以下のファイルがあるか確認してください。
```
ls ~/.aws/credentials
```

存在しない場合は用意してあげる必要があります。
以下のコマンドで対話的に設定が可能です。

```
aws configure
```

この際に以下の項目の入力が必要となります。
 - Access Key (情報の取得が必要)
 - Secret Access Key(情報の取得が必要)
 - Default region Name (東京ならap-northeast-1を入力。空エンターでもOK。)
 - Default output format (空エンターでもOK。デフォルトはjson。json,yaml,yaml-stream,text,tableの中から選択できる。)

Access KeyおよびSecret Access Keyについては、AWSマネジメントコンソールの「セキュリティ認証情報」から確認できます。
ない場合は以下の方法で事前に資格情報を取得しておきましょう。
> <アクセスキーの発行手順>
※2023年10月現在のUIをもとに記載。
1 AWSコンソールにログインし、右上のアカウントから 「セキュリティ認証情報」を選択
2「アクセスキーの作成」をクリック
3 ユースケースを選択(今回はコマンドラインインターフェイス(CLI)を選択)し、「次へ」をクリック
4「アクセスキーを作成」をクリック

間違えて入力した場合は、もう一度"aws configure"を実行して再設定できます。
なお、利用していないアクセスキーを長期的に放置するのはセキュリティ的によろしくはないので、不要になった時点で削除するように心がけます。(自分へのメッセージ)

※以下のように、プロファイルを指定して認証情報を設定することも可能
```
aws configure --profile mfa
```

## 3.3 認証ファイル(credentials)の設定 - MFAの設定
最後に、mfa用アクセスキーを `aws sts get-session-token`  コマンドで取得します。
一時的に使える一時的なアクセスキーとなるので、利用の都度発行が必要になります。(--duration-seconds を指定することで、有効期限が指定可能。参考: https://repost.aws/ja/knowledge-center/authenticate-mfa-cli )
```
aws sts get-session-token --serial-number (MFA DeviceのARN) --token-code (二段階認証番号 6桁) 
```
上記コマンドを実行するために、MFA Device の ARN が必要になります。
マネジメントコンソールにログイン→IAM→多要素認証 (MFA)→識別子から確認できます。
以下のような値です。
(例)MFA Device のARN
arn:aws:iam::(アカウントID):mfa/....

※以下の識別子の値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582122/c288cfc2-aaab-5584-3f3d-0608784c9449.png)


`aws sts get-session-token`  コマンドを実行すると以下のような返戻が得られます。

```
{
    "Credentials": {
        "AccessKeyId": "(アクセスキーID)",
        "SecretAccessKey": "(シークレットアクセスキー)",
        "SessionToken": "(セッショントークン)",
        "Expiration": "2023-10-23T03:29:26+00:00"
    }
}
```
今回は上記の情報を元に、以下のファイル(credentials)にmfa用の設定を作成します。
```
vi ~/.aws/credentials
```

mfa用プロフィールを以下のように作成。
下記設定により、`--profile mfa` を指定することで `aws s3 ls` コマンドなどの実行が出来るようになります。
```
[default]
aws_access_key_id = (設定済みの認証情報)
aws_secret_access_key = (設定済みの認証情報)

[mfa]
aws_access_key_id = (アクセスキーID)
aws_secret_access_key = (シークレットアクセスキー)
aws_session_token = (セッショントークン)
```

動作確認用コマンド
```
aws s3 ls s3://対象バケット/ --profile mfa
```

## 4. まとめ

IAMを作成しアクセスキーの発行を行うなどの事前準備が完了した後に、`aws sts get-session-token` でMFA用の認証情報を取得する部分が肝心ですね。。
毎日利用される方はmfa用の認証情報の書き換えが頻繁に必要となり、やや面倒かもしれません。その場合は、認証情報を取得してcredentialsファイルの内容を更新するようなバッチをcronで定期的に動かすなどの工夫も出来るかもしれません。(自分は利用する機会も限られるため、毎回手動で書き換えます。。)

記事内容でおかしな点があったら優しく教えていただけると幸いです！
最後までお読みいただきありがとうございました。