Twitter Facebook github

Category “Web”

WordPressをSSLに対応させる手順

非SSL環境で動かしていたWordPressをSSL化するときの手順です。ちょうどLet’s Encryptを使って認証された証明書が手に入ったので、これを使ってWordPress全体をSSL化してみました。手順を備忘録として残しておきます。

 

wp-config.phpの修正

まずは基本ですね。WP_HOMEとWP_SITEURLを書き換えます。また、FORCE_SSL_ADMINを設定することで管理画面はHTTPSを強制できます。

 

データベースの修正

WordPressのデータベースに接続し、(WPプレフィックス)_options テーブルを開きます。

option_nameカラムがsiteurlになっているレコードを探し、値のhttp://をhttps://に書き換えます。続いてoption_nameカラムがhomeになっているレコードを探し、同じように書き換えます。

 

HTTP接続をHTTPSにリダイレクト

上の2ステップでWordPressのシステム的な部分の移行が終わりました。HTTPSで適当なページを開いて正しくリンクが遷移できるか、リンク遷移後もページもHTTPSになっているか、画像や画像のサムネイルが正しく読み込めているか、管理画面へHTTPSのままログインできるか、などをチェックします。

問題がないようであれば、httpでの接続はすべてhttpsにリダイレクトするようにします。(任意です。httpsにすると若干サーバーの負荷も増えますので、ハイトラフィックなブログを運営されている方はhttpの方が有利という考え方もできます。ブログであれば、http/httpsどちらでもアクセス出来るようにしておき、通信を暗号化するかどうか判断をユーザーに委ねるのも良い方法です。)

今回nginxを使っているので、nginx.confを書き換えることにしましょう。リダイレクトにはrewiteを使っているブログも多く見られますが、nginx.orgではreturnが使われていたのでreturnを使うことにします。計った訳ではないですが、シンプルな分処理も早そうです。

保存したらnginxを再起動します。

再起動が終わったら、適当なURLを叩いてみてHTTPSに正しくリダイレクトされることを確認します。

 

安全でないリソースを排除する(Mixed Content問題)

これで9割方終わっていて、SSLにするという目的自体は達成なのですが、次のように「このページに安全でない他のリソースが含まれています。」と表示され、URLのアイコンや文字色も緑色にならないことがあります。

これは、アクセスしているページはSSL接続にも関わらず、そのページ内から非SSLの静的ファイル等をロードしているためです。例えば、サードパーティのCSSやJavaScript、フォントファイル、画像ファイル等を絶対パスでhttp:// に続く形でロードしていることに起因するものが多いです。

これらを見つけて、httpsが提供されているコンテンツはhttpsでロードするように、提供されていない場合はライセンスを確認して自分のサーバーでホスティングできるか確認して移行するなどの対策を行います。量が多いと結構大変ですね…。

どのファイルがMixed Contentなのかは、Google Chromeのデベロッパーツールにあるコンソールが助けになります。

例えば上の画像のように、過去にアップロードした画像ファイルに起因するものであれば、次の項を読んでみてください。テーマやプラグインに起因するものは、手動で直さなければいけません。

