概要

  • 今回は、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 の認証する方法も記載しております。
概要今回は、MFA(多要素認証:Multi-Factor Authentication)を使用する環境において、aws cli を利用するための認証方法をご説明します。AWSアカウントあるいはIAMユーザーのセキュリティを向上させるには、MFAを設定します。IAMユーザーに仮想MFA を有効にする方...
  • aws-mfaは、複数アカウントをスイッチロールでアクセスする環境においても有効です。profileを利用して、アカウント/ロールを切り替えます。

aws-mfa とは

  • aws-mfaは、下記github で公開されているツールとなります。
Manage AWS MFA Security Credentials. Contribute to broamski/aws-mfa development by creating an account on 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

参考資料

Manage AWS MFA Security Credentials. Contribute to broamski/aws-mfa development by creating an account on GitHub.
AWSアカウントのMFA設定AWSを始める前に AWSアカウントを作成したら、AWSでサーバーを作る前にやるべきことがあります。それはAWSアカウントの認証を強化することです。 最近は、パスワードリスト攻撃が増えており、ユーザー名とパスワードだけではセキュリテ...
概要今回は、MFA(多要素認証:Multi-Factor Authentication)を使用する環境において、aws cli を利用するための認証方法をご説明します。AWSアカウントあるいはIAMユーザーのセキュリティを向上させるには、MFAを設定します。IAMユーザーに仮想MFA を有効にする方...
Ubuntuでpip/pip3 をインストールするUbuntuにデフォルトでPython 3.6.x(python3コマンド)がインストールされていましたが、pip3コマンドがインストールされていませんでした。今回は、Ubuntuにpip3をインストールする手順をまとめます。"get-pip.py"を...
概要 今回は、ブラウザの拡張機能である「AWS Extend Switch Roles」を導入して、AWSコンソールでロールの切り替えを効率よく行う方法を紹介します。 先ず前提として、複数アカウントをスイッチロールでアクセスする環境が対象となります。AWSコンソールに IAMユーザ...

元記事はこちら

https://oji-cloud.net/2021/10/16/post-6607/


アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアコンサルティングパートナーであるアイレットに、ぜひお任せください。

AWS 運用・保守サービスページ:
https://cloudpack.jp/service/aws/maintenance.html

その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://cloudpack.jp/contact/form/