こんにちわ。能年玲奈より川口春菜派のとおのぶです。能年さんを画像検索すると剛力さんが現れてちょっとびっくりしました。 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を比較することができました。

« ansibleでnginxをビルドしてインストール

docoptでCLIを作成してpypiへuploadした »

blog comments powered by Disqus

Categories

Uncategorized (rss) (2) | blogofile (rss) (2) | designpettern (rss) (3) | flask (rss) (2) | fluxflex (rss) (3) | java (rss) (6) | nginx (rss) (6) | python (rss) (8) | sacloud (rss) (3) | spdy (rss) (2) | thistownneedsguns (rss) (2) | webService (rss) (2) | zabbix (rss) (3) | さくらVPS (rss) (4) | 芸術は爆発しろ (rss) (3) |