AWS S3 への匿名での Put

概要

AWS S3 に匿名で Put すると危ないという話についてです。

私もこれを間違ってやってしまってました。

AWS のドキュメントにも少し書かれていましたが間違って使ってしまっている人もいるんじゃないかと思います。

docs.aws.amazon.com

注記

バケットをパブリックにした場合 (非推奨)、認証されていないどのユーザーもバケットにオブジェクトをアップロードできます。これらの匿名ユーザーは AWS アカウントを持っていません。匿名ユーザーがバケットにオブジェクトをアップロードすると、Amazon S3 によって特殊な正規ユーザー ID (65a011a29cdf8ec533ec3d1ccaae921c) がそのオブジェクトの所有者として ACL で追加されます。

どのように危険か

匿名ユーザーで Put したオブジェクトの ACL 情報を取得してみると以下のようになっています。

{
    "Owner": {
        "ID": "65a011a29cdf8ec533ec3d1ccaae921c"
    },
    "Grants": [
        {
            "Grantee": {
                "ID": "65a011a29cdf8ec533ec3d1ccaae921c",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

ドキュメントに書かれているように匿名ユーザーがオーナーになっていて、このオーナーの匿名ユーザーに FULL_CONTROL の権限がついています。 つまり匿名ユーザーが読み込みも書き込みもできてしまう状態です。

この匿名ユーザーは実は特定のユーザーになっているので オブジェクトのリージョンとバケット、オブジェクトキーの情報が知られてしまうと誰でもアクセスできてしまいます。

バケットポリシーで特定の IP 以外は拒否などの設定が入っていれば制限できると思いますが バケットポリシーで IP 許可だけの設定だと、オブジェクトの権限だけで通ってしまうようです。

結構間違って使われているのでは...

匿名ユーザーの ID で検索すると list-objects の結果と思われるような情報が色々でてきます。 list-objects の結果情報にはオーナーとオブジェクトキーも含まれているので匿名ユーザーでこれを書き換えたりできてしまうかもしれません。

間違った場合

匿名で Put できないようにバケットポリシーで制限します。 それからすでに匿名ユーザーで作られてしまったオブジェクトのオーナーは更新できないようなので 一度ダウンロードして、別のユーザーでアップロードし直しオーナー変更します。 list-objects の結果にオーナーIDも含まれているので問題のあるオブジェクトを探すのに使えます。

S3のアクセスコントロールについて参考

docs.aws.amazon.com

dev.classmethod.jp