nginx アクセス ログで $remote_user を切り捨てることは可能ですか?

nginx アクセス ログで $remote_user を切り捨てることは可能ですか?

状況によっては、HTTP ユーザー名フィールドで機密データを受信する nginx サーバーがあります。具体的には、クライアントが送信する API キーなどですcurl -u "$API_KEY:" ...

デフォルトの nginx access_log 形式には $remote_user が含まれており、クライアント API キー全体がアクセス ログに書き込まれ、ファイルが機密データで汚染されます。$remote_user 変数を完全に省略する別の log_format を定義できることはわかっていますが、クライアントが誰であったかについての少なくともヒントがあると、ログの相関関係やインシデント対応に非常に役立つ場合があります。クライアントからの完全な値ではなく、大幅に切り詰められた $remote_user のコピーをアクセス ログに保存するように nginx を構成する方法はありますか? (つまり、ABCDEFGH12345678becomeABCD*またはそれに似たもの)。

(言うまでもなく、WSGI バックエンドが認証のために依存している実際の REMOTE_USER タイプの変数を破壊したくはありません。)

これは、デフォルトの Debian Stretch リポジトリに同梱されている nginx 1.10.3 です。

答え1

map ディレクティブを使用すると、ある変数を別の変数に基づいて設定できます。

私はこれをテストしていないので、Nginx が{,9}私の正規表現構文の一部をうまく処理できるかどうかはわかりません。そのため、少し調整する必要があるかもしれませんが、次のようなものでは、remote_user 変数の最初の 9 文字を含む変数が提供されるはずです。代わりに、truncated_user 変数を含めるようにログ形式を編集してください。

map $remote_user $truncated_user {
    ~* ^(.{,9}).* $1;
}

答え2

@miknik の回答はほぼうまくいきましたが、実際に動作させるには少し調整と実験が必要でした。最終的に使用した完全な構成は次のとおりです。

http {
    [...]

    map $remote_user $truncated_remote_user {
        "~^(?P<tu>.{0,6}).*" $tu;
        default              -;
    }

    log_format combined_trunc '$remote_addr - $truncated_remote_user [$time_local] '
                              '"$request" $status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent"';

    [...]

    server {
        [...]

        access_log /path/to/access.log combined_trunc;

        [...]
    }
}

関連情報