June 2, 2016

nginx で少しトリッキーなアクセス制限

and/or 条件が面倒くさいパターン。nginx で特定ネイティブアプリから来た場合は素通しして、その他は拒否する。ただし特定の IP からのアクセスは Basic 認証で許可する様な謎要件。

つまりはこう言うこと。

  • 特定ネイティブクライアント:
    • どこから接続に来ても OK
  • 特定 IP からのアクセス:
    • 特定ネイティブクライアントだったら素通し
    • その他(ブラウザとか)だったら basic 認証出す
  • その他:
    • 有無を言わさず拒否
server {
  # ~~~ snip ~~~

  # Access check
  set $invalid_access 1;
  set $need_auth_basic "Restricted";

  ## allow IPs
  if ($remote_addr = "XXX.XXXX.XXX.XXX") {
    set $invalid_access 0;
    set $need_auth_basic "Restricted";
  }

  ## Native Client app
  if ($http_user_agent ~* (ownCloud-iOS|ownCloud-android|mirall) ) {
    set $invalid_access 0;
    set $need_auth_basic off;
  }

  if ($invalid_access) {
    return 403;
  }

  # ~~~ snip ~~~

  location / {
    # auth
    auth_basic $need_auth_basic;
    auth_basic_user_file /etc/nginx/.htpasswd;

    # ~~~ snip ~~~

  }

}

この例では $remote_addr$http_user_agent で制御している。偽装は難しくないだろうから気休め程度の抑止力。

とは言え nginx は割とこういった事が直感的に実装できて良い。

© Kazuhisa Hara 2014-2022