【WordPressセキュリティ】.htaccessによるアクセス制御

1 はじめに

特定のホスト(PC)からのアクセスを制限したり、許可するには、
ApacheというWebサーバーの制御ファイル「.htaccess」というファイルを使います。

WordPressは、ApacheというWebサーバー配下で動作していますから、
Apacheの設定状態を逸脱して動作することはできません。

この「.htaccess」では、
アクセス制御するホスト(PC)のアドレスは、IPアドレス、ないしホスト名で特定します。

近年、Webサーバーとしてnginx(エンジンエックス)を採用する
レンタルサーバーも増えてきました。
nginx(エンジンエックス)であっても、
Apacheと同じく「.htaccess」によってアクセス制御を行います。

本記事では、「.htaccess」ファイル中に、
特定のホスト(PC)からのアクセスを制限したり、許可する記述の仕方について概説します。

レンタルサーバーでもアクセス制御の機能やサービスが用意されているかと思います。
そのレンタルサーバーでのアクセス制御の機能は、
.htaccess」の記述によって実現されているものもあるのです。
レンタルサーバーのサービスでアクセスのを行う際、本記事の内容が参考になればと思います。

最近(2020年前後から)インターネット接続は、
PPPoEによるIPv4接続から、
IPoEによるIPv4 over IPv6接続に切り換えた家庭が増えてきました。

IPv4 over IPv6接続の場合、IPv4アドレスは複数の接続で共有されます。
v6プラスOCNバーチャルコネクトtransixサービスなど
接続サービスによって違ってくるかと思いますが、
一つのIPv4アドレスで数百接続から数万接続を共有するそうです
(見たページが見つからない)。

したがって、DDNSサービスを利用しても、IPv4アドレス直でも自宅PCを特定できません。

PPPoE/IPv4接続の時には可能だったこのファイルをアクセスできるのは、
自宅のPCだけという設定が難しくなりました。
Basic認証を利用すれば、同等のことが可能ですが、
いちいちユーザー名とパスワードを入力しなければならず面倒になりました。

図1-1に、本記事の概要を示します。

図1-1 【WordPressセキュリティ対策】アクセス制御

2 .htaccess

2.1 .htaceessとは

.htaccessとは、ApacheというWebサーバーの動作を制御するための設定ファイルです。

WordPressは、このApacheというWebサーバーで動作しています。
したがって、
.htaccessで設定したものはWordPressの動作にそのまま反映されることになります。

.htaccessでは、次のような設定をすることができます。

・ 特定のホスト(IPアドレス、プロバイダ)からの
特定のファイルやディレクトリのアクセスを禁止する
HTTP 404(Not Found:未検出)エラーページをカスタマイズする

他にもいろいろありますが、
本記事では、WordPressのセキュリティ設定に関係の無い項目は省きます。

.htaccessは設置しなくともWebサイトは問題なく動作しますが、
セキュリティやパフォーマンスの観点から導入されることが望まれます。

なお、レンタルサーバーによっては.htaccessの利用を禁止している場合や、
設定できない項目もありますので、
利用できるかどうかは公式ヘルプページでご確認ください。

.htaccessの詳細な情報については、
Apacheの公式ドキュメントをご覧いただくようお願いいたします。

Apacheチュートリアル: .htaccessファイル

2.2 .htaccessのルール

.htaccessの書き方には、ルールがあります。

ルールに違反すると、“500 internal server error”が発生します。
500 internal server error”が発生すると、
下図に示すような画面が表示されWebページが表示されなくなります。

そのため、.htaccessを設置する場合は十分な動作確認を行なう必要があります。

ローカルなPC上にレンタルサーバーと同様の環境を再現して、
その中でテストすることができます。

Windowsでは、
XAMPP(ザンプ)というツールで、ローカルPC内にサーバー環境を作ることができます。

XAMPP Apache + MariaDB + PHP + Perl

2.3 ファイル名

.htaccessのファイル名は、そのまま".htaccess"になります。

先頭に . (period)がついていることに注意して下さい。
先頭に . がつくファイルは、UNIX系のOSでは隠しファイルを意味しています。
ファイル名がない拡張子だけのファイルという意味ではありません。

