Ubuntu(WSL)にaws-mfaインストール/使用方法
概要
- 今回は、Ubuntu(WSL)にaws-mfaをインストールする方法と、手軽にaws-mfaでaws cli のMFA認証を行う方法をご紹介します。多くの企業では、AWS のIAMユーザーにMFA(多要素認証:Multi-Factor Authentication)を導入することが必須になっています。しかし、aws cli でMFA を認証する操作は煩わしいものです。今回ご紹介する aws-mfa は、MFA導入環境のクレデンシャル管理を容易にするツールとなります。
- aws-mfaなどのツールを利用せず、MFA利用時に、公式の方法で aws cli の認証する方法は、下記の記事を参照ください。こちらの記事では、公式の方法だけでなく、ワンライナー(コマンド1行)で aws cli の認証する方法も記載しております。
- aws-mfaは、複数アカウントをスイッチロールでアクセスする環境においても有効です。profileを利用して、アカウント/ロールを切り替えます。
aws-mfa とは
- aws-mfaは、下記github で公開されているツールとなります。
- MFA導入環境では、AWS STS(AWS Security Token Service)から一時的セキュリティ認証情報を取得しますが、aws-mfa はクレデンシャルファイル(~/.aws/credentials)へ一時的セキュリティ認証情報を更新する処理を自動化します。
- aws-mfa の概念は、下記2つのクレデンシャルで構成されます。
- long-term → 通常のアクセスキーです。(一般的に、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY の環境変数で定義するパラメータになります)
- short-term → long-term のクレデンシャルとトークンコード(6桁のMFAコード)の組み合わせから発行された一時的セキュリティ認証情報です。
aws-mfa のインストール
- gitコマンド、pip(pip3)コマンドが利用できる前提です。Ubuntu(WSL)にpip3コマンドのインストールはこちらの記事を参考にしてください。
- 以下の通り、pip(pip3)コマンドを使用し、aws-mfa をインストールします。
niikawa@niikawa1:~$ pip3 install aws-mfa
Collecting aws-mfa
Downloading https://files.pythonhosted.org/packages/14/87/5c0c3368ad0412870a90a03fa8ee8f1f9c500d71dff121636fb90561b53e/aws_mfa-0.0.12-py2.py3-none-any.whl
Collecting boto3 (from aws-mfa)
Downloading https://files.pythonhosted.org/packages/0b/3e/1649fa2b98a71635f721b00fd45477f7e2ecb4d5416d768abfa992ba771c/boto3-1.17.29-py2.py3-none-any.whl (131kB)
100% |????????????????????????????????| 133kB 3.0MB/s
Collecting s3transfer<0.4.0,>=0.3.0 (from boto3->aws-mfa)
Downloading https://files.pythonhosted.org/packages/ea/43/4b4a1b26eb03a429a4c37ca7fdf369d938bd60018fc194e94b8379b0c77c/s3transfer-0.3.4-py2.py3-none-any.whl (69kB)
100% |????????????????????????????????| 71kB 3.2MB/s
Collecting jmespath<1.0.0,>=0.7.1 (from boto3->aws-mfa)
Using cached https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl
Collecting botocore<1.21.0,>=1.20.29 (from boto3->aws-mfa)
Using cached https://files.pythonhosted.org/packages/ec/d0/b14d6bff655a0d24a2035480ac31d806844ae549c0db114acc450e4db8b8/botocore-1.20.29-py2.py3-none-any.whl
Collecting urllib3<1.27,>=1.25.4 (from botocore<1.21.0,>=1.20.29->boto3->aws-mfa)
Using cached https://files.pythonhosted.org/packages/09/c6/d3e3abe5b4f4f16cf0dfc9240ab7ce10c2baa0e268989a4e3ec19e90c84e/urllib3-1.26.4-py2.py3-none-any.whl
Collecting python-dateutil<3.0.0,>=2.1 (from botocore<1.21.0,>=1.20.29->boto3->aws-mfa)
Using cached https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl
Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore<1.21.0,>=1.20.29->boto3->aws-mfa)
Using cached https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
Installing collected packages: jmespath, urllib3, six, python-dateutil, botocore, s3transfer, boto3, aws-mfa
Successfully installed aws-mfa-0.0.12 boto3-1.17.29 botocore-1.20.29 jmespath-0.10.0 python-dateutil-2.8.1 s3transfer-0.3.4 six-1.15.0 urllib3-1.26.4
niikawa@niikawa1:~$ pip3 list | grep aws
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
aws-mfa (0.0.12)
awscli (1.16.54)
awslogs (0.10.0)
- シェルの初期設定ファイル(例: ~/.bash_profile)にPATHを設定します。
export PATH=$HOME/.local/bin:$PATH
- 以下の通り、aws-mfa がインストールされました。
niikawa@niikawa1:~$ which aws-mfa
/home/niikawa/.local/bin/aws-mfa
profile とクレデンシャルを設定する
- profile(test-niikawa)に対するlong-term profileおよびshort-term profileを設定します。long-termのみクレデンシャルを設定します。aws configure実行後、aws cli の設定ファイル(~/.aws/config)およびクレデンシャルファイル(~/.aws/credentials)に設定情報が格納されたことが確認できます。
niikawa@niikawa1:~$ aws configure --profile test-niikawa-long-term
AWS Access Key ID [None]: AAAAAAAAAAAAAAAAAAAA
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
niikawa@niikawa1:~$ aws configure --profile test-niikawa
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: json
niikawa@niikawa1:~$ tail ~/.aws/config
[profile test-niikawa-long-term]
region = ap-northeast-1
output = json
[profile test-niikawa]
region = ap-northeast-1
output = json
niikawa@niikawa1:~$ tail ~/.aws/credentials
[test-niikawa-long-term]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws-mfa を使ってみる
- それでは、aws-mfa を使ってaws cli のMFA認証を行います。
- “111111111111" は、AWSのアカウント番号です。
- “arn:aws:iam::111111111111:mfa/test-niikawa" は、IAMユーザーのMFA デバイスに割り当てられたリソース名です。IAM のコンソールから確認できます。
- 6桁のMFAコードを指定しています(下記の例:123123)。
- IAMユーザーのセッションは、デフォルトの43,200秒(12時間)が設定されています。
- MFA認証後、profile(test-niikawa)に対するshort-term クレデンシャルが設定されたことが確認できます。
niikawa@niikawa1:~$ aws-mfa --profile test-niikawa --device arn:aws:iam::111111111111:mfa/test-niikawa
INFO - Validating credentials for profile: test-niikawa
INFO - Short term credentials section test-niikawa is missing, obtaining new credentials.
Enter AWS MFA code for device [arn:aws:iam::111111111111:mfa/test-niikawa] (renewing for 43200 seconds):123123
INFO - Fetching Credentials - Profile: test-niikawa, Duration: 43200
INFO - Success! Your credentials will expire in 43200 seconds at: 2021-10-16 20:12:14+00:00
niikawa@niikawa1:~$ tail ~/.aws/credentials
[test-niikawa]
assumed_role = False
aws_access_key_id = BBBBBBBBBBBBBBBBBBBB
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
aws_session_token = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
aws_security_token = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
expiration = 2021-10-16 20:12:14
- aws コマンドを使ってみます。profile(test-niikawa)を指定する必要があります。
niikawa@niikawa1:~$ aws s3 ls --profile test-niikawa
2021-06-02 01:28:08 niikawa-test
痒い所に手を伸ばす
複数アカウントにスイッチロールでアクセスする環境への配慮
- aws cli の設定ファイル(~/.aws/config)を編集します。
- スイッチロール用のprofile を指定します。(例:test-switch-role1)
- role_arn には、スイッチロールで引き受けるロールARN を指定します。このロールに割り当てられたアクセス権限で許可される任意のオペレーションを実行することができます。
- source_profile には、ベースとなる profileを指定します。これは、ロールを引き受けるための IAM ユーザー認証情報を含む別のプロファイル名です。(例:test-niikawa)
[profile test-switch-role1]
role_arn = arn:aws:iam::222222222222:role/switch-role-name
source_profile = test-niikawa
region = ap-northeast-1
- スイッチロールを使用して、aws コマンドを使ってみます。profile(test-switch-role1)を指定する必要があります。
niikawa@niikawa1:~$ aws s3 ls --profile test-switch-role1
aws-mfa をterraformで使いたい時に読む
- terraform では、profileを指定することができません…。terraform を利用する際は、AWS_PROFILE の環境変数を併用しましょう。AWS_PROFILE にprofile名をセットします。これで、profileの指定が省略できます。
- aws sts get-caller-identity コマンドは、現在のクレデンシャルが使用する AWS Account ID、IAM の情報を取得するコマンドです。terraform コマンドを実行する前に、AWS Account ID が正しいかを確認します。
niikawa@niikawa1:~$ export AWS_PROFILE=test-niikawa
niikawa@niikawa1:~$ aws sts get-caller-identity
{
"UserId": "AAAAAAAAAAAAAAAAAAAAA",
"Account": "111111111111",
"Arn": "arn:aws:iam::111111111111:user/test-niikawa"
}
niikawa@niikawa1:~$ terraform init
niikawa@niikawa1:~$ terraform plan
niikawa@niikawa1:~$ terraform apply