スイッチロールなしで別アカウントの S3 バケットにマネジメントコンソールからアクセスしてみた

え!! スイッチロールなしでクロスアカウントなマネジメントコンソールアクセスを!?

コンバンハ、千葉(幸)です。

IAM ユーザーやロールなどのプリンシパルから別の AWS アカウントにある S3 バケットにアクセスしたい場合、大まかには以下のいずれかの手法をとることになります。(名称はわたしが勝手につけたものです。)

  • ①クロスアカウントアクセスパターン
  • ②スイッチロールパターン

前者は主に AWS CLI やプログラムによるアクセスが想定されたものであるため、マネジメントコンソールからのアクセスを行う場合には後者の②を採用するのがセオリーでしょう。

しかし、やろうと思えば(スイッチロールを挟まなくても)マネジメントコンソールからのクロスアカウントアクセスは可能ですので、今回はその方法をご紹介します。

3行まとめ

  • URL を直接指定することで別アカウントの S3 バケット(のコンソール)にもアクセス可能
    • https://s3.console.aws.amazon.com/s3/buckets/バケット名
  • IAM ポリシー、S3バケットポリシーの両方で S3 アクセスの許可が必要
  • 今後も恒久的に使用できるかは不明

今回やること

以下の構成で、クロスアカウントでマネジメントコンソールからのアクセスを行います。

  • アクセス元
    • IAM ユーザーarn:aws:iam::000000000000:user/Batchi
      • AdministratorAccess をアタッチ
  • アクセス先
    • S3 バケットarn:aws:s3:::chibayuki-cross-account
      • バケットポリシーを設定

1. S3 バケットの作成

アクセス先の AWS アカウントで S3 バケットを作成します。バケット名を指定する以外はデフォルトの設定のままです。

  • バケット名:chibayuki-cross-account
  • ブロックパブリックアクセス:オン
  • バージョニング:無効
  • デフォルト暗号化:無効

この時点ではバケットポリシーは未設定(空)です。

確認のためsample.txtをアップロードします。また、この画面から URL を確認可能です。

s3-cross-account

選択するタブにより変わりますが、以下の URL となります。

https://s3.console.aws.amazon.com/s3/buckets/chibayuki-cross-account?region=ap-northeast-1&tab=objects

2. クロスアカウントアクセス(失敗)

この時点でアクセス元からマネジメントコンソールを開き、先ほど確認した URL にアクセスします。

S3 バケットポリシーで許可が与えられていないため、エラーが表示されます。

s3cross-account

オブジェクトを一覧表示するアクセス許可が不十分です

お客様または AWS 管理者が s3:ListBucket アクションを許可するようにアクセス許可を更新してから、このページを更新します。

3. S3 バケットポリシーの設定

アクセス先の S3 バケットで以下のバケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::000000000000:user/Batchi"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::chibayuki-cross-account/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::000000000000:user/Batchi"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::chibayuki-cross-account"
        }
    ]
}

アクセス元の IAM ユーザーarn:aws:iam::000000000000:user/Batchiから以下を許可しています。

  • GetObject
  • ListBucket

4. クロスアカウントアクセス(成功)

再度アクセス元のアカウントからアクセスを試みると、正常にバケット内のオブジェクトが参照できるようになりました。ダウンロードも可能です。

crossaccount-s3

一方で、その他の操作、例えばファイルのアップロードやバケット設定・アクセス許可の参照はすべて拒否されます。(以下はファイルのアップロードが失敗した例)

CrossAccountS3

アクセス元アカウントで使用しているのは AdministratorAccess を持つ IAM ユーザーですが、あくまで対向の S3 バケットポリシーで許可されているアクションのみが可能、ということです。

おまけ:オブジェクト直指定

S3 コンソールからオブジェクトの詳細画面に遷移することで、同じように直指定の URL を確認できます。

https://s3.console.aws.amazon.com/s3/object/chibayuki-cross-account?region=ap-northeast-1&prefix=sample.txt

S3CrossAccont

上記の URL を直接指定してクロスアカウントアクセスさせるのであればListBucketの許可も不要になるのでは?と思いました。

ダメでした

アクセス先の S3 バケットポリシーを以下に修正しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::000000000000:user/Batchi"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::chibayuki-cross-account/*"
        }
    ]
}

アクセス元アカウントからオブジェクト詳細画面の URL を直接指定してみますが、エラーが発生しました。

S3CrossAccount

オブジェクトの詳細を取得するアクセス許可がありません

お客様または AWS 管理者が s3:ListBucket アクションを許可するようにアクセス許可を更新してから、このページを更新します。

ListBucketはオブジェクト一覧の表示だけでなくオブジェクトの詳細を確認するためにも必要ということですね。

終わりに

スイッチロールを伴わないクロスアカウントアクセスを試してみました。多少イレギュラーな感じがしますね。

公式なドキュメントでこの方式について触れているものを見つけられなかったため、「いまの S3 のコンソールの仕様ではたまたまできている」という状態と捉えています。

ちょっとした確認のために使用するのはいいと考えますが、定常的にマネジメントコンソールでのクロスアカウントアクセスを行う際にはスイッチロールを挟むことをおすすめします。

以上、 チバユキ (@batchicchi) がお送りしました。

関連