aws-mfaを利用してawscli上でらくらくMFA(多要素認証)

こんにちは

インフラチームの李です。


ここ最近、クインテットのインフラチームでは各AWSのユーザアカウントをスイッチロールに移行しました。

世の中ではほとんど対応しているようですので少しいまさら感はありますが。


まずはログイン専用のAWSアカウントにユーザを集結し、

サービスが動いているAWSアカウントからはユーザアカウントを削除し、

PowerUser権限のスイッチロールのみで操作をするようにしました。

※一律PowerUser権限で良いかというのも検討する必要があります。


その中でIAM操作のみの権限を分離し、別途ロールとして作成しました。

それぞれロールには操作権限やアクセス元のIP、MFA(多要素認証)を適切に利用してさらにセキュアにしています。


スイッチロール自体は大変使いやすいですが、1つ課題として浮かび上がってきたのが信頼関係の追加です。

ログイン専用のアカウントにはユーザを追加してユーザARNにスイッチロール権限を付与すればOKですが、

多数あるアカウント間を行き来しながら信頼関係を追加していくのは大変めんどくさいですね。

これをCliで操作しようとするとMultiFactorAuthPresentが有効になっており、MFA認証が必要になっています。

MultiFactorAuthPresentをfalseにするとこの記事の意味がなくなりますので論外。。


そこでaws-mfaという便利なツールを見つけましたので今回紹介できればと思います。

クラメソさんのサイトにも詳細がありますのでぜひ参考にしてください。


aws-mfaはアクセスキーペアとMFAデバイス名、ロールを~/.aws/credentialsに記載しておくことで自動的に認証トークンを生成し、プロフィールを追記してくれるツールです。

❍ インストール

インストールは至って簡単です。Pythonが入っていれば

# pip install aws-mfa

で完了です。


❍ ~/.aws/credentialsの中身

[default-long-term]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_mfa_device = arn:aws:iam::xxxxxxxxxxxx:mfa/lee
assume_role = arn:aws:iam::xxxxxxxxxxxx:role/iamAdmin


[developmentiam-long-term]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_mfa_device = arn:aws:iam::xxxxxxxxxxxx:mfa/lee
assume_role = arn:aws:iam::xxxxxxxxxxxx:role/iamAdmin
・・・省略

のように各アカウントのIamロール名を指定しておきます。

ここで大事なのはプロファイル名の後ろに【-long-term】をつけることです。

アクセスキーペアとMFAデバイスはログイン専用のアカウントにしかありませんので同一のもので良いです。


❍ 使い方

以下のコマンドを実行します。

# aws-mfa エンター
INFO - Validating credentials for profile: default
INFO - Short term credentials section default is missing, obtaining new credentials.
Enter AWS MFA code for device [arn:aws:iam::xxxxxxxxxxxx:mfa/lee] (renewing for 3600 seconds):XXXXXX
XXXXXXには6桁の認証コードを入力します。すると
INFO - Assuming Role - Profile: default, Role: arn:aws:iam::xxxxxxxxxxxx:role/iamAdmin, Duration: 3600
INFO - Success! Your credentials will expire in 3600 seconds at: 2018-11-26 03:48:22+00:00
と成功のメッセージが表示されます。

→この場合[default-long-term]が読まれ、以下のように[default]プロファイルが生成されます。

早速credentialsファイルを確認してみると

[default]
assumed_role = True
assumed_role_arn = arn:aws:iam::xxxxxxxxxxxx:role/iamAdmin
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_session_token = 〜〜〜〜〜〜
aws_security_token = 〜〜〜〜〜〜
expiration = 2018-11-26 03:48:22

といった形でdefaultプロファイルが生成されました。

もしほかのプロファイルを使いたい場合、(上記のdevelopmentiam-long-termプロファイル)

# aws-mfa --profile developmentiam-long-term

を入力すると

[developmentiam]
assumed_role = True
assumed_role_arn = arn:aws:iam::xxxxxxxxxxxx:role/iamAdmin
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_session_token = 〜〜〜〜〜〜
aws_security_token = 〜〜〜〜〜〜
expiration = 2018-11-26 03:48:22

が生成されます。


❍ 本題

忘れる所でした。これが出来上がればやっとロールに信頼関係がコマンドで追加できます。

ローカルにtrustpolicy.jsonファイルを作成します。

※ファイル名は管理していくのでわかりやすくしましょう。

Githubでの管理も良いと思います。

ファイルの中身は

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxxxxxxx:user/user1",
          "arn:aws:iam::xxxxxxxxxxxx:user/user2"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

で、これをコマンドラインで更新します。

aws iam update-assume-role-policy --role-name ロール名 --policy-document file://trustpolicy.json --profile developmentiam

結果は何も帰ってきません。

また以下で信頼関係が確認できます。

aws iam get-role --role-name ロール名 --query  'Role.AssumeRolePolicyDocument' --profile developmentiam


こうやってアカウントごとに~/.aws/credentialsファイルに追記しておき、

プロファイルを生成し信頼関係を追加していくことでユーザ追加の作業時間が大幅に削減できます。


だれかの役に立てれば幸いです。

よろしくお願い致します。


参考リンク一覧

https://github.com/broamski/aws-mfa

https://dev.classmethod.jp/cloud/aws/aws-mfa/

https://dev.classmethod.jp/cloud/aws/aws-cli-update-assume-role-policy/

知識・ノウハウ共有
56件

関連記事