テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

s3: 署名チェックとACLはどちらが優先されるのか?

誰か知っていたら教えて欲しい. もちろん明確な根拠とともに.

S3には, 署名とACLというアクセス制御のための機能がある.

署名は, リクエストの内容から計算したハッシュ値をリクエストに付加し, サーバ側でこのハッシュ値を再計算することで真正性を担保する技術である. 例えばv2署名と呼ばれるアルゴリズムでは, Authorizationというヘッダにこの値を付加する. この値がマッチ出来ない場合, クライアントにエラーを返す.

ACLは, バケットやオブジェクトにつける. これは例えば「誰でもrw可能」「rだけは誰でも可能」「所有者のみrw可能」などを指定する. これは, オブジェクト作成時(PUT/POST)にcanned aclという形で情報を与えることも出来るし, あとで書き換えることも出来る. 誰でもrw可能なことをpublicと言い, この場合には署名は必要ない.

All Users グループ – http://acs.amazonaws.com/groups/global/AllUsers で表されます。 このグループへのアクセス許可により、誰でもリソースにアクセスすることが許可されます。リクエストは署名(認証)済み、または署名なし(匿名)とすることができます。署名なしのリクエストでは、リクエストの Authentication ヘッダーが省略されます。

さて, 私にはここで疑問がある. これら2つのアクセス制御はどちらが優先されるのか?

例えば, 誰でもpublic-readなオブジェクトに対して署名「あり」(but 間違ってる)でアクセスしようとした場合, どうなるのか?

直感的には動作は2通り考えられる.

  1. 署名が間違ってるので, エラーを返す. (403)
  2. 署名が間違っているので署名なしユーザに格下げする. その上でアクセスを試みる. public-readなのでアクセスに成功する. (200)

これに関する裏付けが未だとれていないので, 読者でAWSの知識がある人は教えて欲しい.

私の考えは1である. 理由は, 署名が誤っているならば早くエラーを通知した方がいいと思うからである. また, 署名 | ACL といったようにパイプで繋がってる方が概念的にシンプルである. (署名と, ユーザ種別をごっちゃにしたくない)

ただし, 2も理解出来る. 理由は, そのオブジェクトがpublicかどうかをクライアントサイドで調べてからでないとリクエストを発行出来ないというのは使い勝手が悪いからである. これは, パイプでいうと, ACL | 署名という順序であるが, きれいに実装しにくいと思う. (署名の方が, 呼んでいるAPIを判別する前にチェック出来る)