こんにちわ。能年玲奈より川口春菜派のとおのぶです。能年さんを画像検索すると剛力さんが現れてちょっとびっくりしました。 blogで利用してる画像はAmazon S3にあるんですが、どこからでも見ることができる状態でした。セキュリティ としてイヤだなと思っていたので、S3へRESTで認証することにしました。認証はNginxで行います。 やろうとしていることはnginxでS3へリバースプロキシ と同じで、S3の認証が異なるぐらいです。
REST認証
RESTで認証する3rd party modleのAWS proxy moduleあるので それを使います。3rd party moduleなのでgithubから落として組み込まないといけないのがめんどうなのと、設定例で ちょっとはまってしまいました。
インストールオプションでAWS proxy moduleを組み込みます。ansibleを使った例はこちらです。
./configure --add-module={{ src }}/ngx_aws_auth
次に設定です。これでちょっとはまりました。githubの例では以下のとおりでしたが、動作せず認証エラーがおきます。
# This is an example that does not use the server root for the proxy root location /myfiles { proxy_pass http://your_s3_bucket.s3.amazonaws.com/; aws_access_key your_aws_access_key; aws_secret_key the_secret_associated_with_the_above_access_key; s3_bucket your_s3_bucket; chop_prefix /myfiles; # Take out this part of the URL before signing it, since '/myfiles' will not be part of the URI sent to Amazon proxy_set_header Authorization $s3_auth_token; proxy_set_header x-amz-date $aws_date;
動作させるには、locationのディレクトリに、/
を加えるだけです。これだけです。
ansibleを使った例はこちらです。
ちなみに、chop_prefixに/
がいらないのは、
ngx_http_aws_auth.c
をみればわかります。
# This is an example that does not use the server root for the proxy root location /myfiles/ { # you need "/". proxy_pass http://your_s3_bucket.s3.amazonaws.com/; #you need "/" aws_access_key your_aws_access_key; aws_secret_key the_secret_associated_with_the_above_access_key; s3_bucket your_s3_bucket; chop_prefix /myfiles; # you don't need "/". proxy_set_header Authorization $s3_auth_token; proxy_set_header x-amz-date $aws_date;
以上で、s3に認証することができました。簡単でしたね。
NginxでdebugとPythonで認証
簡単に書きましたが設定ではまって認証エラーがずっとでてました。何を試してもエラーだったので、 pythonで認証させて、NginxでdebugしてSignitureと同じかどうかを試しました。記録として残します。
pythonの認証はS3のドキュメントにも のっていて、それに時刻の計算とS3に認証するところまで記しています。requestsに依存しています。
Nginxのdebugはインストールオプションの設定と設定ファイルでログレベルを修正する必要があります。 ansibleを使った例はこちら とこちらです。
./configure ----with-debug
error_log logs/error.log debug;
これでエラーログが出るようになりました。例えば、 このようなものがあるとエラーログが出力されます。 これでpythonで認証したsignitureとnginxで認証したsignitureを比較することができました。