Можно ли обрезать $remote_user в журнале доступа nginx?
У нас есть сервер nginx, который в некоторых случаях получает конфиденциальные данные в поле имени пользователя HTTP. В частности, это ключ API, который клиенты отправляют как curl -u "$API_KEY:" ...
,
Стандартный формат nginx access_log включает в себя $ remote_user, который записывает весь ключ API клиента в журнал доступа и портит файл с конфиденциальными данными. Я знаю, что могу определить другой log_format, в котором полностью отсутствует переменная $ remote_user, однако я могу видеть случаи, когда хотя бы подсказка о том, кем был клиент, может быть чрезвычайно полезна для корреляции журнала или ответа на инцидент. Есть ли способ настроить nginx для хранения сильно усеченной копии $ remote_user в журнале доступа вместо полного значения от клиента? (т.е. ABCDEFGH12345678
становится ABCD*
Или что-то вдоль этих линий.)
(Само собой разумеется, что я не хочу разрушать фактические переменные типа REMOTE_USER, на которые сервер WSGI опирается для аутентификации.)
Это nginx 1.10.3, как поставляется в репозиториях Debian Stretch по умолчанию.
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;
[...]
}
}
Вы можете использовать директиву map для установки одной переменной на основе другой.
Я не проверял это, поэтому не уверен, что Nginx хорошо играет с {,9}
Это часть моего синтаксиса регулярных выражений, поэтому вам, возможно, придется немного его скорректировать, но что-то вроде этого должно дать вам переменную с первыми 9 символами переменной remote_user, отредактируйте формат вашего журнала, включив вместо него переменную truncated_user.
map $remote_user $truncated_user {
~* ^(.{,9}).* $1;
}