Nginxで複数WordPressサイトのreadme.htmlに一気にアクセス制限を掛ける方法

開発

背景

Nginxで運営するWordPressサイトのセキュリティ向上の為、不要なファイルへのアクセスを禁止する必要があった。
今回は本番環境への直接対応だったので、記述ミス等で失敗はできない(テストサイトがあったので、最初はそのサイトで試した)


この記事では、DocumentRoot直下のreadme.htmlへのアクセスを不可にした方法を紹介

困ったこと

nginxでは、.htaccessが使えない

.htaccessとは

apache(nginxのようなWebサーバ)で動いているサーバ上のファイルに、階層を指定してアクセス制限をかける事ができるファイルのこと。

例:/home/yuuki/test 配下の、全てのファイルへのアクセスを禁止したい

/home/yuuki/test/.htaccess を作り、ユーザーが/home/yuuki/test以下のファイルにアクセスしたら403 Forbiddenとなるよう、.htaccessに記述する。
他にも、指定のファイルにアクセスしたら、別のファイルにアクセスを遷移させたり、特定のIPのみアクセスを許可したりすることが可能。

Nginxでのアクセス制御方法

修正するファイルの場所

/home/ユーザー名/wordpress各Name 配下に適用したい場合、以下のファイルを修正する

  • HTTP用 /etc/nginx/conf.d/wordpress各Name_http.conf
  • SSL用 /etc/nginx/conf.d/wordpress各Name_ssl.conf

修正箇所

serverセクションの下に、下記を追記する

ファイル:/etc/nginx/conf.d/wordpress各Name_http.conf

server {
     #readmeアクセス不可
     location ~* /readme.html {
         deny all; 
     }
 }

もしサイトが複数あったら

今回のケースでは100サイト程にアクセス制御する必要があった。
100サイトのconfに手動で書くのはナンセンス。そこで、修正ケースを考えた 。

①全てのサイトに同じ制御を掛ける場合、一つのファイルに書いて対処できないか?

全サイトに適用すると思われる下記ファイルに色々記述してみたけど対応できなかった

  • /etc/nginx/nginx.conf
  • /etc/nginx/nginx.conf.default
  • /etc/nginx/conf.d/_http.conf
  • /etc/nginx/conf.d/_ssl.conf

②一つ一つのconfに、コマンドで追記する

各confが同じ記述かわからないので危険だが、ひとまずテストサイトにコマンドを打ち、OKなら全confに打つ。

今回は②で対処する。sedコマンドを使って、全confに追記する

修正した手順を解説

sedコマンドを使う

全confに対して、sedコマンドを用いてreadme.htmlへのアクセス制御を行う記述を追記する。

①実行したコマンド

167行目下に、アクセス制御の記述を追記する

$ sed -i '167a #readmeアクセス不可\nlocation ~* /readme.html {\ndeny all;\n}' *_ssl.conf

各オプションの意味

  • 167a
    • 167行目下に追記する
  • -i
    • 実行
  • ¥n
    • 改行
  • ~*
    • ホームディレクトリ配下
  • *_ssl.conf
    • ファイル名の末尾が「_ssl.conf」である全てのconfに適用する

②nginxで記述ミスがないか確認する

$ nginx -t
  • ミスなしなら、success free という文字が表示される。
  • ミスありなら、ミスした該当行を表示してくれる。
    • 今回は、数個のconfに記述ミスがあった。167行目ではなく、166行目に追記するべきだったりしたのが理由
      (最終行に追記してしまい、serverセクションの中に記述できずエラーになっていた

③nginxをリロードし、confの変更を適用する

コマンドを打って適用させる

$ nginx -s reload

画面で、各サイトのreadme.htmlを開き403 Forbiddenとなっているか確認

batファイルで全サイトを一辺にブラウザで開き、確認した。レスポンスが403ならOK。
参考:batで全サイトを一気にブラウザ表示する方法

ここはテストコード書いて、目視確認ではなく、自動で対処してもよかったかもしれない。(レスポンスが403ならOKみたいな)
しかし、今回は以下の理由でコードは書かなかった 。

  • 100ファイル程度だったのでコード書くより目視の方がはやい
  • そもそもbatでテストコード書けるのか、また書く方法など調査するのに時間かかる

今後の課題

  • Nginxの基礎を固め、実現可能なことの判断、解決スピードを早めたい
  • テストコードを書いた方が、手動確認よりコスパが高くなれるようにする

↓の本を買うといいことが起きるかもしれない。

この記事を書いた人

元専業アフィリエイター。
2019年にプログラマーに転向し、受託開発企業からキャリアをスタート。
使用言語は主にPHP。SwiftやFlutterにも興味有。

Yuukiをフォローする
開発
Yuukiをフォローする
技術ブログ東京

コメント

タイトルとURLをコピーしました