リバースプロキシ クライアントの IPアドレスと アクセス制限

Webサーバー サイトの運用
nginx - nginx リバースプロキシ
WordPressへのアクセスをIPアドレスで制限
 
①.リバースプロキシから、バックエンドのWebサーバーに、クライアントの IPアドレスを渡す。
②.渡されたIPアドレスで、WordPressの管理画面へのアクセスを制限する。
 
リバースプロキシ環境
 
以下、リバースプロキシ環境下のWebサーバーで、【クライアントの IPアドレス】による【アクセス制限】を実装した記録。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. リバースプロキシ環境と目的
 
リバースプロキシ環境。
nginx - nginx のリバースプロキシ。バックエンドのWebサーバーは WordPress。
リバースプロキシ環境
 
目的。
リバースプロキシ配下にあるWebサーバーをバージョンアップした時、
WordPressを移行する為に、WordPressのインストールやDuplicator等、【管理画面だけへのアクセス中状態】が『本番環境』で発生する。
そこでセキュリティ面から、WordPressの管理画面へのアクセスを、
ローカルアドレスのクライアントみ許可し、
その他外部からのアクセスを遮断する。
 
 
 
2. リバースプロキシからバックエンドにIPアドレスを渡す設定
 
バックエンドのWebサーバーを設定する、【server】ディレクティブでの記述。

 proxy_set_header Host $http_host;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 location / {
  proxy_pass https://192.168.11.106;

 
他にいろんな設定があるようだが・・・よく理解できていない。
  proxy_set_header Host $http_host;
  proxy_set_header Connection "";
  proxy_set_header X-Real-IP $remote_addr;    # x-real-ipにクライアントIPを設定。APIへ渡す。
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    # X-Forwarded-For に直前のProxy(=ELB)を追加
 
 
 
3. バックエンドのWebサーバーでIPアドレスを受取る設定
 
バックエンドのWebサーバーの【 /conf.d/xxxxx.conf】での記述。
 # クライアントのIPアドレスを取得
 set_real_ip_from 192.168.11.104;
 real_ip_header X-Forwarded-For;
 
黄色部分には、リバースプロキシのIPアドレスを設定する。
 
 
 
4. WordPressへのアクセスをIPアドレスで制限する設定
 
バックエンドのWebサーバーの【 /conf.d/xxxxx.conf】での記述。


# # WordPress 管理画面へのアクセス制限 その1
location = /wp-admin {
 allow 192.168.11.1;
 deny all;

 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;

}
# # WordPress 管理画面へのアクセス制限 その2
location = /wp-admn/admin-ajax.php {
 allow all;

 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;

}
# # WordPress 管理画面へのアクセス制限 その3
location = /wp-login.php {
 allow 192.168.11.1;
 deny all;

 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;

}
# # #####

 
※1:黄色の【プレフィックス URIのパス】は、それぞれ個別に記述した。
※2:クライアントのIPアドレスは、実際のアドレスではなく、「ルーターのIPアドレス」を指定。
※3:「Duplicator」の【installer.php】も制限すべきではと思ったが、設定の『  [name]_[hash]_[date]_installer.php (recommended)』で対応することにした。
 
実際にテストしてみると、「ルーターのIPアドレス」を指定しているため、ローカルのPC全てで、WordPressの管理画面にアクセス出来た。
 
外部のアドレスからのアクセスすると、「403 Forbidden」になる。OK!
外部のアドレスであることを確認
 
外部のアドレスからのアクセスは、「403 Forbidden」になる
 
 
失敗事例-1
 
「405 NOT ALLOWED」になる。
「405 NOT ALLOWED」になる
 
「location」ステートメントでの【プレフィックス URIのパス】の記述ミス。
 
 
失敗事例-2
 
WordPressへのログイン画面の、表示が崩れる。
WordPressへのログイン画面の、表示が崩れる
 
【wp-admn】への許可設定が上手く出来ておらず、「javascriptの「/wp-admin/load-styles.php」が読み込めていない」。
 
 
参考:locationディレクティブのプレフィックス。
locationディレクティブのプレフィックス
 
参考:プレフィックスの使い分け。
プレフィックスの使い分け
 
 
 
5. JavaScriptでIPアドレスを表示する方法
 
バックエンドのWebサーバーに渡る、【クライアントのIPアドレス】が分からず試行錯誤した。この対策として、Webサーバーに「IPアドレスを表示する」HTMLを埋め込んで、実際に渡ってくるIPアドレスを確認してみた。
 
 
JavaScriptのコードを記述したHTML。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
	<title>クライアントの IPアドレスを表示</title>
</head>

<body>

<h1>JavaScriptとPHPでIP取得</h1>
<script type="text/javascript" src="./ip-php.php"></script>
<script>
document.write('<P>javascriptでのIP表示:' + IP + '</P>');
</script>

</body>
</html>
PHPのコード
<?php
$IP = $_SERVER['REMOTE_ADDR'];
//スクリプトの出力
echo "document.write('PHPでのIP表示:" . $IP . "');";
echo "var IP = '" . $IP . "';";
?>
 
「IPアドレスを表示する」のHTMLで、表示されたIPアドレス。
「IPアドレスを表示する」HTMLでの、表示結果
 
このように、実際のIPアドレスではなく、ルーターのIPアドレスが表示された。
この結果、同じルーター内の全てのPCからのアクセスを許可することになり、便利なのか・不便なのか迷う。
 
 
 
6. nginx のエラーログを止める
 
余りにも多くのエラーメッセージが出力されるので、エラーログを止める。
#    # WordPress 管理画面へのアクセス制限 その3
        location = /wp-login.php {
                allow 192.168.11.1;
                deny all;

                access_log off;
                error_log off;

                fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;

        }
 
 
参考:
 
以上。
(2020.08.17)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください