É possível truncar $remote_user em um log de acesso nginx?

É possível truncar $remote_user em um log de acesso nginx?

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 ABCDEFGH12345678seja, 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;

        [...]
    }
}

informação relacionada