S3 オブジェクトロックをガバナンスモードで利用するときの権限について調べてみた

S3 オブジェクトロックなかなか便利ですね。
2020.02.17

S3 オブジェクトロック使っていますか?(ナニソレ? という方は、以下の記事をどうぞ)

今回、S3 に保存しているログの改ざん防止という要件で S3 オブジェクトロックを使う機会がありました。S3 オブジェクトロックには以下の2つのモードがあります。

  • ガバナンスモード
    • 特定の権限を持っている場合、削除が可能
  • コンプライアンスモード
    • もう何をやっても削除できない

今回はガバナンスモードでの運用を想定し、どの権限が与えることでロックされたオブジェクトが削除できるのかを確認してみた、という記事になります。

やってみる

まずは AmazonS3FullAccess で

まずはガバナンスモードを設定したバケットに AmazonS3FullAccess 権限を持ったロールで削除してみます。

綺麗サッパリ削除できますね。

AmazonS3FullAccess だと削除できることは判りましたので、次にどの権限が効いてることによって削除できるのか調べてみました。

s3:BypassGovernanceRetention

公式ガイドに下記のとおり記載があります。

ガバナンスモードのリテンション設定を上書きまたは削除するには、ユーザーは s3:BypassGovernanceRetention アクセス許可を持っている必要があり、また、ガバナンスモードの上書きを必要とするリクエストで、x-amz-bypass-governance-retention:true を要求ヘッダーとして明示的に含める必要があります

では、先ほどの AmazonS3FullAccess を与えたロールに、s3:BypassGovernanceRetentionDeny した以下のポリシーをアタッチしました。

deny-BypassGovernance ポリシー

{
    "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 have s3:BypassGovernanceRetention or s3: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)でした!