Windowsでは初期設定で拡張子の表示が省略されているため、
ファイル名が気付かずに ".htaccess.txt"となっている場合があります。
".htaccess.txt"では、サーバーが正しく認識できないため動作しません。

また、拡張子が自動で付与されて ".htaccess" というファイル名が作成できない場合は、
".htaccess.txt"のファイル名で一旦作成し、
アップロード後にWebサーバー上で".htaccess"にリネームします。

2.4 コメントアウト

.htaccessでは、#から始まる行はコメントとして扱われます。

行の途中でもコメントをつけることが可能ですが、
Apacheのバージョンや、記述場所によってはエラーになるため、
基本的にコメント行は独立させた方が良いでしょう。

2.5 文字コードと改行

.htaccessの文字コードはUTF-8(BOM無し)
改行コードはLFを設定し、
ファイルの最終行には空行を入れる必要があります。

ただし.htaccessが日本語などの全角文字を含まず半角英数字だけである場合は、
文字コードはShift-JISEUC-JPなどでも問題ありません
(ASCII文字ばかりなので、文字コード体系を区別できる文字が1つも無い)。

文字コードや、改行コードが誤っている場合は、“500 internal server error”が発生します。

2.6 .htaccessアップロードと有効範囲

.htaccessをWebサーバーへ転送する際は、アスキーモードで転送します。
転送後は.htaccessのパーミッションを、"644(rw-r--r--)"に設定します。
ただし、共有サーバーでは、"604(rw----r--)"の場合もあります。

.htaccessの設定は、配置したディレクトリ以下に対して有効になります。
Webサイト全体に対して設定を有効にしたい場合は、ルートディレクトリに配置します。

階層別に分けて配置した場合、より深い階層に配置した.htaccessの設定が優先されます。

2.7 正規表現

.htaccessでは、正規表現による指定が可能です。

正規表現とは、いくつかの文字列を1つの形式で表現する記述方法です。
例えば、index1.htmlindex2.htmlがある場合、以下の正規表現で表すことができます。

 "("、")"で囲んだ部分は1つのグループとなり、
 複数の文字を1つの単位として扱うことができます。

"|"はOR条件を表すため、
正規表現の意味としては"index"に続く文字が "1" または "2" となります。

このように、正規表現を使用すればファイル名などを柔軟に指定することが可能です。

2.8 正規表現が使用できるディレクティブ

.htaccessでは正規表現が使用できますが、
すべてのディレクティブで正規表現が使用できるわけではありません。

使用できるディレクティブは、
"Match"という単語が名前に含まれているディレクティブ(例えばFilesMatchなど)や、
RewriteRuleディレクティブ、RewriteCondディレクティブでは正規表現が使用できます。

3 .htaccessによるアクセス制御

3.1 特定のホスト(IPアドレス、プロバイダ)からのアクセス制限

3.1.1 特定のホストからのアクセス拒否

アクセスを拒否したいホストのIPアドレスが「123.45.67.89」ならば、 書き方は次のようになります。

allowは「許可する」、denyは「否定する」です。

特定のホストからのアクセスを拒否する(それ以外はOKとする)場合、
order allow,deny」とした上で、
一旦「allow from all(全てのアクセスを許可する)」とし、
拒否するIPアドレスなどを列挙します。

一行目の「order allow,deny」は、
先にallowを指定して、
次にdenyを指定するというアクセス制御の評価順序を指定するためのものです。

ただし、IPアドレスは接続のたびに変わることが多いので、
ある時は「123.45.67.89」でも、 また別の時には「123.45.87.69」かもしれません。

ですが、仮に「123.45」の部分は変わらないとすれば、下に示すように書くこともできます。

あるプロバイダー・ISPからのアクセスを全面禁止したいような場合は、
プロバイダ-・ISPが利用しているIP帯(CIDR: サイダー)を知らなくてはなりません。

プロバイダー・ISPが利用しているIP帯(CIDR)を検索する手順は、
次のページの記事が参考になるでしょう。

プロバイダ・ISPが利用しているIP帯(CIDR)の検索手順

