S3 オブジェクトロックをガバナンスモードで利用するときの権限について調べてみた
S3 オブジェクトロック使っていますか?(ナニソレ? という方は、以下の記事をどうぞ)
今回、S3 に保存しているログの改ざん防止という要件で S3 オブジェクトロックを使う機会がありました。S3 オブジェクトロックには以下の2つのモードがあります。
- ガバナンスモード
- 特定の権限を持っている場合、削除が可能
- コンプライアンスモード
- もう何をやっても削除できない
今回はガバナンスモードでの運用を想定し、どの権限が与えることでロックされたオブジェクトが削除できるのかを確認してみた、という記事になります。
やってみる
まずは AmazonS3FullAccess で
まずはガバナンスモードを設定したバケットに AmazonS3FullAccess
権限を持ったロールで削除してみます。
綺麗サッパリ削除できますね。
AmazonS3FullAccess
だと削除できることは判りましたので、次にどの権限が効いてることによって削除できるのか調べてみました。
s3:BypassGovernanceRetention
公式ガイドに下記のとおり記載があります。
ガバナンスモードのリテンション設定を上書きまたは削除するには、ユーザーは s3:BypassGovernanceRetention アクセス許可を持っている必要があり、また、ガバナンスモードの上書きを必要とするリクエストで、x-amz-bypass-governance-retention:true を要求ヘッダーとして明示的に含める必要があります
では、先ほどの AmazonS3FullAccess
を与えたロールに、s3:BypassGovernanceRetention
を Deny した以下のポリシーをアタッチしました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "s3:BypassGovernanceRetention" ], "Resource": "*" } ] }
それでは、この状態で削除してみましょう。
以下のとおり Access Denied となり、削除できないことが確認できました。
バージョン非表示だと削除できたように見える問題
余談ですが、上記の画面はすべてバージョン表示モードで実施しています。仮にバージョン非表示で同じように削除操作を行ってみると、、、
「あれ!?削除できてしまった・・・」
と、思ってしまうのですが、「バージョン表示」にすると残っています。先ほどの操作は削除マーカーが作成されただけで、削除されていないということですね。
オブジェクトロックを初めて触ったとき、この仕様を知らなくて、「なぜだ、、何をやっても削除できてしまう、、、」とハマりました。
許可を与えたい場合の注意
AmazonS3FullAccess
などの強い権限に対して、ガバナンスモードでの削除・上書き操作を制限したい場合は、上記のとおり s3:BypassGovernanceRetention
権限を剥奪するだけで十分です。
逆に、最小権限で運用しているなかで、特定ユーザおよびロールにのみ、ガバナンスモードでの削除・上書きを許可したい場合は、s3:BypassGovernanceRetention
だけでは不十分な場合があります。こちらも公式ガイドに記載があります。(執筆時点では日本語マニュアルに誤記があるため、英語マニュアルからの抜粋)
Note The Amazon S3 console by default includes the
x-amz-bypass-governance-retention:true
header. If you try to delete objects protected by governance mode and haves3:BypassGovernanceRetention
ors3:GetBucketObjectLockConfiguration
permissions, the operation will succeed.
AWS CLI で操作する場合は s3:BypassGovernanceRetention
のみでガバナンスモードでの削除・上書きが可能ですが、マネジメントコンソールの場合は s3:GetBucketObjectLockConfiguration
権限も必要となります。
ためしに、AmazonS3FullAccess
+ s3:GetBucketObjectLockConfiguration
のみ Deny (s3:BypassGovernanceRetention は許可されている) した状態で同様に削除操作してみましたが、Access Denied になりました。
CLI だと削除できます
CLI で操作すると同じロールを使っても、--bypass-governance-retention
を付与すると削除できます。
$ aws s3api delete-object --bucket cm-marumo-object-lock --key 02.jpg \ > --version-id DKqWwI9FpoQnB7goqBr5wc0wbha.GeZr \ > --bypass-governance-retention VersionId: DKqWwI9FpoQnB7goqBr5wc0wbha.GeZr
まとめ
- ガバナンスモードでオブジェクトロックの削除・上書きを禁止したい場合
s3:BypassGovernanceRetention
を Deny する- ガバナンスモードでオブジェクトロックの削除・上書きを許可したい場合
- CLI 操作ならば
s3:BypassGovernanceRetention
を許可 - マネジメントコンソール操作ならば
s3:BypassGovernanceRetention
に加えてs3:GetBucketObjectLockConfiguration
を許可
さいごに
今回、はじめて S3 オブジェクトロックを触ってみました。コンプライアンスモードであれば、有無をいわさず操作出来なくなるのですが、ガバナンスモードの場合は、どのような権限を持っていると削除操作できるのか押さえておきたかったので、いろいろと検証してみました。
改ざん防止等において有効な機能かと思いますので、そのような要件がある場合は積極的に使っていきたいですね。
余談ですが、検証のなかで見つけた内容をフィードバックし、公式ガイドが修正されるなど、お役に立つことで出来て良かったです。(日本語版もいずれ修正されると思います)
以上!大阪オフィスの丸毛(@marumo1981)でした!