
일부 상황에서는 HTTP 사용자 이름 필드에서 민감한 데이터를 수신하는 nginx 서버가 있습니다. 보다 구체적으로 말하면 클라이언트가 curl -u "$API_KEY:" ...
.
기본 nginx access_log 형식에는 전체 클라이언트 API 키를 액세스 로그에 기록하고 민감한 데이터로 파일을 오염시키는 $remote_user가 포함됩니다. $remote_user 변수를 완전히 생략하는 다른 log_format을 정의할 수 있다는 것을 알고 있지만 최소한 클라이언트가 누구인지에 대한 힌트가 있으면 로그 상관 관계 또는 사고 대응에 큰 도움이 될 수 있는 경우를 볼 수 있습니다. 클라이언트의 전체 값 대신 액세스 로그에 $remote_user의 심하게 잘린 복사본을 저장하도록 nginx를 구성하는 방법이 있습니까? (즉, 그런 라인을 따라 무언가가 ABCDEFGH12345678
됩니다 .)ABCD*
(또한 WSGI 백엔드가 인증을 위해 의존하는 실제 REMOTE_USER 유형 변수를 망가뜨리고 싶지 않다는 것은 말할 필요도 없습니다.)
이는 기본 Debian Stretch 저장소에 포함된 nginx 1.10.3입니다.
답변1
map 지시문을 사용하여 다른 변수를 기반으로 한 변수를 설정할 수 있습니다.
나는 이것을 테스트하지 않았기 때문에 Nginx가 {,9}
내 정규식 구문의 일부와 잘 작동하는지 확신할 수 없으므로 약간 조정해야 할 수도 있지만 이와 같은 것은 Remote_user 변수의 처음 9자가 포함된 변수를 제공해야 합니다. 로그를 편집하십시오. 대신 truncated_user 변수를 포함하도록 형식을 지정하세요.
map $remote_user $truncated_user {
~* ^(.{,9}).* $1;
}
답변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;
[...]
}
}