Webサーバー サイトの運用
nginx - nginx リバースプロキシ環境
WordPressの管理画面へのアクセスをIPアドレスで制限
nginx - nginx リバースプロキシ環境
WordPressの管理画面へのアクセスをIPアドレスで制限
バックエンドのWebサーバーで、アクセスされたクライアントの IPアドレスを取得し、WordPressの管理画面へのアクセスをIPアドレスで制限する方法。
以下、リバースプロキシ環境下のWebサーバーで、【クライアントの IPアドレス】による【アクセス制限】を実装した記録。
スポンサー リンク
目 次
1. リバースプロキシ環境と目的
目的。
リバースプロキシ配下にあるWebサーバーをバージョンアップする時、
WordPressのインストールやデータベースの移行でDuplicatorを使用する等、暫くの間だが【WordPressの管理画面だけへのアクセス中】状態が『本番環境』で発生する。
WordPressのインストールやデータベースの移行でDuplicatorを使用する等、暫くの間だが【WordPressの管理画面だけへのアクセス中】状態が『本番環境』で発生する。
そこでセキュリティ面から、
WordPressの管理画面へのアクセスを、
〇 ローカルアドレスのクライアントみ許可し、
✖ その他外部からのアクセスを遮断したい。
WordPressの管理画面へのアクセスを、
〇 ローカルアドレスのクライアントみ許可し、
✖ その他外部からのアクセスを遮断したい。
①.リバースプロキシから、バックエンドのWebサーバーに、クライアントの IPアドレスを渡し、
②.渡されたIPアドレスで、WordPressの管理画面へのアクセスを制限する。
②.渡されたIPアドレスで、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;
set_real_ip_from 192.168.11.104;
real_ip_header X-Forwarded-For;
黄色部分には、リバースプロキシのIPアドレスを設定する。
4. WordPressへのアクセスをIPアドレスで制限する設定
バックエンドのWebサーバーの【 /conf.d/xxxxx.conf】での記述。
location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
allow 192.168.11.0/24;
deny all;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
実際にテストしてみると、「ルーターのIPアドレス」を指定しているため、ローカルのPC全てで、WordPressの管理画面にアクセス出来た。
失敗事例-1
「location」ステートメントでの【プレフィックス URIのパス】の記述ミス。
失敗事例-2
【wp-admn】への許可設定が上手く出来ておらず、「javascriptの「/wp-admin/load-styles.php」が読み込めていない」。
5. JavaScriptでIPアドレスを表示する方法
バックエンドのWebサーバーに渡る、【クライアントのIPアドレス】が分からず試行錯誤した。この対策として、Webサーバーに「IPアドレスを表示する」HTMLを埋め込んで、実際に渡ってくるIPアドレスを確認してみた。
参考にさせて頂いたサイト:JavaScriptで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アドレスではなく、ルーターのIPアドレスが表示された。
この結果、同じルーター内の全てのPCからのアクセスを許可することになり、便利なのか・不便なのか迷う。
この結果、同じルーター内の全ての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)
(2020.08.17)
スポンサー リンク