Ubuntu(WSL)にaws-mfaインストール/使用方法

AWS,IAM_Policy関連,terraform,Ubuntu(WSL)

概要

  • 今回は、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

 

参考資料