Nginx - 認証ヘッダーが存在する場合に 404 を返す方法は?

Nginx - 認証ヘッダーが存在する場合に 404 を返す方法は?

インターネット上に、アプリケーションをプロキシする nginx インスタンスがあります。アプリケーションの公開部分はすべて匿名アクセスを許可しているため、アプリケーションへの認証を試みるインターネットからのリクエストに対して 404 を返すようにしたいと思います。ローカル ネットワーク上のユーザーのみが認証できるようにする必要があります。

私は return 404 を使用しているだけなので、単純な if ブロックを使用できると思いますが、認証ヘッダーの存在を検出するための最も信頼性の高い if 条件が何であるかはわかりません。

if (auth headers exist) {
  return 404;
}

これをチェックするために if ブロックに何を入れればよいか、誰か提案はありますか?

答え1

一般的に、if文は推奨されません。少なくとも副作用のいくつかに注意する必要があります。nginx ブログの「If is Evil」詳しく知ることができ。

あなたの質問に答えると、確認したいヘッダーが「Authorization」と呼ばれていると仮定すると、最初の仮定はすでに非常に正確でした。

if ($authorization) {
    return 404;
}

これでもううまくいくはずです。さらに、これをパブリックサーバーブロックにのみ適用したい場合は、ngx_http_アクセスモジュール

答え2

リクエストに Authorization ヘッダーが存在するかどうかを確認できます。これは通常、リクエストの認証に使用されます。これを行うには、if ブロックで $http_authorization 変数を使用します。

if ($http_authorization) {
  return 404;
}

あるいは、アプリケーションが使用する特定の認証ヘッダーの存在を確認することもできます。たとえば、アプリケーションが認証ヘッダーとして X-Auth-Token を使用する場合は、次のように確認できます。

if ($http_x_auth_token) {
  return 404;
}

if ブロックは、リクエストが auth_basic ディレクティブによって保護された場所に対して行われた場合にのみ評価されることに注意してください。すべてのリクエストで認証ヘッダーの存在を確認する場合は、代わりに map ディレクティブを使用できます。

map $http_authorization $block_public_auth {
  default 0;
  "~" 1;
}

server {
  ...

  location / {
    if ($block_public_auth) {
      return 404;
    }

    ...
  }
}

上記は、リクエストの送信先に関係なく、Authorization ヘッダーを持つすべてのリクエストをブロックします。

関連情報