ちなみに、Protocol Relative URLという仕様により、CSSやJavaScriptをロードする際のhttpやhttpsを省いて記述すると、読み込み元のスキーム(SSLか非SSLか)に従って読み込むスキームも変更されポータビリティが高まります。(例えば //example.com/main.js をSSLのページからロードさせた場合はhttps://〜と解釈され、非SSLのページからロードさせた場合はhttp://〜と解釈されます。)

 

アップロード画像に起因するMixed Contents問題を直す

この場合、基本的には記事を編集して、画像へのURLを書き直すことで修正できますが、過去の記事・画像が多いと直すのに骨が折れます。

一気に前述したProtocol RelativeなURLに画像リンクを書き換えるSQL文を使うと一瞬で解消できるでしょう。テストしていますが、万一のために必ず実行前にテーブルのバックアップを取ってください。

 

無事にMixed ContentsによるSSLの警告も消えました。

 

雑感

サクっとこなすつもりが意外と色々気にすることがあって大変でした。一度やっておくとノウハウ的に使い回せるので、知識として蓄えておきたいですね。

次はHTTP/2, SPDY対応や、証明書の透明性確保あたりを触れたらいいなと思っています。

Let’s Encryptをnginxで使ってみる

Let’s Encryptとは

https://letsencrypt.org/

無料で認証されたSSL証明書を発行できるサービスです。今月パブリックベータになり、誰でも試すことができるようになりました。Web Tech界隈では今アツい技術の一つです。

今回使うnginxは1.8系のため、HTTP/2、SPDYは使えません。メインラインの1.9系を使うことで対応できるので、興味がある方は別に調べてみてください。

ビジネスなどエンタープライズで使用する際はこのSSLではなく信頼された発行元から

 

Let’s Encryptのインストール

Let’s Encryptを使うためには、nginxやapacheなどのウェブサーバーのほかGitが必要です。OpenSSLなどはインストールされていない場合、Let’s Encryptが自動的にインストールしてくれます。Gitがインストールされていなければ、事前にyumで入れておきます。

まず、Let’s Encryptのクライアント本体を適当な場所にgitでクローンしておきましょう。

gitが必要な箇所はここだけです。結構頻繁に更新されているようなので、都度ローカルリポジトリも追従させてあげるのが良いでしょう。

クローンしたら、内包されているメインのコマンド letencrypt-auto を叩いてみましょう。このコマンドを実行した場合、letsencryptが使用する必要なライブラリがインストールされていなければ自動でインストールしようとします。rootで実行していない場合はパスワードを入力してください。

今回、AWS EC2で実行している関係で上のような警告が表示されました。EC2上で利用するのであれば一般的なCentOS等と使い方は何ら変わりませんので、言われるままに継続します。

一度debugをつけて実行した後はdebugなしで利用できるようです。

 

証明書の取得

発行にはドメインの所有権認証が必要です。letsencrypt-autoでは、次の方法でこの認証を簡単なコマンドだけで実行できます。

現時点でlets encryptでは apache, standalone, webroot の3種類の証明書取得方法をサポートしています。apacheを使っている場合はapacheを使うと自動でインストールしてくれます。standaloneはletsencrypt自身がウェブサーバーを起動して所有権の認証を行います。webrootは既にウェブサーバーが起動している場合、ドキュメントルートを指定して既存のサーバーを介して認証を行います。 詳しい違いについては ./letsencrypt –help で確認してください。

今回はnginxですし、既に起動しているサーバーに対してインストールしょうとしているので、3番目のwebrootオプションを使って認証を行います。

上記を実行するとメールアドレスの入力と利用規約への同意が求められますので、指示通り進みます。認証情報を紛失した際などは、ここで登録したメールアドレスを使ってリカバリするので間違えないように気をつけてください。

次のようなメッセージが出力されれば、正しく証明書を取得することができました。

 

上の例では、/etc/letsencrypt/live/<ドメイン>/ の中に証明書類が保存されています。

 

DH鍵交換のパラメーター生成

証明書をウェブサーバーにインストールする前に、セキュリティ向上のために実行することをおすすめします。

opensslコマンドで生成します。AWSのsmallインスタンスで3分程度かかりました。環境によってはもっと時間がかかるかもしれません。

 

証明書をnginxに設定

最後に取得したSSL証明書をnginxから参照して利用できるようにします。

上の通り変更して、nginxを再起動します。設定ファイルに問題がなければSSLで通信できるようになっていますので、テストしてみましょう。

ssl-test

ということで、Let’s Encryptで簡単にSSL対応できました!

 

SSLのセキュリティテスト

SSLサーバーのセキュリティテストは Qualys SSL Report を使って簡単に実施できます。

ssl-check

最低限の設定を施しただけだとCやDランクになるかと思います。例えばPOODLEや弱いDHパラメーター、ダウングレード攻撃などの脆弱性を防いでいない場合は評価が下がります。

前述のnginx.confの設定を施せばAまたはA+の評価になると思います。ときどきこのサイトでSSLの安全性をチェックして、常にこの評価をキープしていきましょう。

 

雑感

以前から無料で発行できるSSL証明書もありましたが、手続きが煩雑だったりと色々厄介なことが多かったです。Let’s Encryptもまだ改善の余地はあり、速い速度で開発も進んでいますので、まだまだ今後に期待できるでしょう。Let’s EncryptでSSL対応が当たり前な時代になれば良いですね。

 

VCCWでイマドキWordPress開発環境

WordPressを使ってウェブを作っているみなさん!まだXAMPPでMAMPで消耗してるんですか!?

 

VCCWを使う選択

VCCWというのは、VagrantをベースにしたWordPressの開発環境です。

従来、何もないところからWordPressの開発をはじめるとなると、WebとDBサーバーをインストールして、データベースを作って、WordPressをダウンロードして、接続情報を入力して…など、多くの手順を踏まなくてはいけませんでした。Web、DBサーバーも独立しているため管理も煩雑になりがちです。

VCCWを使うと本当に簡単に開発環境が整います。また、WordPressの開発に便利な色々な支援ツールも一気に使えるようになります。WordPressのサイト個々にOSイメージが作られるため、一つのMySQLサーバーで複数のサイトを飼いながら開発…なんてこともなくなります!

テーマを作るデザイナーの方は少し敷居が高いかもしれませんが、プラグインなどを作るエンジニアよりの方は是非一度お試しください!一度これに慣れると、もう従来の方法でなんて開発できませんよ!

 

事前準備

VCCWはVagrantfileを使って仮想環境を構築するため、先にVagrantを使えるようにしなければいけません。

拙著 Vagrantことはじめ にしたがって、VirtualBox+Vagrantの開発環境を先に整えてから読み進めてください。

 

hostsupdaterプラグインをインストール

(※ Windowsの方はこのプラグインを使えないので読み飛ばしてください。ホスト名でアクセスしたい場合は、「Windows hosts 編集」とかでググってください。)

VCCWで構築したWordPressの環境は、ローカルIPアドレスでアクセスできるようになりますが、PC内にあるhostsファイルというものを編集することで、任意のホスト名(デフォルトであれば vccw.dev)でアクセスできるようになります。これは完全に好みですが、複数サイトを開発する際に直感的な名前でアクセスできるので私は便利に使っています。

インストールは次のコマンドを実行します。グローバルにインストールされるので、好きなディレクトリ上で実行して構いません。

 

Boxの準備

Vagrantことはじめ でも触れたように、仮想マシンの起動にはBoxが必要です。VCCWで用いるBoxをダウンロードしておきます。

Boxのダウンロードにはまた時間がかかるので、ダウンロードしている間に次のステップを終わらせておきましょう。

 

VCCWをダウンロード

前述のステップでBoxは用意しましたが、このBoxを使うためには予め用意されたVagrantfileと環境構築用のスクリプト(内部ではChefを使っています)が入ったVCCW本体と呼べるものをダウンロードして、それを作業用のフォルダとして使います。

次のVCCW公式ページからzip、もしくはtar.gz形式で圧縮されたVCCW本体をダウンロードしてきてください。執筆時点の最新バージョンは2.18.0です。

http://vccw.cc/

ダウンロードしたら解凍して、サイトの名前など分かりやすいものに変更します。また今後頻繁に開くことになるので、開発用のフォルダなど決めているのであれば移動しておきましょう。

 

VCCWの設定

実際に起動する前に、日本語のWordPressが導入されるように設定を変更しておきましょう。これを設定しておかないと、デフォルトで英語のWordPressがインストールされることになります。後から変更するのは一手間です。

まず、VCCWを配置した下のprovisionフォルダにあるdefault.ymlを、VCCWのフォルダ直下にsite.ymlという名前でコピーしてきてください。

仮にVCCWを ~/vccw/ に設置したとすると、 ~/vccw/provision/default.yml を、 ~/vccw/site.yml にコピーするということになります。(私はここでprovisionフォルダ内にコピーするものと思い込み、何故動かないのかソースコードを読んでコピー先の位置間違いに気付きました……。)

コピーできたら、エディタで site.yml を開いて、次の通りlangを変更します。

PCのスペックに余裕がある人は、Virtual Machine Settingsのmemoryとcpusの数を増やしておくと良いでしょう。

また、前述のhostsupdaterを導入した人は、Network Settingsのhostnameをサイト名などを使ったホスト名に変更しておくと良いと思います。このホスト名を使ってWordPressにアクセスできるようになります。

 

VCCWを起動

BoxとVCCWの準備が終わったらいよいよ起動してみます。ダウンロードしてきたVCCWが入っているディレクトリにターミナルで移動して、その中にあるVagrantfileを元にVagrantを起動します。

VCCWを初めて起動する場合、仮想マシンのコピーに加えて、Apache+MySQLサーバーのダウンロードやWordPressのダウンロード、開発支援ツール群のダウンロードなど、様々な処理がVagrant内で行われます。これにも結構な時間がかかります(私の環境で5分程度)ので、気長に終わるのを待ちましょう。ただし、前述したhostsupdaterプラグインをインストールしている場合、その処理が実行される際にrootユーザーのパスワードを求められることがあります。入力しないと進まないので気をつけましょう。

 

使ってみる

無事に起動できたら早速チェックしてみましょう!ブラウザで http://192.168.33.10/ を開いてみてください。hostsupdaterを導入した方は、設定したホスト名でも開けるかと思います(デフォルトは http://vccw.dev/ です)。

ちゃんと日本語のWordPressが表示されればOKです!管理画面は /wp-admin で、IDとパスワードは変更していなければ共に admin です。

 

開発してみる

vagrant upを実行すると、VCCWの中に /www/wordpress というディレクトリが作られます。/www ディレクトリはVagrantの仮想マシン内と共有されています。

例えばテーマを作る時は /www/wordpress/wp-content にある themes  内を編集すればいいですし、プラグインは同じく plugins になります。/www/wordpress の中で従来通りの開発すればよいということですね!

もちろんWordPressの管理画面からテーマやプラグインをインストールした場合も、そのフォルダの中に保存されていきます。もちろんリアルタイムです!

 

まとめ

従来の開発環境と比べて、いかに楽にクリーンで本番環境に近い開発環境が構築できたか体感いただけましたか?これからのWordPress開発はVCCWの時代ですよ!

 

 

WordPressのセキュリティ対策

いくらWordPressをホストするサーバーのセキュリティを高めたところで、WordPressが脆弱だと意味がありません。WordPressのセキュリティ対策をまとめてみます。

それぞれの先頭の★は、3段階でその対策の効果を元にしたお勧め度を表します。

 

管理用のユーザー名を変更する(★★★)

ログインする際のユーザー名は管理画面の設定から変更することができません。ただし、新しくユーザーを作成し、古いユーザーを削除する方法で管理用のアカウントを作り直すことができます(記事は引き継げます)。adminのような脆弱なユーザー名を使っているのであれば、今すぐにでも変更すべきです。また当然ですがパスワードは使い回さず、堅牢なものを設定しましょう。

 

ログイン時に2段階認証を行う(★★★)

2段階認証というのは、IDとパスワードの他にワンタイムパスワードを入力する方式のことです。管理画面へのブルートフォース攻撃対策にとても有効です。

WordPressでこれを実現するには「Google Authenticator」プラグインがお勧めです。ユーザー毎に二段階認証の有効無効を切り替えることができます。スマートフォンに「Google Authenticator」のアプリをインストールして、WordPressのユーザー管理画面に表示されたQRコードをスキャンして紐付けます。ちなみに、有料版の1Passwordなど一部その他ワンタイムパスワード用のアプリでも利用可能です。

 

ログイン用のURLを変更する(★★★)

WordPressは /wp-admin や /wp-login.php にアクセスすることでログインページが表示されますが、このログイン用のファイル名を変更してしまうことでそもそも不正なログインを試される可能性がぐんと下がります。

直接コードに手を加えて実現することも可能ですが、日本語対応のお勧めプラグインもあります。Login Rebuilder です。これも簡単に実装可能な上、効果はとても大きいので是非実装しましょう。ただし、他のセキュリティ系プラグインとの相性が悪いこともあるのでその点は要注意です。

 

wp-config.phpファイルを守る(★★☆)

このファイルはWPがデータベースに接続するための接続情報などが含まれ、流出などに一番気をつけなくてはいけないファイルです。PHPのコードになっているため、PHPファイルが正しく処理される環境下では基本的に問題になることはありませんが、万が一PHPが正常に処理されなかった場合に備えてウェブサーバー側で対策を講じておきましょう。

nginxの場合、/etc/nginx/nginx.confのserverセクションに以下を記述します(ただしphpをハンドリングしている箇所より上に書く必要があります)。

apacheの場合、WPルートにある.htaccessに下記を追記します。

 

xmlrpc.phpを無効化する(★★☆)

WordPressは3.5以降、デフォルトでXML-RPCの機能が有効になっています。これはpingbackやメール投稿などの機能をサポートするものですが、pingbackの悪用によりDoS攻撃の踏み台にされることがあります。これらの機能を使っていないのであれば、上記wp-config.phpを無効にする手順と同様に xmlrpc.php を無効にしてください。適切に設定がなされていれば、/xmlrpc.php へアクセスした際に403 Forbiddenが返されるはずです。

 

WordPressのバージョンを隠す(★☆☆)

WordPressで生成されたページのソースコードには、metaタグやcssのサフィックスとしてWordPressのバージョン番号が記載されています。バージョン番号が知られてしまうと、既知の脆弱性を用いた攻撃が容易となります。悪意のある攻撃者へ情報を与えないために、バージョン番号を出力しないようにしましょう。

これもプラグインを用いることで用意に実現できます。「Remove Version」というプラグインをインストールして有効化するだけで、ソースコードにバージョン番号が出力されなくなります。

 

readme.htmlを削除する(★☆☆)

インストールする際のreadme.htmlがルートディレクトリに残っていたりしませんか?このファイルにもWordPressのバージョン番号が含まれています。もし存在するようなら消しておきましょう。

 

テーブルのプレフィックスを変更する(★☆☆)

データベースのテーブルに割り当てられるプレフィックスです。もしデフォルトの wp_ を設定されているのであれば、これも別のものに変更されることをお勧めします。SQLインジェクションの対策になります。インストール済みのWPでプレフィックスを変更することも可能ですが、手を入れなければならない箇所が多く、長くなるので割愛します。

 

管理画面からソースコードの編集を禁止する(★☆☆)

wp-config.phpに次の行を追記することで、管理画面からテーマやプラグインのソースコードを編集できなくすることができます。

これは管理権限を持つユーザーの不正なコードの改竄を防ぐ効果があります。また、不正に第三者に管理画面にアクセスされた際にも限定的ながら有効です。

 

その他

  • wp-adminのホスト制限

これも良い対策の一つですが、私の場合は外出先からでも執筆のためアクセスすることが多く、IPを固定できないため敢えて導入していません。その場合でも、国外からのアクセスなど出来るだけ絞り込むというのは十分にアリな対策です。

  • HTTPS化
  • DBユーザの権限設定
  • ファイルパーミッション
  • など

 

まとめ

いくつか対策を挙げてみました。WordPressを用いたサイトを運用する上での、セキュリティ対策の一助になれば幸いです。