【AWS】IAMロールのみでクロスアカウントアクセスを実現する

皆様、お世話になっております。鈴木と申します。
今回はIAMロールのみでクロスアカウントアクセスを実現する方法について解説していきます。

目次

  1. 前提
  2. 構成図
  3. 手順
  4. 最後に

1.前提

今回は、IAMロールを活用して別のAWSアカウントにあるEC2インスタンスの情報を取得する方法について解説します。
「IAMユーザーのアクセスキーを発行すればできるのでは?」と考える方もいるかもしれません。確かにその方法でも実現可能ですが、アクセスキーの発行は権限が強くなりすぎることや、CLI認証情報がファイルに保存され続けることで、セキュリティリスクが増大します。
そこで今回は、一時的なアクセス権限を取得し、認証情報をファイルに保存しないより安全な方法について詳しく解説していきます。

2.構成図

file

3.手順

3-1.IAMロールの設定

まずはそれぞれのロールでIAMロールを作成します。
具体的に今回の構成でいうと下記のようになります。

アカウントID 111122223333 (hoge-ec2-role)

  1. 信頼されたエンティティ
    これは「EC2インスタンスがこのIAMロールを使って、他のAWSリソースにアクセスできるようにするための設定」になります。下記のようにコンソールで選択可能。
    file
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  1. IAMポリシー
    下記は「アカウントID 444455556666 のpiyo-roleというIAMロールを引き受けることが許可するための設定」になります。
    こちらはカスタマーインラインにて作成
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::444455556666:role/piyo-role"
        }
    ]
}

上記を設定してこのロールをEC2に付与します。

アカウントID 444455556666 (piyo-role)

  1. 信頼されたエンティティ
    これは「AWSアカウントID 111122223333 のユーザーが、このロールの権限を使えるように設定」になります。
    下記のようにコンソールで設定可能。
    file
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  1. IAMポリシー
    今回は読み取り権限のみを付与したいので「ViewOnlyAccess」を付与します。
    ※AWSマネージドポリシーなので割愛

上記を作成する。またこのロールはEC2に紐づける必要はありません。

3-2.AssumeRole手順

今回OSはAmazon Linux2023での実施となります。
アカウントID 111122223333 のECにて下記を実施することでロールの切り替えができます。

#aws cliをセットアップ(アクセスキーとシークレットキーはブランクでOKで、リージョンと出力を指定)
aws configure

# 環境変数として下記を登録(セッション名は任意)
export ROLE_ARN="arn:aws:iam::444455556666:role/piyo-role"
export SESSION_NAME="hoge" 

# アカウントID 444455556666 のIAMロールより一時認証情報を取得
# 下記を実行することでアクセスキー・シークレットアクセスキー・セッショントークン情報が出力されます。
aws sts assume-role --role-arn $ROLE_ARN --role-session-name $SESSION_NAME

# 上記で出力された3つの情報を環境変数として登録
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_SESSION_TOKEN=

上記で111122223333は444455556666のIAMロールより一時的な権限を引き受けることに成功して、ViewOnlyAccessのポリシーに従い閲覧権限を取得することが可能になります。

EC2の情報を読み取りたい方は下記コマンドを実施

aws ec2 describe-instances --instance-ids <EC2のインスタンスID>

3-3.認証情報について

本来のIAMユーザーアクセスキーの発行だと、 ~/.aws/ディレクトリにconfigとcredentialというファイルが生成され、そこに認証情報(アクセスキー、シークレットアクセスキー、リージョン、出力)が格納されます。
しかしこの方法は環境変数としての一時的な登録かつ、一時的なトークンの払い出しとそのためのキーの出力となるため上記よりもセキュリティが強化されます。

4.最後に

この手法を実現するためにいろいろ試行しましたが、おそらく5時間以上かかったかもしれません,,,
ちなみに補足ですが、今回の場合だとVPCピアリング接続やEC2をパブリックにする必要もありません。

今後の自分のメモ要素として、そしてどなたかの参考になれば幸いです。

Last modified: 2024-09-08

Author