AWS版Movable TypeをSSL対応する

Movable Type Advent Calender 17日目の記事です。昨年は7日にしてみましたが、今年はMTDDCなどあってネタの準備期間があまりにも短かったため少し猶予を頂きました。(7日って一週間だし微妙...)

今年はMovable Typeの管理画面をSSLに対応させたいと思います。

今回の目標

とりあえず、以下のことができれば目標達成ということにしたいとおもいます!

  • SSL証明書の設定(脆弱性のあるSSLv2,v3は無効化、XPを見捨てたアルゴリズムの設定などをする)
  • httpsなページはMT管理画面のみ、後はHTTP(平文)での対応
  • SSL証明書は使いまわして、あるサイトのブログを別サーバーで管理するという前提

目標を自分で言ってるのですが、ハードル無駄に上げました。管理画面だけSSL必須で、戻るときは混在でも可とすればある程度早く終わってたものを...(時間的な問題と金銭的な問題があるため、割愛している部分が多々あります)

SSL証明書の取得

SSL証明書を取得します。今回、このサイトのSSL証明書を使いまわしたためこの部分は割愛します。(このサイトのSSL証明書のみサブドメイン対応済みのため)

私は国内のサイトが高いので海外のサイトで購入しましたが、最近では日本国内のサイトでも安くなっているのはいます。以下に挙げておきます。(大体ドメイン認証で〜2,000円程度)

また、個人で使われている方で、非営利であればStartComの証明書が使用することができます。

SSL対応する

SSL対応するときに、AWS版Movable Typeではnginxの設定ファイルが通常とは異なる場所にあります。いつもの場所(/etc/nginx/conf.d)に設定を記載したとしても直接のウェブサイトには反映されません。

そのため、AWS版Movable Typeで用いられている設定ファイルの保管場所から編集します。最初に設定ファイルが保管されているディレクトリに移動します。

# cd /data/conf/

これで設定ファイルが保存されているディレクトリに移動することができました。lsコマンドを実行すると以下のようになっていると思います。

# ls
fastcgi_params    mt-config.cgi        mt-config.cgi.ja   nginx.conf
movabletype.conf  mt-config.cgi.en_us  nginx_common.conf

今回使用するファイルはnginxから始まるファイルです。nginx.confを見ていただくとわかりますが、大体の設定がnginx_common.confに記載されています。このファイルをコピーして、SSL通信用のファイルと通常のHTTP通信用のファイルに分けます。

# cp nginx_common.conf nginx_ssl_common.conf
# cp nginx_common.conf nginx_common_original.conf

作成後、Viでこれらのファイルを編集していきます。

# vi nginx_common.conf
server_name localhost;
(割愛)
location ^~ /mt/ {
    proxy_set_header       Host            $http_host;
    proxy_set_header       X-Forwarded-For $remote_addr;
    proxy_set_header       X-Forwarded-Proto $scheme;
    proxy_pass http://unix:/app/run/movabletype.sock;
    limit_req zone=one burst=100;
    proxy_read_timeout 300;
    return 301 https://$host$request_uri;
}
# vi nginx_ssl_common.conf
server_name localhost;
(割愛)
location / {
    ssi     on;

    perl    MTDynamicHandler::handler;

    root    /data/file/static;
    limit_req zone=one burst=100;
    return 301 http://$host$request_uri;
}

location /mt-static {
    alias /app/movabletype/mt-static;
}

location ~ /\.ht {
    deny  all;
}

server_name localhost;に関してはウェブサイトのドメインを設定します。returnから始まっている場所に関しては追加します。

このままnginx.confを設定してコメントアウトして終了でも良いのですが、セキュリティ上の問題があるため変更します。

# vi nginx.conf
(割愛)
    server {
        listen              80;
        include             /data/conf/nginx_common.conf;
    }

    server {
        listen               443;
        include              /data/conf/nginx_ssl_common.conf;
        ssl                  on;
	ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers          "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
        ssl_certificate      /data/ssl/server.crt;
        ssl_certificate_key  /data/ssl/server.key;
    }

12,13行目をまるまるっとコピペします。サーバーの証明書の鍵ファイルは/data/ssl/ 以下にあるものとして記載しています。このことをすることによって、最近問題になっているPOODLE問題などはわりかし回避することが可能です。

最後に、nginxを再起動させると完了です。

# service nginx restart

今回使用したインスタンスを12月25日まで起動させておきます。上記に記載した設定とほぼ同じものを使っていますので、動作確認をしてもらえればと思います。MTの管理画面パスは/mt/demoです。

参考サイト

SSLの設定や、情報などに関しては以下のサイトを参考にしております。