laravel+nginxで特定のディレクトリのみにIPアドレス制限をかける方法


laravelとnginxでwebサーバーを立てている時、特定のディレクトリのみにIPアドレス制限をかけたいことってよくありますよね。
IPアドレス制限はlaravel側で行うこともできますが、laravel+nginxの設定で行う場合の設定例があまり見当たらなかったのでまとめました。

許可したいIPアドレスの数が1個なら、適当なところに

if($_SERVER["REMOTE_ADDR"] !== "xxx.xxx.xxx.xxx"){
   abort(403);
}

とでも書いておけばいいのですが、数が増えるとちょっとめんどくさくなってきます。
もし追加のIPアドレスをサブネット単位で指定されたら。。。

前提となるlaravel+nginxの環境構築

Docker
Nginx
laravel

この記事の前提となるlaravel+nginx+dockerの環境構築は、こちらの@ucan-labさんの神記事が参考になります。

特定のディレクトリのみにIPアドレス制限をかけるlaravel+nginxの設定ファイル

設定に関係ないところは省いてますので、nginxの設定については、上記の神記事を参考にしてください。

nginx.conf

    # 以下の2つがnginxでlaravelを動作させるための基本的な設定です。
    # 全てのリクエストをlaravelのrootであるindex.phpにリダイレクトする
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # .phpファイルをfastcgiで処理する
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # ここからが、本題であるディレクトリIP制限になります。
    # admin/ ディレクトリに制限をかける例
    location /admin/ {
        try_files $uri $uri/ /index.php?$query_string;
        # allow ip list
        allow xxx.xxx.xxx.xxx;
        allow yyy.yyy.yyy.yyy;
        deny all;
    }

設定のポイント

以下のlocation設定だけですと、/admin/以下のファイルをnginxがそのまま表示しようとするので、laravelとして動作しません。

    location /admin/ {
        allow yyy.yyy.yyy.yyy;
        deny all;
    }

なので、location内にindex.phpにリダイレクトする設定をもう一度書いてあげる必要がありました。

try_files $uri $uri/ /index.php?$query_string;

もちろん、サブネット単位での指定も可能です。

allow 192.168.1.0/24;

ただ、アプリケーション全体のセキュリティ設定が複数の箇所に分散することになりますので、/admin/ 以下のコントローラーやroute.phpなどに

/*

IPアドレス制限はnginx側で行ってますよ

*/

とコメントしておくと、将来の自分や引き継いだ後任の人が助かるでしょう。
え?そんなん普通どこでセキュリティ設定しているかわかるだろうって?

甘いね

おわり

以上でlaravelの特定のディレクトリにIPアドレス制限をかけることができました。

合わせて読んでほしいlaravelセキュリティ関連の記事

laravelで連続ログインに失敗したらロックアウトをかけてセキュリティを更に高める方法
https://qiita.com/reopa_sharkun/items/7def0cc0a8647df10ade

この記事が参考になったら
↓ボタンを押して応援してね↓