Назад | Перейти на главную страницу

Можно ли усечь $ 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 по умолчанию.

Ответ @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;

        [...]
    }
}

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

Я не тестировал это, поэтому не уверен, хорошо ли Nginx работает с {,9} часть моего синтаксиса регулярного выражения, поэтому вам, возможно, придется немного его настроить, но что-то вроде этого должно дать вам переменную с первыми 9 символами переменной remote_user, отредактируйте формат журнала, чтобы вместо этого включить переменную truncated_user.

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