こんにちは。 技術2課の加藤ゆです!
AWS CLIを使ってAWSアカウントを跨いだスイッチロールを行ってみました。
ようやくスイッチロールの設定内容と挙動が解ってルンルンなので勢いでブログ書きます。
やること
AWS CLIを使って、指定したアカウントのEC2インスタンス情報を見る!
スイッチロールの仕組み
複数のAWSアカウントを管理している場合、アカウントごとにIAMユーザーを作成し毎度ログイン・ログアウトして操作をするのは大変です。
そんな時に!
ログインする1つのアカウントのみにIAMユーザーを作成し、接続先のアカウントのIAMロールがログインしたアカウントを信頼することで、環境を切り替えて操作することが出来ます。
ロールを切り替えることで他のアカウントからログインが可能になるのです。
スイッチロール設定
AWS CLIを使える環境の用意
そもそもAWS CLIとは
AWSマネジメントコンソールで提供される機能と同等の機能を実装するコマンドを、コマンドプロンプトから実行できるAWSサービスです。GUIで出来る事がコマンドでも行えるようになります!便利。
AWS Command Line Interface とは - AWS Command Line Interface
こちらの記事を見ながらWindowsにAWS CLIをインストール
AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface
スイッチロールに必要なもの
credentialsファイルとconfigファイル
ファイルの書き方は以下記事を参考
設定の基本 - AWS Command Line Interface
blog.serverworks.co.jp
スイッチロールで使われる情報は大きく3つです
- 誰でログインするの?(IAMユーザのアクセスキー・シークレットアクセスキー)
- どのロール使うの?(IAMロールのARN)
- どのMFAデバイスを認証で使うの?(MFAデバイスのARN)
IAMユーザのアクセスキー ・シークレットアクセスキー
誰(どのIAMユーザー)でログインするの?という情報として、ログインする時に使います。大事
AWS アカウントとアクセスキー - の AWS ツールPowerShellIAMロールのARN
接続先で作成したIAMロールのARN情報MFAデバイス
これはIAMロールのポリシーの書き方によって必要だったり、要らなかったりします。ログイン時にMFA認証を必要とする際には、MFA認証デバイスのARN情報が必要になるので登録しておきましょう
AWS でのユーザーの MFA デバイスの有効化 - AWS Identity and Access Management
credentialsファイルはこんな感じ
[bastion] aws_access_key_id = AKIAXXXXXXXXXXXXXXXX #IAMユーザー情報(このユーザーでログインします!) aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #IAMユーザー情報(このユーザーでログインします!) region = ap-northeast-1
コマンド打つ度に、region指定してねって言われたのでregionも入れちゃいました。
configファイルはこんな感じ
[default] region = ap-northeast-1 output = json [profile kensho] region = ap-northeast-1 source_profile = bastion role_arn = arn:aws:iam::XXXXXXXXXXXXXXXXXXXXXXX #IAMロールのARN(このロール使います!) mfa_serial = arn:aws:iam::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #MFA認証デバイスのARN情報(このデバイス使います!)
接続先のアカウントでやること
- IAMロール作成
接続先でどんな権限を持たせるのかは、このIAMロールにアタッチしたポリシーで決まります。 「接続先のアカウント」に対する操作権限を持つので、必ず接続先(スイッチ先)にスイッチロールで使うIAMロールを作りましょう。 アタッチするポリシーは、操作時に必要な権限をつけます。
ここで大事なのはIAMロール作成時に、接続元のアカウントを信頼させることです。(信頼させる=信頼ポリシーの付与)
こうすることで、接続先では「このアカウントは信頼してるから、このロール使って良いよ!」的な感じになります。
アカウントを選択すると、アクセスコントロールポリシーにそのアカウントを対象に"Action": "sts:AssumeRole"の記載がされます。
信頼ポリシーのドキュメント
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXXXX:root" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
接続元のアカウントでやること
- IAMポリシー作成
接続先に作成した、IAMロールの切り替えを許可するIAMポリシーを用意
このポリシーがあることで、接続元でロールを切り替える権限を持つことが出来ます。
接続する際にはファイルに書いたIAMロールのARNを指定するので、接続側も「このIAMロール使いたいんだよ~」みたいな主張が出来ます。接続側の「使いたいなー(権限有)」と、接続先の「使って良いよー」の設定をしてあげればスイッチ出来るって事です。
※IAMポリシーが無いと、IAMロールのARNを指定しても「これ使いたいなー(権限無)」となるので注意
やってみる
- $ aws ec2 describe-instances で表示される情報を確認
Amazon EC2 インスタンスの起動、一覧表示、および終了 - AWS Command Line Interface
AWS CLIの実行時に-profileオプションをつけます。今回は[profile kensho]を指定。
aws ec2 describe-instances --profile kensho
上記[profile kensho]より、指定したMFAデバイスを利用して認証。
接続先のEC2インスタンス情報が出てきました!!!やったね
今回、ログインの際に利用するIAMユーザー情報は[bastion]を指定しました。(source_profile = bastionを指定)スイッチロールではなく、IAMユーザーを直接指定してユーザーがもつ権限で所属するアカウントを操作することも出来ます。
[bastion] aws_access_key_id = AKIAXXXXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX region = ap-northeast-1 [kensho-user] aws_access_key_id =AKIAXXXXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX region = ap-northeast-1
例えば、上記内容([kensho-user]を追記)で、$ aws ec2 describe-instances --profile kensho-userを実行すると、kensho-user(IAMユーザー)でログインし、EC2インスタンス情報を取得することが可能です。
感想
スイッチロール、3回目でようやく理解できました!これ本当に難しいですね。IAMの概念が難しい…。
そもそもOSのファイル構造がよくわかっていなかったので、credentialsファイルってどこだよーーー!から始まり、IAMロールとは??とかやってました。
参考資料
AWS Command Line Interface とは - AWS Command Line Interface
AWS アカウントでの IAM ユーザーの作成 - AWS Identity and Access Management
【AWS CLI】credentialsとconfigの使い分けは設定内容の機密度合い | JAMEEES BLOG
AWSアクセスキーIDとシークレットアクセスキーを取得する方法