続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

バケットポリシーとCloudTrail Logの組み合わせ

今回書くことは、もうすでに手垢がついているので、なるべくさらっと書きます。

2022/02/01今更ですが更新 ACLやめればすべて解決!

【アップデート】S3でACLを無効化できるようになりました #reinvent | DevelopersIO

テーマはバケットポリシーとクロスアカウントアクセスです。本エントリでも少しだけ触れますが、原理はこちら

dev.classmethod.jp

新機能サイコーな話なんですが、運用視点で書きます。

f:id:iga-ninja:20210323000614p:plain

バケットポリシー発動条件

バケットポリシーを設定したら発動とかそんなしょうもない話ではない、バケツの所有者と・オブジェクトの所有者が一致しているときのみ発動します
これは頭に叩き込む、ここがブレるとわけがわからなくなる

挙動の確認

バケツの所有者がクロスアカウントアクセスによって書き換えられることはありません。よって、クロスアカウントアクセスの書き込みによってバケツの所有者は絶対に変わりません。しかしオブジェクト所有者はアップロードしたAWSアカウントののものになります。SS貼っときます。
これが 普通のオブジェクト バケツ=オブジェクト
f:id:iga-ninja:20210323000141p:plain これが 問題のオブジェクト バケツ≠オブジェクト f:id:iga-ninja:20210323000052p:plain

上記に書きましたが、バケツに対するAPI ListBucket(ListObjectではない、ここが怪しいひともググって)は通ります。aws s3 ls でオブジェクトの有無は見える。しかしGetObjectは通りません。上記のSSは一つのバケツに、普通のオブジェクトと所有者違いのオブジェクトを混ぜた。こんな状態でも普通のオブジェクトに対しては GetObjectは通る

  • バケツ所有者とオブジェクト所有者が違うとバケットポリシーは効かない
  • バケツ所有者とオブジェクト所有者が違っても、(バケットポリシーでListObjectがついてたら) aws s3 ls は通る
  • 一つのバケツに、所有者同じ/所有者異なるオブジェクトが混在することはできる、その場合、所有者同じオブジェクトに関してはバケットポリシーは有効

クロスアカウントアクセスによる書き込みは、実はすべてのAWSアカウントで発生している

今回のテーマはこれです。クロスアカウントからの書き込みって、特殊なことに思えますが、実はほぼ全てのAWSアカウントで発生しています。
どこで? 確認できているところで、CloudTrailとELBのログ(他にもあるかも)

そもそもAWSが出すログってどう出してる?

CloudTrailのS3Exportをポチポチで作るとS3側にはバケットポリシーが書かれています。

CloudTrail の Amazon S3 バケットポリシー - AWS CloudTrail

自分のアカウントと異なる、AWS自身が直接管轄しているアカウントからの書き込みが発生します。つまりこれも クロスアカウントによる書き込みです なんにも考えずにクロスアカウントで書き込んでしまうと、そのバケツのオーナーも読めなくなってしまうので bucket-owner-full-control を必須にしています。ELBもバケットポリシーからみると、同じ挙動のはず。

何が困るの?

bucket-owner-full-control がついてるので、バケツ所有者(のアカウント)であれば問題ないです。が、ここでバケットポリシーによるクロスアカウントアクセスをしようとするとだめ。バケットポリシーはバケツ所有者とオブジェクト所有者が違うとバケットポリシーは効かない という鉄の掟があるから。

どうすればいい?

これからの人

aws.amazon.com

です、設定方法は最初にポイントしたところを見てください。正直なところ、この設定をして損はしないと思うので、今後作製するS3バケット一律この、オブジェクト所有者とバケツ所有者を一致させる設定をしておいて問題ないでしょう。

もうオブジェクトいっぱいある人

機能拡張により、ACLやめるですべて解決。ACL機能が削がれているので、オブジェクトのオーナーが誰とか一切関係ないので、既存オブジェクトも問題なしでした。

Linuxやったら chown すればいいですが、S3は所有者を変更するAPIは生えてません。ググるとこんなん出てきます。

aws.amazon.com

ざっと見てみると、s3 sync で新たなバケツにコピーです。つまり、同一オブジェクトの所有者だけ変える方法は存在しない。

まとめ

バケツ所有者とオブジェクト所有者が bucket-owner-full-control アクセス可能
同じ ついてなくてもOK バケットポリシー有効
違う ついている バケットポリシー無効+バケツ所有者は見える
違う ついてない バケットポリシー無効+オブジェクトオーナーのみアクセス可能
  • ACLやめてみんなハッピー
  • 今後作製するS3バケットは一律オブジェクト所有者とバケツ所有者を一致させる設定をOnでOK
  • AWSログ系の出力はクロスアカウントアクセスが結構発生しているのでクロスアカウントでの読み込みがある場合は注意
  • 所有者だけを変えるAPIは未だ(2021/03/22)存在しない