.htaccess の Allow と Deny 〜アクセスの許可と制限〜

ロリポップのサーバーには不正なログインを試みるアクセスと判断された場合に、自動で制限をかける仕組みがあるそうです。

自分自身ではロリポップは借りていないんですが、不正アクセスのためにログインしようとしているとみなされたIPアドレスは自動でアクセス拒否にされる模様。

どうやってアクセス拒否にするかというと .htaccess を書き換えて行うようです。

それが自動で行われるのですが、なんらかの理由でその .htaccess が正しく書き換えられないとアクセスできなくなります。

ただし、一般公開ページを閲覧しようとして403エラー(アクセス拒否)となる場合は、必ずしも.htaccessが原因とは限らないようです。

ロリポップの場合 .htaccess でアクセス制限をかけるのはログインページであって不正アクセス防止のためなので、一般公開ページに制限をかける理由はありません。

先日、ロリポップを借りている方が、管理ページからスタイルシートを編集しようとしたところ、管理画面も一般公開ページもすべて403エラーでアクセスできなくなったそうですが、その時はパーミッションの設定で直ったそうです。

その方はロリポップに問い合わせをしたところ、次の返事が来て設定を修正しました。なぜパーミッションが変更されたのかはわかりませんが、そういうケースもあるようです。

WordPressをインストールされているフォルダのパーミッション(属性)が「770」で設定されており フォルダ内のデータを呼び出すことができない状態でございました。そのため、サイトが403エラーとなっております。

パーミッションの変更は次のページに説明があります。
サイト改ざんへの対策をお願いいたします – ロリポップ!レンタルサーバー

下の表は上記サイトより引用しました。

HTML・画像ファイル 604 rw—-r–
CGIの実行ファイル 700 rwx——
CGIのデータファイル 600 rw——-
.htaccessファイル 604 rw—-r–
ディレクトリ 705 rwx—r-x

.htaccess によるアクセス制限

.htaccess を見て次の通り書きこまれていたら、それがアクセス制限の記述部分です。

Order deny,allow
Deny  from all
Allow from IPADDRESS

赤字の IPADDRESS の部分は 123.456.789.100 のように 4組の数字を .(ドット)で区切って書いてあります。ここに指定されたIPアドレスからのみアクセスが許可され、それ以外は全て拒否されます。

場合によっては Allow from IPADDRESS の行は複数あるかもしれません。その場合、許可されたIPアドレスが複数あるという事です。

Order deny,allow
Deny  from all
Allow from IPADDRESS
Allow from IPADDRESS
Allow from IPADDRESS

そのIPアドレスに自分のアドレスがない場合、アクセスは出来ません。解決するためには、これを自分のIPアドレスに書き換えなければいけません。

でも、自分のIPアドレスがわからない!

自分のIPアドレスがわからなければ、それを指定して書き換えることができません。それでもログインしたい時は、一時的にすべてのIPアドレスからのアクセスを許可する設定をします。

具体的には、次のようにします。

  • Allow from IPADDRESS の次に Allow from all という行を追記する

Allow from all というのは、全てのIPアドレスを許可するという意味です。Allow from IPADDRESS の行が複数ある場合は、その後に追記します。

修正前
Order deny,allow
Deny  from all
Allow from IPADDRESS
修正後
Order deny,allow
Deny  from all
Allow from IPADDRESS
Allow from all

これで、全てのIPアドレスからのアクセスが許可されます。

ただし、ログインページは誰でもアクセスできると危険なので、どうしても緊急にログインしたい場合を除き、許可したIPアドレス以外はアクセスできないように、自分のアドレスを調べて訂正しておきましょう。

コメントアウト

上の書き方ですべてのアクセスを許可しますが、この書き方は無駄があります。それは、Allow from IPADDRESS の次に Allow from all としているため、最初の IPADDRESS は2回許可されているという事になります。言い方を変えると Allow from all には、上の行の IPADDRESS も含むので、上の行は冗長だという事です。

ですから、上の行 Allow from IPADDRESS は消してしまって構いません。

ただ、消してしまって後から困らないか不安!という場合には、消さずに無効にする方法があります。それには次のように、行の最初に半角で # (シャープ)を書き加えます。これをコメントアウトと言います。

Order deny,allow
Deny  from all
#Allow from IPADDRESS
Allow from all

こうすると # の後は行末まで説明書きという意味になり、設定から無視されます。例えば次の場合、赤字の部分は説明で、消しても設定には影響しません。見た時にわかりやすくなるようにつけているだけです。

# BEGIN Lolipop
<Files ~ "wp-login.php">
Order deny,allow
Deny  from all
Allow from 123.456.789.101
</Files>
# END Lolipop

<Files ~ “wp-login.php”> と </Files> の行は後で説明します。

Order deny,allow と Order allow,deny

先程の .htaccess の設定は次の意味です。

Order deny,allow

Order deny,allow
順序として、許可しないアドレスを先に指定して、次に許可するアドレスを指定するという断り(宣言)。
Deny from all
すべてのIPアドレスを許可しない。
Allow from 123.456.789.101
IPアドレスが123.456.789.101の場合だけ、アクセスを許可する。

不許可のアドレスを先に決め、その後に例外として許可するアドレスを1行ずつ列挙します。

