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

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

 

スポンサー リンク

 

 
 
 
 
 
1. リバースプロキシ環境と目的
 
nginx でのリバースプロキシ - nginx でのバックエンドサーバー。
Webサーバーのアプリは WordPress。

リバースプロキシ環境
 
目的。
リバースプロキシ配下にあるWebサーバーをバージョンアップする時、
WordPressのインストールやデータベースの移行でDuplicatorを使用する等、暫くの間だが【WordPressの管理画面だけへのアクセス中】状態が『本番環境』で発生する。
 
そこでセキュリティ面から、
WordPressの管理画面へのアクセスを、
〇 ローカルアドレスのクライアントみ許可し、
✖ その他外部からのアクセスを遮断したい。
 
 
①.リバースプロキシから、バックエンドのWebサーバーに、クライアントの IPアドレスを渡し、
②.渡された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;
 
黄色部分には、リバースプロキシの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の管理画面にアクセス出来た。
 
外部のアドレスからのアクセスすると、「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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください