やさしいAssume Roleの設定(EC2のアクセス許可) 8月 16, 2019 AWS , AWS-Security , EC2 , IAM_Policy関連
概要
今回は他アカウントからのEC2管理操作(起動・停止・再起動など)を許可するAssume Roleの設定方法を紹介します。
Assume Roleとは
IAM ロールを使用して、他アカウントにAWS リソースのアクセス許可を委任します。信頼するAWSアカウントと他の信頼される AWS アカウントとの信頼関係が確立されます。
信頼関係の作成後、IAM ユーザーまたはアプリケーションではSecurity Token Service (STS) のAssumeRole API オペレーションを使用できます。このオペレーションから提供される一時的なセキュリティ認証情報を使用して、他のアカウントの AWS リソースにアクセスできるようになります。
ロールの信頼関係とAssume Roleのイメージ
以下、今回のAssume Role設定の大まかな流れです。
イメージ図を参照ください。アカウント1(アカウント: ABCDEFGHIJKL)に配置されているEC2をアカウント2(アカウント: 123456789012)に配置されているEC2から操作したいと思います。
先ず、委任元となるアカウント1(アカウント: ABCDEFGHIJKL)にEC2を操作できるロールを作成し、委任先となるアカウント2(アカウント: 123456789012)との信頼関係を設定します。
次に、委任先となるアカウント2(アカウント: 123456789012)で、Assume Roleのポリシーを作成し、アカウント2のEC2にロールとして割り当てます。
動作確認のため、アカウント2(アカウント: 123456789012)より、aws cliで委任元となるアカウント1(アカウント: ABCDEFGHIJKL)のEC2が操作できることを確認します。
以下、ロールの信頼関係とAssume Roleのイメージ図です。
設定方法
IAMロールの作成(委任元のアカウント1にて)
委任元のアカウント1にて、IAMロールを作成します。通常のロール作成の方法と異なり、「別のAWSアカウント」を選択し、「アカウントID」を指定します。次に進みます。
なお、ここで指定する「アカウントID」は、AWSリソースを利用する側のアカウントID(今回は、アカウント2のアカウントIDである"123456789012″を指定)となります。
もしリソースを利用する側のアカウントIDが複数存在する場合は、IAMロールを作成後にアカウントIDの追加が可能です。
次の画面で、ロールに割り当てるポリシーを選択します。今回の記事では、「AmazonEC2FullAccess」とします。ポリシーは用途やセキュリティの方針によって異なりますので、システムに合わせて選択下さい。なお、特定のインスタンスに限定したポリシーを作成する場合は、下記の記事が参考になります。
最後に「ロール名」を入力して、「ロールの作成」を押下します。また、「信頼されたエンティティ」に設定されている「アカウントID」が正しいことを再確認します。
以下の通り、ロールが作成されました。「アクセス権限」、「信頼関係」のタブにて、設定値が正しいことを再確認します。
次のAssume Roleの設定で必要となるため、一行目に表示されている「ロールARN」をコピーしておきます。
Assume Roleの設定(委任先のアカウント2にて)
委任先のアカウント2にて、Assume Roleの設定をします。
先ず、IAMからポリシーの作成を行います。JSONタブをクリックし、後述するサンプルのように"Action"に"sts:AssumeRole"、“Resource"に前述の作業でコピーした委任元の「ロールARN」を貼り付けます。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/account1-role-ec2"
}
}
次に委任先のアカウント2にて、EC2のロールを作成します。既にロールが作成されている場合は、ロールにポリシーを追加します。
aws cliによる動作確認(委任先のアカウント2にて)
ロールの信頼関係とAssume Roleが正しく機能するかを確認しましょう。
委任先のアカウント2にて、aws cli のホームディレクトリ/.aws 配下のcredentialsファイルに引き受けるロール(委任元のアカウント1で準備したロールARN)を指定します。
$ cat credentials
** snip **
[assume-role-ec2]
role_arn = arn:aws:iam::123456789012:role/account1-role-ec2
credential_source=Ec2InstanceMetadata
委任先のアカウント2にて、下記aws cli を実行します。委任元のアカウント1に配置されたEC2にアクセスできることが分かります。
aws cli のprofileには、credentialsファイルに記載したプロファイルの名前を指定することを忘れずに。
$ aws ec2 describe-instance-status --region ap-northeast-1 --profile assume-role-ec2