У нас есть сервер 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;
}