Можно ли обрезать $remote_user в журнале доступа nginx?

Можно ли обрезать $remote_user в журнале доступа nginx?

У нас есть сервер nginx, который в некоторых контекстах получает конфиденциальные данные в поле имени пользователя HTTP. А точнее, это ключ API, который клиенты отправляют как curl -u "$API_KEY:" ....

Формат access_log nginx по умолчанию включает $remote_user, который записывает весь ключ API клиента в журнал доступа и загрязняет файл конфиденциальными данными. Я знаю, что могу определить другой log_format, который полностью исключает переменную $remote_user, однако я вижу случаи, когда наличие хотя бы намека на то, кем был клиент, может быть чрезвычайно полезным для корреляции журналов или реагирования на инциденты. Есть ли способ настроить nginx для хранения сильно урезанной копии $remote_user в журнале доступа вместо полного значения от клиента? (т. е. ABCDEFGH12345678становится ABCD*или что-то в этом роде.)

(Само собой разумеется, что я не хочу портить фактические переменные типа REMOTE_USER, которые бэкэнд WSGI использует для аутентификации.)

Это nginx 1.10.3, поставляемый в репозиториях Debian Stretch по умолчанию.

решение1

Директиву map можно использовать для установки одной переменной на основе другой.

Я не проверял это, поэтому не уверен, хорошо ли Nginx работает с {,9}частью моего синтаксиса регулярных выражений, так что вам, возможно, придется немного его подкорректировать, но что-то вроде этого должно дать вам переменную с первыми 9 символами переменной remote_user, отредактируйте формат вашего журнала, включив вместо этого переменную 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;

        [...]
    }
}

Связанный контент