액세스 로그
액세스 로그 (Access Logs)
이 주제에서는 액세스 로그의 구성과 사용법을 설명해요. Consul은 사이드카 프록시와 게이트웨이를 포함해 서비스 메시의 프록시를 통과하는 애플리케이션 연결과 요청을 기록하는 액세스 로그를 생성할 수 있어요.
출처: 문서
본문
이 주제에서는 액세스 로그의 구성과 사용법을 설명합니다. Consul은 사이드카 프록시와 게이트웨이를 포함해 서비스 메시의 프록시를 통과하는 애플리케이션 연결과 요청을 기록하는 액세스 로그를 생성할 수 있습니다. 액세스 로그의 애플리케이션 트래픽 기록을 사용해 다음 작업을 수행할 수 있습니다.
- 문제 진단 및 해결: 운영자와 애플리케이션 소유자는 실패한 연결과 요청을 분석하여 서비스 메시 또는 애플리케이션의 구성 문제를 식별할 수 있습니다.
- 위협 탐지: 운영자는 서비스 메시에 대한 무단 액세스 시도와 그 출처에 대한 세부 정보를 검토할 수 있습니다.
- 감사 컴플라이언스: 운영자는 게이트웨이를 통해 서비스 메시에 들어오고 나가는 트래픽에 대한 보안 컴플라이언스 요구 사항에 액세스 로그를 사용할 수 있습니다.
Consul은 consul connect envoy CLI 명령과 consul-dataplane을 통해 시작된 Envoy 프록시를 통한 액세스 로그 캡처를 지원합니다. 다른 프록시는 지원되지 않습니다. 또한 OpenTelemetry Envoy 확장을 구성하여 액세스 로그를 캡처하고 스트리밍할 수 있습니다.
액세스 로그 활성화
액세스 로그 구성은 proxy-defaults 구성 항목에 전역으로 정의됩니다.
다음 예시는 액세스 로그를 활성화하기 위한 최소 구성입니다.
Kind = "proxy-defaults"
Name = "global"
AccessLogs {
Enabled = true
}
동작이 활성화되면 사이드카와 게이트웨이를 포함한 모든 프록시가 액세스 로그를 생성합니다. 프록시를 통한 인바운드 및 아웃바운드 트래픽이 모두 기록되며, Envoy의 관리 인터페이스에 직접 한 요청도 포함됩니다.
Envoy 프록시가 시작된 후 액세스 로그를 활성화하면 프록시를 다시 시작할 때까지 관리 인터페이스에 대한 액세스 로그는 캡처되지 않습니다.
기본 로그 형식
추가 사용자 지정이 제공되지 않으면 액세스 로그는 다음 형식을 사용합니다.
보안 경고: 다음 로그 형식은 규제 환경에 따라 데이터 컴플라이언스 문제가 될 수 있는 IP 주소를 포함합니다. 운영자는 민감하거나 개인 식별 가능한 정보가 유출되지 않도록 선택한 액세스 로그 형식을 신중히 검사해야 합니다.
{
"start_time": "%START_TIME%",
"route_name": "%ROUTE_NAME%",
"method": "%REQ(:METHOD)%",
"path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
"protocol": "%PROTOCOL%",
"response_code": "%RESPONSE_CODE%",
"response_flags": "%RESPONSE_FLAGS%",
"response_code_details": "%RESPONSE_CODE_DETAILS%",
"connection_termination_details": "%CONNECTION_TERMINATION_DETAILS%",
"bytes_received": "%BYTES_RECEIVED%",
"bytes_sent": "%BYTES_SENT%",
"duration": "%DURATION%",
"upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
"x_forwarded_for": "%REQ(X-FORWARDED-FOR)%",
"user_agent": "%REQ(USER-AGENT)%",
"request_id": "%REQ(X-REQUEST-ID)%",
"authority": "%REQ(:AUTHORITY)%",
"upstream_host": "%UPSTREAM_HOST%",
"upstream_cluster": "%UPSTREAM_CLUSTER%",
"upstream_local_address": "%UPSTREAM_LOCAL_ADDRESS%",
"downstream_local_address": "%DOWNSTREAM_LOCAL_ADDRESS%",
"downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
"requested_server_name": "%REQUESTED_SERVER_NAME%",
"upstream_transport_failure_reason": "%UPSTREAM_TRANSPORT_FAILURE_REASON%"
}
TCP 또는 HTTP 같은 연결 유형에 따라 이러한 필드 중 일부는 비어 있을 수 있습니다.
사용자 지정 로그 형식
Envoy는 애플리케이션 트래픽에 대한 정보를 노출하기 위해 command operators를 사용합니다. 이러한 필드를 사용해 프록시가 생성하는 액세스 로그를 사용자 지정할 수 있습니다.
사용자 지정 로그는 JSON 형식 또는 텍스트 형식일 수 있습니다.
JSON 형식
애플리케이션 모니터링 플랫폼(APM)으로 구문 분석할 수 있도록 액세스 로그를 JSON으로 형식화할 수 있습니다.
사용자 지정 액세스 로그를 사용하려면 proxy-defaults 구성 항목에서 JSONFormat을 원하는 JSON의 문자열 표현으로 설정하세요.
중첩이 지원됩니다.
Kind = "proxy-defaults"
Name = "global"
AccessLogs {
Enabled = true
JSONFormat = <<EOF
{
"myCustomKey" : {
"myStartTime" : "%START_TIME%",
"myProtocol" : "%PROTOCOL%"
}
}
EOF
}
텍스트 형식
일반 텍스트로 형식화된 사용자 지정 액세스 로그를 사용하려면 proxy-defaults 구성 항목에서 TextFormat을 원하는 사용자 지정 문자열로 설정하세요.
출력에서 각 액세스 로그가 자체 줄에 유지되도록 로그 끝에 새 줄이 자동으로 추가됩니다.
Kind = "proxy-defaults"
Name = "global"
AccessLogs {
Enabled = true
TextFormat = "MY START TIME: %START_TIME%, THIS CONNECTIONS PROTOCOL IS %PROTOCOL%"
}
Kubernetes
정상적인 운영의 일부로 consul-dataplane, envoy 또는 envoy-sidecar 컨테이너의 Envoy 디버깅 로그는 stderr에 기록됩니다. 액세스 로그 Type은 활성화되면 액세스 로그에 대해 기본적으로 stdout으로 설정됩니다. 로그 집계 솔루션을 사용해 머신이 읽을 수 있는 액세스 로그를 Envoy 프로세스 디버그 로그와 분리하세요.
파일에 쓰기
Consul이 Envoy가 실행되는 호스트의 파일에 액세스 로그를 쓰도록 구성할 수 있습니다.
Envoy는 로그 파일을 회전(rotate)하지 않습니다. 파일에 쓸 때 logrotate 같은 로그 회전 솔루션이 액세스 로그가 호스트의 디스크 공간을 너무 많이 소비하는 것을 방지할 수 있습니다.
Kind = "proxy-defaults"
Name = "global"
AccessLogs {
Enabled = true
Type = "file"
Path = "/var/log/envoy/access-logs.txt"
}