LoginSignup
0
0

NginxでUser-Agentによる条件分岐を用いたアクセス制御を実装する

Posted at

概要

  • 特定のUser-Agentを含むリクエストだったら無条件でアクセスを許可する
  • それ以外はBasic認証をかける

上記の要件が提示されたので、Nginxで設定してみた。

注意点

なお、そもそもNginxにおけるlocationコンテキスト内でのifディレクティブの利用は非推奨とされているので注意
(予期せぬ動作が起きるなど、意図通りに制御できない場合が多い)
https://mogile.web.fc2.com/nginx_wiki/start/topics/depth/ifisevil/

今回の環境は短期利用の想定であること、かつ検証用であることから許容している。

実装例

        location / {
                set $target_ua 0;
                if ($http_user_agent = "<TARGET-USER-AGENT>"){
                        set $target_ua 1;
                }


                if ($target_ua = 1){
                        set $auth_basic off; #対象のUAならBASIC認証オフ
                }
                if ($target_ua = 0){
                        set $auth_basic "Restricted"; #それ以外ならBASIC認証有効化
                }

                auth_basic $auth_basic;
                auth_basic_user_file /etc/nginx/.htpasswd;
        }

結果

User-Agentを含まないリクエストにはBasic認証がかかる。

$ curl -I <URL>
HTTP/2 401 
中略
www-authenticate: Basic realm="Restricted"

対象のUser-Agentを含むリクエストには認証なし。

$ curl -H "User-Agent: <TARGET-USER-AGENT>" -I <URL>
HTTP/2 200 
以下略

対象ではないUser-Agentを含むリクエストにはBasic認証がかかる。

$ curl -H "User-Agent: <UNTARGET-USER-AGENT>" -I <URL>
HTTP/2 401 
中略
www-authenticate: Basic realm="Restricted"

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0