はじめに
ある日、筆者が関わっているプロジェクトで「S3のバケットポリシーが設定できない」との投稿をグループチャット内で見つけました。プロジェクトの環境構築に携わる人だったので、その人にはIAMロールAdministratorAccessの権限が設定されていましたから、「バケットポリシーが設定できないはずはないよな」と思い、その人が何をしようとしていたのかを投稿内容から確認しました。仮にその人をAさんとしておきます。
なお、Principalを"*"とした場合は、そのS3バケットは誰にでも公開された状態となります。AWSにサインインしていない人にも公開されます。知っている人は知っていることだと思われますが、私は知らなかったことでした。
その人はS3バケットのバケットポリシーでPrincipalを"*"としていたがっていた
Aさんのバケットポリシーを見ると、Principalが以下のように設定されていました。
Principal: "*"
試しに筆者(IAMロールAdministratorAccessの権限あり)が別のS3バケットを作り、そこでPrincipal: "*"
としたバケットポリシーを設定しようとしたら、確かにバケットポリシーが設定できませんでした。これで、Aさんだけの問題ではないことに気が付きます。
それで、「S3バケットのPrincipalに"*"を設定するとは、一体どういう状況?ここはサービスやロール、ユーザーなどを明示的に指定するところなのではないのか?」と筆者は疑問に思いました。
試しにPrincipalに特定のサービスを指定してみたら、バケットポリシーが設定できた
IAMユーザーは必要な権限を持っているはずなので、そうなると怪しいのはバケットポリシーそのものであり、(筆者としては)見慣れないPrincipal: "*"
が怪しいのではないかと考えました。それで、問題の切り分けのために以下のPrincipalを書いてみましたところ、バケットポリシーが設定できました。
"Principal": {
"Service": "lambda.amazonaws.com"
}
これで、Principalの書き方に起因する問題だということが認識できました。
調査の結果、バケットポリシーでPrincipal:"*"を指定するということは「匿名アクセス許可を付与する」ことだと知る
今回の調査をするまで気が付かなかったのですが、バケットポリシーでPrincipal:"*"を指定すると、「匿名アクセス許可を付与する」、つまりバケットを誰でもアクセスできるようにする設定になるとのことでした。
「誰でも」の部分には、AWSにサインインしていない人も含まれます。
明確な要件がない限り、S3バケットを誰にでも公開することはないはずなので、仕様を知らずに行っていたとしたら怖いことだと感じました。
筆者の前提
筆者としては、この件を調査する前の前提は以下のとおりです。
- S3バケットをパブリックで公開するような要件が今まで発生していなかった
- そのため、S3バケットをパブリックで公開する方法自体、認識していなかった
要件として発生したことがなかったので、筆者はこの件に関わるまでは、S3バケットをパブリックで公開する方法を調べたことはなかったという状態です。S3バケットの設定は常に「パブリックアクセスはオフ」としていて、またそのような設定になっていることを何度となく確認した上で使用している、という状態です。
よって、S3バケットをパブリック公開する要件が発生していた人には、当記事は当てはまらないことになります。
考察
どうやらAさんは、バケットポリシーでPrincipal:"*"を設定することがどういうことなのかを知らずに設定してたようです。「ワイルドカードで設定しておけば、設定が楽になる」ぐらいの感覚だったようです(AさんおよびAさんが関係する発言から判断)。
今回は、私自身で調べてみて、バケットポリシーでPrincipal:"*"を設定することの意味が理解できましたが、知らないということの恐ろしさも同時に再認識しました。