¿Es posible truncar $remote_user en un registro de acceso de nginx?

¿Es posible truncar $remote_user en un registro de acceso de nginx?

Tenemos un servidor nginx que, en algunos contextos, recibe datos confidenciales en el campo de nombre de usuario HTTP. Más específicamente, es una clave API que los clientes envían como curl -u "$API_KEY:" ....

El formato predeterminado de nginx access_log incluye $remote_user, que escribe toda la clave API del cliente en el registro de acceso y contamina el archivo con datos confidenciales. Sé que puedo definir un formato de registro diferente que omita por completo la variable $remote_user, sin embargo, puedo ver casos en los que tener al menos una pista sobre quién era el cliente podría ser de gran ayuda para la correlación de registros o la respuesta a incidentes. ¿Hay alguna manera de configurar nginx para almacenar una copia muy truncada de $remote_user en el registro de acceso en lugar del valor completo del cliente? (es decir, ABCDEFGH12345678se convierte ABCD*en algo parecido).

(Tampoco hace falta decir que no quiero arruinar las variables de tipo REMOTE_USER reales en las que se basa el backend de WSGI para la autenticación).

Este es nginx 1.10.3, tal como se incluye en los repositorios predeterminados de Debian Stretch.

Respuesta1

Puede utilizar la directiva map para establecer una variable basada en otra.

No he probado esto, así que no estoy seguro de si Nginx funciona bien con la {,9}parte de mi sintaxis de expresiones regulares, por lo que es posible que tengas que ajustarla ligeramente, pero algo como esto debería darte una variable con los primeros 9 caracteres de la variable usuario_remoto, edita tu registro. formato para incluir la variable truncated_user en su lugar.

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

Respuesta2

La respuesta de @miknik casi funcionó, pero fueron necesarios algunos ajustes y experimentación para que realmente se comportara. La configuración completa que terminé usando es:

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;

        [...]
    }
}

información relacionada