vmodでS3の認証を突破する

とか考えていたら

といわなちゃんさん先生に尋ねると、

なんということでしょう!

というわけで試してみました。


環境はVirtualBox上で

  • CentOS 5.6(x86_64)
  • Varnish 3.0.0
  • libvmod-awsrest

という感じです。

公式RPMからふわっとインストールするのではなく今回試したようにrpmbuildとかやりだすと3.0.2ではどハマりして泣きそうになったので3.0.0で検証しました。

通常S3にマネジメントコンソールからファイルをアップロードすると、自身しかOpen/Downloadは出来ません。

EveryoneにOpen/Downloadを許可する設定を追加してもいいのですが、高貴な恥じらいの精神をもった紳士淑女には抵抗があるかと思われます。

そこで

http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader

な感じでヘッダを設定してやればいいのですがAWSSecretAccessKeyからハッシュ値を出してやらなければなりません。

それを簡単かつお手軽に可能にしてくれるのが今回いわなちゃんさん先生が作成したlibvmod-awsrestなのです!

それでは早速やってみましょう。

1.ソースをダウンロード

https://www.varnish-cache.org/releases/varnish-cache-3.0.0

2.展開して/usr/src/redhat/SOURCESに

必要なもの(https://www.varnish-cache.org/docs/3.0/installation/install.html#build-dependencies-on-red-hat-centos)は事前に入れておきます。rpm-buildとgccも当然必要です。

docutilsが必要なのでhttp://sourceforge.net/projects/docutils/?source=directoryからダウンロードして展開し

python setup.py install

してあげます。

3.RPM作成

とりあえずRPMだけ作成したいので、ソースディレクトリ内のredhatディレクトリから

rpmbuild -bb varnish.spec

してやります。specファイルのバージョン部分の修正が必要です。

4.インストール

適当にrpm ivhとかして下さい。

5.libvmod-awsrestインストール

mhashが必要なので事前にインストールしておきます。

ダウンロードはhttps://github.com/xcir/libvmod-awsrestから。

VARNISHSRCは/usr/src/redhat/BUILDでconfigure。

6.VCL編集

Varnishが使用するVCLを編集します。Exampleの通りで大体できると思いますが、backendの「.host」に指定するドメイン名にはバケット名を先頭につけてやらないとダメかも?

そんなこんなでAWSAccessKeyId、AWSSecretAccessKeyを記載してlookupしてやります。

お望みの通りファイルは取得できたでしょうか。

おまけ.隠蔽工作

高貴な恥じらいをもつ紳士淑女ならS3を使用していることをちょっと隠したいかもしれません。

S3からのレスポンス内のヘッダをvcl_fetchの中で

unset beresp.http.x-amz-request-id;
unset beresp.http.x-amz-id-2;

等としてやると謎めいた雰囲気をより一層醸し出せるかもしれません。


いわなちゃんさん先生本当にありがとうございました!


おまけのおまけ

Varnish 3.0.2だとvarnishtestでコケまくりました。

使用ポートのレンジを広げてもulimit -nを増やしてもsomaxconnを増やしてもテストの並列度?を1にしても(そもそもそれらが関係あるか分かってませんが)ダメでした。