액세스 로그

액세스 로그 (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" 
}

더 알아보기 (Learn more)