例えば、この世にあるIPアドレスが次の10個だけだとします。

  • 123.456.789.101
  • 123.456.789.102
  • 123.456.789.103
  • 123.456.789.104
  • 123.456.789.105
  • 123.456.789.106
  • 123.456.789.107
  • 123.456.789.108
  • 123.456.789.109
  • 123.456.789.110

この中で、123.456.789.101だけを許可したい場合は、まず Order deny,allow で指定する順序を宣言します。これは、不許可が先、許可が後という意味です。

その後 Deny from all で全てのIPアドレスを不許可に指定します。この時点ですべてのIPアドレスからのアクセスが遮断されます。

そして Allow from 123.456.789.101 で、IPアドレスが123.456.789.101のものだけ、特別にアクセスを許可します。

では、この書き方でIPアドレスが123.456.789.110以外の9個のアドレスを許可するにはどう書けばいいでしょうか。次のようにすればOKです。

Order deny,allow
Deny  from all
Allow from 123.456.789.101
Allow from 123.456.789.102
Allow from 123.456.789.103
Allow from 123.456.789.104
Allow from 123.456.789.105
Allow from 123.456.789.106
Allow from 123.456.789.107
Allow from 123.456.789.108
Allow from 123.456.789.109

これで、指定していない123.456.789.110は許可されないので残りの9つのアドレスからはアクセスできます。

IPアドレスがこの世に10個しかない場合は簡単です。では1万個のIPアドレスから9999個を許可して1個だけ拒否するにはどうすればいいでしょう。Allow from IPADDRESS を9999行書けばいいだけなので簡単です。でも、ふざけるなです。

そんな場合は、指定する順序を逆にします。

Order allow,deny

Order allow,deny
順序として、許可するアドレスを先に指定して、次に許可しないアドレスを指定するという断り(宣言)。
Allow from all
すべてのIPアドレスを許可する。
Deny from 123.456.789.101
IPアドレスが123.456.789.110の場合だけ、アクセスを許可しない。

許可するアドレスを先に決め、その後に例外として許可しないアドレスを1行ずつ列挙します。

123.456.789.110以外のアドレスを許可するには次のように書けます。

Order allow,deny
Allow from all
Deny  from 123.456.789.110

この世に存在するIPアドレスが10個しかないのなら、次のどちらでも同じ意味になります。

Order deny,allow
Deny  from all
Allow from 123.456.789.101
Allow from 123.456.789.102
Allow from 123.456.789.103
Allow from 123.456.789.104
Allow from 123.456.789.105
Allow from 123.456.789.106
Allow from 123.456.789.107
Allow from 123.456.789.108
Allow from 123.456.789.109
Order allow,deny
Allow from all
Deny  from 123.456.789.110

指定のページだけアクセス制限をかける方法

ここまでで、IPアドレスを制限する設定は出来ました。ただ、このままだとサイトの全てのページが同じように制限されてしまいます。

一般公開しているページは、誰でも見て構わない。ただ、ログインページだけには制限をかけたい。そういう場合は、次のようにアクセス制限の設定を <Files ~ “FILENAME”></Files> で囲みます。

WordPressのログインページ wp-login.php だけ、制限したい場合は、wp-login.php のあるディレクトリで .htaccess に次のように記述します。

<Files ~ "wp-login.php">
Order deny,allow
Deny  from all
Allow from 123.456.789.100
</Files>

こうすると <Files ~ “wp-login.php“> から </Files> までは、wp-login.php のみに適用されます。

参考までに .htaccess に誰もアクセスできないようにするには下のように書きます。これは . (ドット)で始まるファイルには全てのアクセスを拒否するという意味です。

<Files ~ "^\.">
deny from all
</Files>

“.htaccess の Allow と Deny 〜アクセスの許可と制限〜” への8件の返信

  1. こんばんは✩
    以前アクセス制限された時に.htaccessのIPADDRESSを書き換えたことがあります。
    ロリポップでは書き換えの手順に進む前に、管理画面の中で現在の自分のIPアドレスが表示されます。
    素人に配慮した設定ですよね。

    今回はAllow from allを.htaccessに追記しましたが、英語で察しはつきますけれど、
    あまり意味は理解はしていませんでした。
    .htaccessを書き換えたり追記をするのは、感覚的にどうしても怖いです。
    間違っておかしくなったらどうしようって不安になります。
    だからあまり考えず、ただ間違えないように集中するだけです。

    Tomさんの記事を読んで、やっと意味が理解できました。
    とても説明が分かり易くて勉強になりました。
    ありがとうございます(^O^)

    この記事だけではなく、他の記事もまとまっていて読んでいてためになるし面白いですね。
    個人でこれだけのものを作れるって凄いと思います。

  2. こんにちは✩大事な事を書き忘れてしまいました。
    私の記事に、Tomさんの記事をリンクさせて頂きました。
    もし不都合があったら教えて下さい。
    よろしくお願いします。

    1. Twitterより転載。

      @goo_goo_inali コメントの意味がわかりません。1行目の空行に何か入るのでしょうか?

      @Tom3suteki Files ~ “^\.(wp-login.php)$”みたいな書き方はできるのでしょうか?、みたいなことを書いたら、すこっ〜と消えちゃったんだけど、コメント欄の修正が出来ないの。

      @goo_goo_inali 正規表現は使えるけど、初心者用に書いたものだからあまり詳しくてもね。一番最後にサラっと書いてある。 ファイル名がwp-で始まり.phpで終わるもの全てという正規表現なら “^wp\-.+\.php$”

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です