HTTPSによる管理

SSLを介したWordPress管理を簡単に有効に(および強制)するには、サイトのwp-config.phpファイルに2つの定数を定義できます。これらの定数をプラグインファイルに定義するだけでは不十分で、wp-config.phpファイルに定義する必要があります。また、これらの定数をtrueに設定する前に、サーバーにSSLが構成されており、セキュアサーバー用に(仮想)ホストが構成されている必要があります。

注意: FORCE_SSL_LOGINバージョン4.0で非推奨になりました。FORCE_SSL_ADMINを使用してください。

HTTPSログインとHTTPS管理アクセスを強制する

定数FORCE_SSL_ADMINwp-config.phpファイルでtrueに設定すると、すべてのログインおよびすべての管理セッションがSSLを介して行われるようになります。

  1. define( 'FORCE_SSL_ADMIN', true );

リバースプロキシの使用

WordPressがSSLを提供するリバースプロキシの背後にホストされているが、SSLなしでホストされている場合、これらのオプションは最初に無限リダイレクトループにリクエストを送信します。これを避けるために、WordPressがHTTP_X_FORWARDED_PROTOヘッダーを認識するように構成できます(そのヘッダーを設定するためにリバースプロキシを適切に構成していると仮定します)。

  1. define( 'FORCE_SSL_ADMIN', true );
  2. // in some setups HTTP_X_FORWARDED_PROTO might contain
  3. // a comma-separated list e.g. http,https
  4. // so check for https existence
  5. if( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false )
  6. $_SERVER['HTTPS'] = 'on';

通知

プロキシパスリダイレクションを使用している場合、リクエストをネットワークのホストに送信しますが、それに関連するヘッダーは送信しません。ただし、WordPressがリダイレクションを行うために必要なヘッダーがあります。それらを送信するには、リダイレクションにいくつかの行を追加する必要があります。

