
Temos um servidor nginx que, em alguns contextos, recebe dados confidenciais no campo HTTP nome de usuário. Mais especificamente, é uma chave de API que os clientes enviam como curl -u "$API_KEY:" ...
.
O formato nginx access_log padrão inclui $remote_user, que grava toda a chave da API do cliente no log de acesso e contamina o arquivo com dados confidenciais. Eu sei que posso definir um log_format diferente que omite totalmente a variável $remote_user, no entanto, posso ver casos em que ter pelo menos uma dica sobre quem era o cliente poderia ser extremamente útil para correlação de log ou resposta a incidentes. Existe uma maneira de configurar o nginx para armazenar uma cópia severamente truncada de $remote_user no log de acesso em vez do valor completo do cliente? (ou ABCDEFGH12345678
seja, torna-se ABCD*
ou algo nesse sentido.)
(Também não é preciso dizer que não quero destruir as variáveis reais do tipo REMOTE_USER das quais o back-end WSGI depende para autenticação.)
Este é o nginx 1.10.3, conforme fornecido nos repositórios padrão do Debian Stretch.
Responder1
Você pode usar a diretiva map para definir uma variável com base em outra.
Eu não testei isso, então não tenho certeza se o Nginx funciona bem com a {,9}
parte da minha sintaxe regex, então talvez seja necessário ajustá-lo um pouco, mas algo assim deve fornecer uma variável com os primeiros 9 caracteres da variável remote_user, edite seu log formato para incluir a variável truncated_user.
map $remote_user $truncated_user {
~* ^(.{,9}).* $1;
}
Responder2
A resposta do @miknik quase funcionou, mas foram necessários alguns ajustes e experimentações para que realmente funcionasse. A configuração completa que acabei usando é:
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;
[...]
}
}