AWS CLI コマンドの MFA 多要素認証(2段階認証)

AWSクラウド

AWS CLI コマンドの利用時に MFA(多要素認証)を設定する手順を説明します。
MFA を設定しておくことで、より安全に AWS リソースへアクセスすることができます。

参考: IAM ユーザーを利用した AWS CLI の実行


MFA の設定
AWS CLI は IAM ユーザーの認証機構を利用して AWS へアクセスします。
IAM ユーザーの作成やアクセスキーの設定は以下のページを参考にしてください。

参考: IAM ユーザーの作成と AWS CLI の実行

IAM ページの左メニュー「ユーザー」より CLI を実行する IAM ユーザーを選択し、「セキュリティ認証情報」タブを選択します。
多要素認証(MFA)の項目にある「MFA デバイスの割り当て」をクリックします。

セキュリティ認証情報

任意のデバイス名を入力し、デバイスの選択をします。
デバイスは3種類あります。

MFA デバイスを選択

Authenticator app
認証用スマートフォンアプリを利用します。
このアプリが出力するワンタイムパスワードを入力することで認証します。
アプリには Google Authenticator や Duo Mobile などがあります。

Security Key
USB メモリー等にセキュリティキーを登録します。
登録された USB メモリーを挿すことで認証します。

Hardware TOTP token
物理的なデバイスを TOTP【Time based One Time Password】デバイスとして割り当てます。
このデバイスが出力するワンタイムパスワードを入力することで認証します。

今回は Authenticator app を選択した場合を解説します。

QR コードを表示」をクリックし、表示された QR コードをアプリから読み取ります。
アプリから出力された MFA コード(ワンタイムパスワード)を2つ入力し、「MFA を追加」をクリックすると設定が完了です。

デバイスの設定


コマンド実行時の認証情報の設定
まず、認証用アプリよりワンタイムパスワードを取得します。
次に取得したパスワードを使って以下のコマンドを実行し、セショントークンを取得します。

# aws sts get-session-token --serial-number {MFA識別子} --token-code {パスワード}
>aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/test --token-code 123456

{
    "Credentials": {
        "AccessKeyId": "XXXXXXXXXXXXXXXXXXXX",
        "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "SessionToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "Expiration": "2023-08-31T11:29:42+00:00"
    }
}

出力された内容をcredentialsに反映します。

# ~/.aws/credentials # Linux, MacOS
# %UserProfile%/.aws/credentials # Windows

>vi credentials
[default]
aws_access_key_id = {AccessKeyIdの値}
aws_secret_access_key = {SecretAccessKeyの値}
aws_session_token = {SessionTokenの値}

これで設定は完了です。

MFA を利用することにより、IAM ユーザーの持つ本来のアクセスキーやシークレットアクセスキーの情報をコンピュータ上からなくすことができました。
(IAM ユーザー自身のクレデンシャル情報の消去をお忘れなく)

ちなみにこの認証情報の有効期限は半日ですので、有効期限が過ぎたら再度同じ手順を行ってください。

An error occurred (ExpiredToken) when calling the GetSessionToken operation: The security token included in the request is expired


認証情報の切り替えに便利な direnv
複数のプロジェクトを抱えていると、プロジェクトごとにクレデンシャル情報が異なるといった場合も往々にしてあるかと思います。
通常このような場合、--profileによるプロファイルの切り替えや環境変数AWS_DEFAULT_PROFILEを都度設定するといった方法が考えられます。

このようなオペレーションが面倒だと感じた方には direnv をお勧めします。
direnv は、ディレクトリごとに環境変数を自動的に切り替えてくれるツールです。
プロジェクトごとに作業用フォルダを分けておけば、勝手にクレデンシャル情報(のプロファイル)が切り替わるという寸法です。

direnv のインストール
以下の URL より、該当の direnv をダウンロードします。
Git 環境がある場合は、git clone + make installでも OK です。

GitHub – direnv
https://github.com/direnv/direnv/releases

Linux
direnv.linux-amd64

Windows
direnv.windows-amd64.exe

ダウンロードしたファイルをdirenv(Linux)もしくはdirenv.exe(Windows)にリネームし、PATHの通った場所に移動させます。

MacOS の場合はインストールコマンドでいけます。

>brew install direnv


direnv のフックの設定
direnv はシェル拡張ですので、シェルへのフック設定を行います。
以下は bash を使用する場合の例です。

>vi ~/.bashrc
eval"$(direnv hook bash)"

.bashrcを再読み込みします。

>source ~/.bashrc

Windows の場合は git bash を使う形がスムーズかと思います。
Git 環境がない場合は MinGW 等の UNIX 系コマンドを利用する環境をお使いください。
以下は git bash を利用する際の手順です。

git bash のホームディレクトリを確認します。

>echo ~
/c/Users/testUser

ホームディレクトリに.bashrcを作成し、再読み込みします。

>vi /c/Users/testUser/.bashrc
alias direnv="/path/to/direnv.exe"
eval"$(direnv hook bash)"

>source /c/Users/testUser/.bashrc


作業フォルダごとの設定
各作業フォルダごとに必要な環境変数を.envrcにて設定します。
ここではクレデンシャル情報のプロファイルの切り替えが目的なので、AWS_DEFAULT_PROFILEの値を設定します。

>cd /path/to
>vi .envrc
export AWS_DEFAULT_PROFILE="test1" # profile名

ちなみにクレデンシャル情報そのものを直接切り替えたい場合は以下のようになります。
MFA を利用している場合だと、毎回クレデンシャル情報が変わってしまうので、都度.envrcを編集する形になりますが、credentialsを直接いじるよりこちらの方が良いでしょう。

export AWS_ACCESS_KEY_ID="XXXXXXXXXXXX" # アクセスキー
export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX" # シークレットアクセスキー
export AWS_SESSION_TOKEN="XXXXXXXXXXXX" # MFA(多要素認証)を利用する場合のセショントークン

当該シェルから.envrcを編集した場合はエラーが表示されるかと思います。
これは.envrcを置いたフォルダごとにdirenv allowが必要だからです。

direnv: error /path/to/.envrc is blocked. Run `direnv allow` to approve its content

.envrcを置いたフォルダごとに必ずdirenv allowを行います。
また、.envrcを編集した場合も同様にdirenv allowが必要です。

>direnv allow
direnv: loading /path/to/.envrc
direnv: export +AWS_DEFAULT_PROFILE

環境変数が切り替わるか確認します。

>cd /path/to
direnv: loading /path/to/.envrc
direnv: export +AWS_DEFAULT_PROFILE

>echo $AWS_DEFAULT_PROFILE
test1

>cd /path2/to
direnv: loading /path2/to/.envrc
direnv: export +AWS_DEFAULT_PROFILE

>echo $AWS_DEFAULT_PROFILE
test2

direnv v2.32.2 の Windows 版は障害があるようでうまく動きません。
v2.32.1 の方を利用してください。

コメント