実際には、日本国内からのアクセスよりも、
悪意を持った外国からのアクセスを禁止にしたい場合が多くなるかと思います。
IPアドレスをキーに"Whois"サービスでアクセス元を特定し、
IP帯(CIDR)情報を得るようにします。

なお、ホスト名がわかっている場合、
たとえば「example.com」のホストからのアクセスを拒否したい場合には、
次のように書くこともできます。

3.1.2 特定のホストからのアクセスのみ許可

特定のホストからの接続のみを許可する場合には、次のように書きます。

order deny,allow」と「deny」と「allow」の順番が、
3.1.1項の場合と逆になったことに注目してください。

もちろん、IPアドレスではなく、
ホスト名もしくはその一部(プロバイダー名やそのアクセスポイントなどが記されています)を
指定することも可能です。

一般家庭のインターネット接続環境では、
グローバルIPアドレスは固定されていませんから、
IPアドレス、またはホスト名を設定できないのでは?と思われるかもしれません。

自宅のインターネット回線のグローバルIPアドレスが可変の場合には、
DDNSサービスで固定のホスト名を取得し、それを設定するようにすると良いでしょう。

これで、レンタルサーバー下の特定のファイルをアクセスできるのは
自宅PCからだけという設定が可能になります。

図3.1-1に示すクセス許可ホストの指定は、
DDNSサービスを利用すれば、図3.1-2に示すように固定のホスト名で 指定できるようになるということです。

図3.1-1 IPアドレスによるアクセス許可ホストの設定

図3.1-2 ホスト名アクセス許可ホストの設定

ただし、IPoEによるIPv4 over IPv6接続では、この手法は使えません。

最近(2020年前後から)インターネット接続は、
PPPoEによるIPv4接続からIPoEによるIPv4 over IPv6接続に切り換えた家庭が増えてきました。
v6プラスOCNバーチャルコネクトtransixサービスなど
接続サービスによって違ってくるかと思いますが、
一つの、IPv4アドレスで数百接続から数万接続を共有するのだそうです。

したがって、DDNSサービスを利用しても、IPv4アドレス直でも自宅PCを特定できません。

# まー、近隣の接続からのアクセスも許すという覚悟があれば、利用可能ですが。。。
# 精神的に、よろしくないのではと。。。
#
# 実際、日本国内よりも、海外からの不正アクセスが多いのですから。。。
# これは、なんとしても防がなければならない。

3.2 Basic認証

Basic認証とは、ページアクセス時に図3.2-1のようなダイアログが表示され、
IDとパスワードを正しく入力しない限り、コンテンツにアクセスできないようにする仕組みです。

これは、.htaccessによって実現されます。

レンタルサーバー(共有サーバー)の場合は、
Basic認証のサービスが用意されていると思いますので、
そちらで設定するようにしてください。

本記事では、Basic認証の方法を簡単に説明するだけに止めます。

.htaccessファイルには下記のように書きます。

1行目には、IDとパスワードの組が入ったテキストファイル
.htpasswd。ファイル名はこれでなくても構いませんが、慣用的にこのファイル名を使っています)
のフルパスを指定します。

相対パスによる指定では駄目です。
.htpasswdのファイルは、DocumentRootより上に設置した方が良いでしょう。
また、パーミッションは604のようにしておきます
(例:/home/hogehoge/public_html/DocumentRootなら、/home/hogehoge/に設置します)。

2行目の「AuthGroupFile /dev/null」は、グループごとにアクセスを許可する場合に用います。
/dev/null」ということはそのようなファイルは存在しないという意味になります。
つまり、グループごとでのアクセス制限はしないという意味になります。

.htaccessの中の3行目にある「AuthName "Please enter your ID and password"」によって、
ダイアログに表示される文章を指定できます。

日本語の指定も可能ですが、
この場合、.htaccessを保存する際に、文字コードに注意してください。

AuthName」に日本語を使うと、
特定の環境(ブラウザなど)を使っているユーザーが思わぬ問題に合うかもしれないので、
日本語を使わないほうが無難かもしれません。

AuthType」には「Basic」と「Digest」の2種類があります。
後者の場合、よりセキュリティは高いのですが、
対応していないブラウザもあって利用者が限られた環境のような場合を除き、
利用には問題があります。

以上

本文中の記述に、誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