たとえば、Nginxでは、次の行を追加する必要があります:

  1. location / {
  2. proxy_pass http://your_host_name:your_port;
  3. proxy_set_header Host $host;
  4. proxy_set_header X-Real-IP $remote_addr;
  5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  6. proxy_set_header X-Forwarded-Host $server_name;
  7. proxy_set_header X-Forwarded-Proto $scheme;
  8. proxy_redirect off;
  9. }
  1. <a name="further-information"></a>
  2. ### さらなる情報
  3. この記事の残りは、古いバージョンのWordPressを使用している場合(理想的には使用すべきではありません!)や、SSL設定が多少異なる場合(つまり、SSL証明書が異なるドメイン用である場合)の情報として役立ちます。
  4. 時には、全体のwp-adminをhttpsプロトコルを使用してセキュアな接続で実行したいことがあります。概念的には、手順は次のように機能します:
  5. - 1*.* 同じURL(ブログURL)を持つ2つの仮想ホストを設定します。1つはセキュア、もう1つは非セキュアです。
  6. - 2*.* セキュア仮想ホストで、すべての非wp-adminトラフィックを非セキュアサイトにシャトルするリライトルールを設定します。
  7. - 3*.* 非セキュア仮想ホストで、すべてのwp-adminトラフィックをセキュアホストにシャトルするリライトルールを設定します。
  8. - 4*.* プラグインを介してフィルターを入れ、wp-admin内のリンクをフィルタリングして、アクティブ化されると管理リンクがhttpsを使用するように書き換えられ、暗号化された接続でのみクッキーが機能するようにします。
  9. 以下のガイドは、WordPress 1.5とApacheを使用して`````mod_rewrite`````を実行し、`````httpd.conf`````のリライトルールを使用しています(`````.htaccess`````ファイルではなく)が、他のホスティングシナリオに合わせて簡単に変更できます。
  10. <a name="virtual-hosts"></a>
  11. #### 仮想ホスト
  12. 非セキュアサイトに加えて、セキュアサーバー用に(仮想)ホストを構成する必要があります。この例では、セキュア仮想ホストは非セキュアホストと同じ`````DocumentRoot`````を使用します。仮に、wpadmin.mysite.comのような異なる名前のホストを使用し、ドキュメントルートをwpadminディレクトリにリンクすることもできます。
  13. ISPにセキュア仮想ホストを設定するように依頼するか、管理アクセスがある場合は自分で設定してください。[名前ベースの仮想ホスティングを使用して異なるSSLサーバーを識別することはできません](https://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2)。
  14. **非セキュアホストのためのリライトルール**
  15. 非セキュアホストの`````.htaccess`````または`````httpd.conf`````の仮想ホストスタンザに、このリライトルールを追加して、https://example.com/wp-admin/またはhttps://example.com/wp-login.phpにアクセスしたときに自動的にセキュアホストに移動します。
  16. これは、メインのWordPressリライトルールブロックの上に置く必要があります。
  17. ``````bash
  18. RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)\ HTTP/ [NC]
  19. RewriteCond %{HTTPS} !=on [NC]
  20. RewriteRule ^/?(wp-admin/|wp-login\.php) https://example.com%{REQUEST_URI}%{QUERY_STRING} [R=301,QSA,L]
  21. `

パーマリンクリライトルールを使用している場合、この行はRewriteRule ^.*$ - [S=40]の前に来る必要があります。

このブロックの重要なアイデアは、THE_REQUESTを使用することで、実際のhttpリクエストのみが書き換えられ、includeやfopenのようなローカルの直接ファイルリクエストは書き換えられないことを保証します。

セキュアホストのためのリライトルール(オプション)

これらのリライトルールはオプションです。セキュア接続を介してパブリックサイトへのアクセスを無効にします。以下のプラグインを使用してサイトのパブリック部分にログインし続けたい場合は、これらのルールを追加してはいけません。プラグインは暗号化されていない接続でクッキーを無効にします。

セキュア仮想ホストには、.htaccessファイルまたは仮想ホスト宣言に2つのリライトルールが必要です(リライトに関する詳細はパーマリンクの使用を参照してください):

  1. RewriteRule !^/wp-admin/(.*) - [C]
  2. RewriteRule ^/(.*) https://www.example.com/$1 [QSA,L]

最初のルールは、次のルールからwp-adminディレクトリを除外し、トラフィックをセキュアサイトから非セキュアサイトにシャッフルして、オーディエンスにとってスムーズに保ちます。

WordPress URIの設定

一部のプラグインが機能するため、また他の理由から、WordPress URIをhttpsプロトコルを反映するように設定することをお勧めします。この設定をhttps://example.comにすることで、ブログアドレスは変更されません。

設定例スタンザ

注意: 以下の設定はWordPress 2.8+と100%互換性があるわけではありません。WordPress 2.8はwp-includesフォルダからいくつかのファイルを使用します。最初のリライトルールセットによって導入されるリダイレクションは、一部のユーザーにセキュリティ警告を引き起こす可能性があります。詳細は#10079を参照してください。

  1. <VirtualHost nnn.nnn.nnn.nnn:443>
  2. ServerName www.example.com
  3. SSLEngine On
  4. SSLCertificateFile /etc/apache2/ssl/thissite.crt
  5. SSLCertificateKeyFile /etc/apache2/ssl/thissite.pem
  6. SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
  7. DocumentRoot /var/www/mysite
  8. <IfModule mod_rewrite.c>
  9. RewriteEngine On
  10. RewriteRule !^/wp-(admin|includes)/(.*) - [C]
  11. RewriteRule ^/(.*) https://www.example.com/$1 [QSA,L]
  12. </IfModule>
  13. </VirtualHost>

非セキュアサイト

  1. <VirtualHost *>
  2. ServerName www.mysite.com
  3. DocumentRoot /var/www/ii/mysite
  4. <Directory /var/www/ii/mysite >
  5. <IfModule mod_rewrite.c>
  6. RewriteEngine On
  7. RewriteBase /
  8. RewriteCond %{REQUEST_FILENAME} -f [OR]
  9. RewriteCond %{REQUEST_FILENAME} -d
  10. RewriteRule ^wp-admin/(.*) https://www.example.com/wp-admin/$1 [C]
  11. RewriteRule ^.*$ - [S=40]
  12. RewriteRule ^feed/(feed|rdf|rss|rss2|atom)/?$ /index.php?&feed=$1 [QSA,L]
  13. </IfModule>
  14. </Directory>
  15. </VirtualHost>

ログインと登録のためのリライト

ユーザーログインと登録にSSLを利用するのは良い考えかもしれません。以下の代替リライトルールを考慮してください。

非セキュア

  1. RewriteRule ^/wp-(admin|login|register)(.*) https://www.example.com/wp-$1$2 [C]

セキュア

  1. RewriteRule !^/wp-(admin|login|register)(.*) - [C]

ポート443またはポート80で実行されているサイトのためのリライト

  1. # BEGIN WordPress
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. # ポート443またはそれ以外(http over ssl)で実行されているサイトのために
  6. RewriteCond %{SERVER_PORT} !^80$
  7. RewriteRule !^wp-(admin|login|register)(.*) - [C]
  8. RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L]
  9. # ポート80(http)で実行されているサイトのために
  10. RewriteCond %{SERVER_PORT} ^80$
  11. RewriteCond %{REQUEST_FILENAME} -f [OR]
  12. RewriteCond %{REQUEST_FILENAME} -d
  13. RewriteRule ^wp-(admin|login|register)(.*) https://%{SERVER_NAME}:10001/wp-$1$2 [L]
  14. RewriteCond %{SERVER_PORT} ^80$
  15. RewriteCond %{REQUEST_FILENAME} !-f
  16. RewriteCond %{REQUEST_FILENAME} !-d
  17. RewriteRule . /index.php [L]
  18. </IfModule>

要約

この方法は、WordPressの固有のセキュリティリスクを修正するものではなく、マンインザミドル攻撃やセキュア接続を損なう他のリスクから保護するものでもありません。

しかし、これにより、悪意のある人物がクッキーや認証ヘッダーを盗んであなたを偽装し、wp-adminにアクセスすることが非常に困難になるはずです。また、コンテンツを盗聴する能力を隠すこともでき、これは厳格な保護が必要な文書のドラフトを持つ法的ブログにとって重要かもしれません。

検証

著者のサーバーでは、ログはGETおよびPOSTリクエストがSSLを介して行われており、非セキュアホストのwp-adminへのすべてのトラフィックがセキュアホストにシャトルされていることを示しています。

サンプルPOSTログ行:

  1. [Thu Apr 28 09:34:33 2005]
  2. Subsequent (No.5) HTTPS request received for child 6 (server foo.com:443)
  3. xx.xxx.xxx.xxx - - [28/Apr/2005:09:34:33 -0500] "POST /wp-admin/post.php HTTP/1.1" 302 - "https://foo.com/wp-admin/post.php?action=edit&post=71" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"

パケットスニファーやハードコアなネットワーク分析ツールを使用して、さらなるテストを行うことで確認できます。

制限事項

著者は(確認していませんが)ユーザーがクッキーを保存している場合やブラウザにパスワードを記憶させている場合(フォームフィールドに基づくのではなく、特定の外部認証メカニズムを使用している場合)に、https://www.example.com/wp-admin/にアクセスすると、パケットがクリアで送信され、クッキー/認証ヘッダーが傍受される可能性があると仮定しています。したがって、最大のセキュリティを確保するために、ユーザーは明示的にhttpsホストを使用するか、新しいセッションの開始時に常にログインする必要があります。

変更履歴