90
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS CLIからのMFA(多要素認証)を楽にするツール(aws-mfa)を使ってみた

Last updated at Posted at 2019-10-13

AWS CLIからのMFA(多要素認証)を楽にするツール(aws-mfa)を使ってみた

はじめに

こんにちは、エンジニアのogadyです。
うちの会社では、IAMユーザーのMFAをマストとしています。そうすると、AWS CLIからMFAする手順がめんどくさい。

公式の手順はこれ

自分で作ろうかとも思ったのですが、良さげなツールを見つけたので試してみました。
aws-mfa を使えば、簡単に期限付きのAWSアクセスキーを発行して、AWS CLIからリソースにアクセスできます。

こんな人向け

  • AWS CLIのMFAを毎回公式の方法でやっている
  • MFA使うべきなのはわかってるけど運用がめんどくさそうでやっていない

aws-mfaをインストールする

使うツールはこれ

1. pip でインストール

$ pip3 install aws-mfa

2. 一応インストールされてるか確認

$ aws-mfa -h
usage: aws-mfa [-h] [--device arn:aws:iam::123456788990:mfa/dudeman]
               [--duration DURATION] [--profile PROFILE]
               [--long-term-suffix LONG_TERM_SUFFIX]
               [--short-term-suffix SHORT_TERM_SUFFIX]
               [--assume-role arn:aws:iam::123456788990:role/RoleName]
               [--role-session-name ROLE_SESSION_NAME] [--force]
               [--log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}]
               [--setup]

optional arguments:
  -h, --help            show this help message and exit
  --device arn:aws:iam::123456788990:mfa/dudeman
                        The MFA Device ARN. This value can also be provided
                        via the environment variable 'MFA_DEVICE' or the
                        ~/.aws/credentials variable 'aws_mfa_device'.
  --duration DURATION   The duration, in seconds, that the temporary
                        credentials should remain valid. Minimum value: 900
                        (15 minutes). Maximum: 129600 (36 hours). Defaults to
                        43200 (12 hours), or 3600 (one hour) when using '--
                        assume-role'. This value can also be provided via the
                        environment variable 'MFA_STS_DURATION'.
  --profile PROFILE     If using profiles, specify the name here. The default
                        profile name is 'default'. The value can also be
                        provided via the environment variable 'AWS_PROFILE'.
  --long-term-suffix LONG_TERM_SUFFIX, --long-suffix LONG_TERM_SUFFIX
                        The suffix appended to the profile name toidentify the
                        long term credential section
  --short-term-suffix SHORT_TERM_SUFFIX, --short-suffix SHORT_TERM_SUFFIX
                        The suffix appended to the profile name toidentify the
                        short term credential section
  --assume-role arn:aws:iam::123456788990:role/RoleName, --assume arn:aws:iam::123456788990:role/RoleName
                        The ARN of the AWS IAM Role you would like to assume,
                        if specified. This value can also be provided via the
                        environment variable 'MFA_ASSUME_ROLE'
  --role-session-name ROLE_SESSION_NAME
                        Friendly session name required when using --assume-
                        role
  --force               Refresh credentials even if currently valid.
  --log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}
                        Set log level
  --setup               Setup a new log term credentials section

基本的な使い方

1. IAMの設定を行う

2. aws cliの設定を行う

発行したアクセスキーでaws cliの設定を行います。
aws-mfaではプロファイルの命名は <プロファイル名>-long-termの形式 にする必要があります。

$ aws configure --profile sample-long-term
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

デフォルトのリージョンを指定する場合は、上記に加え-long-termを付けないプロファイルを作成します。
この時、アクセスキー、シークレットアクセスキーは不要です。

$ aws configure --profile sample
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: json

3. aws-mfaを実行する

実行する時は -long-termを付けないプロファイル を指定します。
また、--deviceオプションを付けて、MFAデバイスのARNを設定します。

$ aws-mfa --profile sample --device arn:aws:iam::123456788990:mfa/IAMユーザー名 
INFO - Validating credentials for profile: sample
INFO - Short term credentials section sample is missing, obtaining new credentials.
# ↓MFAコードを入力
Enter AWS MFA code for device [arn:aws:iam::123456788990:mfa/IAMユーザー名] (renewing for 43200 seconds): MFAコード
INFO - Fetching Credentials - Profile: sample, Duration: 43200
INFO - Success! Your credentials will expire in 43200 seconds at: 2019-10-13 18:40:17+00:00

aws-mfaは、-long-termがついたプロファイルを使ってMFAを行います、期限つきアクセスキーとトークンで -long-termがついてないプロファイルを作成してくれます。(すでにある場合は、更新+追記)

~/.aws/credentialsをみてみる
$ cat ~/.aws/credentials
[sample-long-term]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXX

# ここから下は自動生成される。
[sample]
assumed_role = False
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXX
aws_session_token = XXXXXXXXXXXXXXXXXXXXXXXX
expiration = 2019-10-13 20:52:51

これで、今回はsampleプロファイルを使って、AWS CLIからリソースにアクセスすることができます。
アクセスキーの有効期限はデフォルト12時間ですが、--duration オプションで15分〜36時間の範囲で指定できます。(秒指定:900〜129600)

試しにコマンド打ってみる
$ aws ec2 describe-instances --profile sample --region ap-northeast-1
{
  "Reservations": [
    {
      "Instances": [
        {
          "Monitoring": {
            "State": "disabled"
          },
          "PublicDnsName":""
...
...

いちいち --device オプションを指定したくない

毎回MFAデバイスのARNを指定するのは面倒なので、credentialsファイルに追記します。

~/.aws/credentialsに追記
$vim ~/.aws/credentials
[sample-long-term]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXX
aws_mfa_device = arn:aws:iam::123456788990:mfa/IAMユーザー名 # ←追記

こうすると、実行時にMFAデバイスのARNを指定しなくてもよくなります。

MFAデバイスのARNの指定なしでOK
$ aws-mfa --profile sample

後書き

コマンド一発でできるので便利。
IAMユーザーの運用については自分の中でベストプラクティスがまだ不明確なのですが、これを使えば 「AWS CLIを使う時めんどくさい」というMFAのハードルを下げられるので、どんどん使っていきたいです。

参考にしたもの

90
68
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
90
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?