WordPressをDebianにインストール その3: セキュリティの強化

セキュリティ

前回のつづき。

2016/4/12 追記

Let’s Encryptの証明書を導入することによって、オレオレ証明書を卒業しました!

http://scratchpad.jp/https-with-lets-encrypt/

セキュリティの強化

WordPressをインストールして気になったのがセキュリティ。
以下の2点で生パスワードがインターネット上に流れるのが気になりました。

  1. WordPressの管理画面にログインするとき
  2. WordPressの管理画面でテーマやプラグインをインストールするとき

なので、この2点を改善してみます。

管理画面の強化(SSL化)

管理画面をSSL(HTTPS)にすることで、ログイン時にパスワードが暗号化されるようにします。

このためにはまずApacheのSSL機能を有効にする必要があります。

ApacheのSSLを有効にする

SSLを有効化するためには、正式にはサーバー証明書を取得しなければいけません。しかしそんなお金もないので、とりあえず自己署名証明書(いわゆるオレオレ証明書)でごまかします。

オレオレ証明書のサーバにHTTPSで接続すると、警告のダイアログが表示されますが、ここでは気にしないことにします。

証明書の作成とインストール

オレオレ証明書のためにはまず秘密鍵と公開鍵のペアを作成します。

秘密鍵の作成は下記のコマンドでOKです。

sudo openssl genrsa -aes128 1024 > blog.key

このとき指定したパスフレーズは忘れないようにします。

次にこの鍵に対応する公開鍵を作ります。

openssl req -new -key blog.key -out blog.csr
(秘密鍵のパスフレーズを入力)
Country Name (2 letter code) [AU]:JP ← 国コード。日本なら「JP」
State or Province Name (full name) [Some-State]: Tokyo ←地域名。適当に。
Locality Name (eg, city) []:Shinagawa ← 市名。適当に。
Organization Name (eg, company) [Internet Widgits Pty Ltd]:. ←組織名。適当に。空欄の場合は「.(半角ピリオド)」を入力する。
Organizational Unit Name (eg, section) []:.←部署名。適当に。空欄の場合は「.(半角ピリオド)」を入力する。
Common Name (eg, YOUR name) []:blog ←名前。適当に。
Email Address []:. ←メールアドレス。適当に。空欄の場合は「.」。

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:←何も入力せずリターンでOK
An optional company name []:←何も入力せずリターンでOK

ここまで準備ができたら、秘密鍵と公開鍵からオレオレ証明書の作成。
期日があるのでとりあえず365日。

openssl x509 -in blog.csr -days 365 -req -signkey blog.key > blog.crt

さらに、秘密鍵のパスフレーズを解除しておきます。

mv blog.key blog.key.back
openssl rsa -in blog.key.back > blog.key

オレオレ証明書とパスフレーズを解除した秘密鍵をインストールします。

sudo mv blog.crt /etc/ssl/certs/
sudo mv blog.key /etc/ssl/private/

Apacheの設定ファイルの変更

/etc/apache2/sites-availableにあるdefault-sslを参考に自分のサイトの設定ファイルを作成します。私は下記の内容をscratchpad-blog-sslとして/etc/apache2/sites-availableに作成しました。

<IfModule mod_ssl.c>
<VirtualHost *:443>
UseCanonicalName    Off
ServerName  scratchpad.jp
ServerAdmin メールアドレス
DocumentRoot /www/scratchpad.jp

<Directory /www/scratchpad.jp>
Options All
DirectoryIndex index.php
</Directory>

ErrorLog /var/log/apache2/scratchpad-ssl-error.log
LogLevel warn
CustomLog /var/log/apache2/scratchpad-ssl-access.log combined

SSLEngine on

SSLCertificateFile    /etc/ssl/certs/blog.crt
SSLCertificateKeyFile /etc/ssl/private/blog.key

<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>
</IfModule>

この設定ファイルを有効化してApacheの設定を再読み込みします。

sudo a2ensite scratchpad-blog-ssl
sudo /etc/init.d/apache2 relead

WordPressのSSLの設定を有効化する

詳しくはhttp://wpdocs.sourceforge.jp/Administration_Over_SSLに書いてあります。

SSLを用いる範囲が「管理画面のログイン処理」だけの場合と、「ログイン処理+管理画面全体」の2種類あります。
当然後者のほうがセキュリティが高いわけですが、管理画面操作全体が重くなるのと、テーマ選択時など外部から読み込んだデータを組み合わせる画面のときに警告のダイアログが出てしまいます。
面倒なので私は前者をにしました。

ログイン処理のみをSSLにする場合

/etc/wordpress/config-サイト名.phpに下記の行を追記します。

define('FORCE_SSL_LOGIN', true);

Apacheの設定を再読み込みします。

sudo /etc/init.d/apache2 relead
wordpressの設定ファイルを書き換えたときに、グループ所有権が変わってしまわないように注意しましょう。
グループ所有権がwww-dataでないとうまく動きません。

この設定場合、

ログイン処理と管理画面全体をSSLにする場合

/etc/wordpress/config-サイト名.phpに下記の行を追記します。

define('FORCE_SSL_ADMIN', true);

Apacheの設定を再読み込みします。

sudo /etc/init.d/apache2 relead
wordpressの設定ファイルを書き換えたときに、グループ所有権が変わってしまわないように注意しましょう。
グループ所有権がwww-dataでないとうまく動きません。

まとめ

とりあえず安心してWordPressが使えるようになりました。次回はテーマやプラグインのインストール処理を強化(SSH化)します。