AWS CLI コマンドの利用時に MFA(多要素認証)を設定する手順を説明します。
MFA を設定しておくことで、より安全に AWS リソースへアクセスすることができます。
参考: IAM ユーザーを利用した AWS CLI の実行
MFA の設定
AWS CLI は IAM ユーザーの認証機構を利用して AWS へアクセスします。
IAM ユーザーの作成やアクセスキーの設定は以下のページを参考にしてください。
IAM ページの左メニュー「ユーザー」より CLI を実行する IAM ユーザーを選択し、「セキュリティ認証情報」タブを選択します。
多要素認証(MFA)の項目にある「MFA デバイスの割り当て」をクリックします。
任意のデバイス名を入力し、デバイスの選択をします。
デバイスは3種類あります。
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
コメント