요청 로깅 사용

보안 정책 이름, 일치 규칙 우선순위, 관련 작업, 관련 정보에 대한 Google Cloud Armor 요청별 로그는 외부 애플리케이션 부하 분산기 및 외부 프록시 네트워크 부하 분산기에 대한 로깅의 일부로 로깅됩니다. 새 백엔드 서비스 로깅은 기본적으로 중지되어 있으므로 Google Cloud Armor의 전체 로깅 정보를 기록하려면 로깅을 사용 설정해야 합니다.

Google Cloud Armor 로그는 Cloud Load Balancing 로그의 일부입니다. 즉, Google Cloud Armor 로그 생성에는 사용자의 부하 분산기에 대해 구성된 로그 샘플링 레이트가 적용됩니다. 부하 분산기의 샘플링 레이트를 줄이면 Google Cloud Armor 요청 로그가 줄어든 레이트로 샘플링됩니다. 또한 프로젝트 간 서비스 참조를 사용하는 경우 부하 분산기의 프런트엔드 및 URL 맵이 포함된 호스트 또는 서비스 프로젝트 아래에 로그가 생성됩니다. 따라서 프런트엔드 프로젝트의 관리자는 백엔드 프로젝트의 관리자에게 로그와 측정항목을 읽을 수 있는 권한을 부여하는 것이 좋습니다.

로깅을 사용하면 Google Cloud Armor 보안 정책으로 평가된 모든 요청과 결과 또는 수행된 작업을 볼 수 있습니다. 예를 들어 거부된 요청을 보려면 jsonPayload.enforcedSecurityPolicy.outcome="DENY" 또는 jsonPayload.statusDetails="denied_by_security_policy"와 같은 필터를 사용하면 됩니다.

외부 애플리케이션 부하 분산기에 로깅을 사용 설정하려면 외부 애플리케이션 부하 분산기 로깅 및 모니터링을 참조하세요. 외부 프록시 네트워크 부하 분산기의 경우 이전 외부 애플리케이션 부하 분산기 로깅 및 모니터링 페이지에 나열된 Google Cloud CLI 명령어를 사용할 수 있습니다. Google Cloud 콘솔을 사용해서는 외부 프록시 네트워크 부하 분산기에 로깅을 사용 설정할 수 없습니다.

또한 보안 정책 및 규칙이 의도한 대로 작동하는지 평가하는 데 도움이 되는 여러 로깅 수준을 설정할 수 있습니다. 자세한 내용은 상세 로깅을 참조하세요.

보안 정책 로그 항목

로그 탐색기의 다음 로그 항목은 Google Cloud Armor 보안 정책 및 규칙 로깅에 대한 것입니다. 항목에는 jsonPayload의 다음 구조가 포함됩니다. HTTP 요청 세부정보는 httpRequest 메시지에 표시됩니다.

  • statusDetails(문자열): 응답 코드의 텍스트 설명
    • redirected_by_security_policy: 요청이 GOOGLE_RECAPTCHA 또는 EXTERNAL_302 리디렉션 규칙에 의해 리디렉션되었습니다.
    • denied_by_security_policy: 요청이 Google Cloud Armor 보안 정책으로 인해 부하 분산기에 의해 거부되었습니다.
    • body_denied_by_security_policy: Google Cloud Armor 보안 정책으로 인해 부하 분산기에서 요청 본문이 거부되었습니다.
  • enforcedSecurityPolicy: 적용된 보안 정책 규칙
    • name(문자열): 보안 정책 이름
    • priority(숫자): 보안 정책에서 일치하는 규칙의 우선순위
    • adaptiveProtection: 해당되는 경우 자동으로 배포된 Adaptive Protection 규칙에 대한 정보입니다.
      • autoDeployAlertId: Adaptive Protection에서 감지한 이벤트의 알림 ID입니다.
    • configuredAction(문자열): 일치하는 규칙의 구성된 작업 이름(예: ALLOW ,DENY ,GOOGLE_RECAPTCHA ,EXTERNAL_302, THROTTLE(제한 규칙의 경우), RATE_BASED_BAN(비율 기반 차단 규칙의 경우))
    • rateLimitAction: 제한 규칙 또는 비율 기반 차단 규칙이 일치할 때 비율 제한 작업에 대한 정보
      • key (문자열): 비율 제한 키 값(최대 32바이트). 키 유형이 ALL이거나, 키 유형이 HTTP-HEADER 또는 HTTP-COOKIE인데 지정된 헤더 또는 쿠키가 요청에 없는 경우 이 필드는 생략됩니다.
      • outcome(문자열): 가능한 값은 다음과 같습니다.
        • 구성된 비율 제한 기준 미만인 경우 "RATE_LIMIT_THRESHOLD_CONFORM"
        • 구성된 비율 제한 기준을 초과하는 경우 "RATE_LIMIT_THRESHOLD_EXCEED"
        • 구성된 차단 기준을 초과하는 경우 "BAN_THRESHOLD_EXCEED"
    • outcome(문자열): 구성된 작업을 실행한 결과(예: ACCEPT, DENY, REDIRECT, EXEMPT)
    • preconfiguredExprIds(문자열): 규칙을 트리거한 모든 사전 구성된 WAF 규칙 표현식의 ID
    • threatIntelligence: 위협 인텔리전스의 일치하는 IP 주소 목록에 대한 정보(해당하는 경우)
      • categories: (문자열) 일치하는 IP 주소 목록 이름
  • previewSecurityPolicy: 요청이 미리보기용으로 구성된 규칙과 일치하면 채워짐(미리보기 규칙이 적용된 규칙보다 우선할 때만 표시됨)
    • name(문자열): 보안 정책 이름
    • priority(숫자): 보안 정책에서 일치하는 규칙의 우선순위
    • configuredAction(문자열): 일치하는 규칙의 구성된 작업 이름(예: ALLOW ,DENY ,GOOGLE_RECAPTCHA ,EXTERNAL_302, THROTTLE(제한 규칙의 경우), RATE_BASED_BAN(비율 기반 차단 규칙의 경우))
    • rateLimitAction: 제한 규칙 또는 비율 기반 차단 규칙이 일치할 때 비율 제한 작업에 대한 정보
      • key (문자열): 비율 제한 키 값(최대 32바이트). 키 유형이 ALL이거나, 키 유형이 HTTP-HEADER 또는 HTTP-COOKIE인데 지정된 헤더 또는 쿠키가 요청에 없는 경우 이 필드는 생략됩니다.
      • outcome(문자열): 가능한 값은 다음과 같습니다.
        • 구성된 비율 제한 기준 미만인 경우 "RATE_LIMIT_THRESHOLD_CONFORM"
        • 구성된 비율 제한 기준을 초과하는 경우 "RATE_LIMIT_THRESHOLD_EXCEED"
        • 구성된 차단 기준을 초과하는 경우 "BAN_THRESHOLD_EXCEED"
    • outcome(문자열): 구성된 실행 결과
    • outcome(문자열): 구성된 작업을 실행한 결과(예: ACCEPT, DENY, REDIRECT, EXEMPT)
    • preconfiguredExprIds(문자열): 규칙을 트리거한 모든 사전 구성된 WAF 규칙 표현식의 ID
    • threatIntelligence: 위협 인텔리전스의 일치하는 IP 주소 목록에 대한 정보(해당하는 경우)
      • categories: (문자열) 일치하는 IP 주소 목록 이름
  • enforcedEdgeSecurityPolicy(미리보기): 적용된 에지 보안 정책 규칙
    • name(문자열): 보안 정책 이름
    • priority(숫자): 보안 정책에서 일치하는 규칙의 우선순위
    • configuredAction(문자열): 일치하는 규칙의 구성된 작업 이름(예: ALLOW, DENY)
    • outcome(문자열): 구성된 작업을 실행한 결과(예: ACCEPT, DENY)
  • previewEdgeSecurityPolicy(미리보기): 요청이 미리보기용으로 구성된 에지 보안 정책 규칙과 일치하는 경우 채워짐(미리보기 규칙이 시행 규칙보다 우선할 때만 표시됨)
    • name(문자열): 보안 정책 이름
    • priority(숫자): 보안 정책에서 일치하는 규칙의 우선순위
    • configuredAction(문자열): 일치하는 규칙의 구성된 작업 이름(예: ALLOW, DENY)
    • outcome(문자열): 구성된 작업을 실행한 결과(예: ACCEPT, DENY)

상세 로깅

사전 구성된 WAF 규칙이 특정 요청으로 인해 트리거된 이유를 파악하기 어려울 수 있습니다. Google Cloud Armor의 기본 이벤트 로그에는 트리거된 규칙과 하위 서명이 포함됩니다. 그러나 문제 해결, 규칙 유효성 검사 또는 규칙 조정을 목적으로 규칙을 트리거한 수신 요청의 세부정보를 식별해야 할 수 있습니다.

--log-level 플래그를 사용하여 정책에 로깅되는 세부정보의 수준을 변경할 수 있습니다. 이 플래그의 값은 NORMAL 또는 VERBOSE일 수 있습니다.

--log-level=[NORMAL | VERBOSE]

예를 들면 다음과 같습니다.

gcloud compute security-policies update ca-policy-1 \
    --log-level=VERBOSE

처음 정책을 만들거나, 정책을 변경하거나, 정책 문제를 해결할 때 상세 로깅을 사용 설정하는 것이 좋습니다.

상세 로깅이 사용 설정된 경우 로깅되는 값

상세 로깅이 사용 설정되면 추가 정보가 Cloud Logging으로 전송되는 부하 분산 요청 로그에 로깅됩니다. 상세 로깅이 사용 설정되면 다음 추가 필드가 요청 로그에 표시됩니다.

  • matchedFieldType(문자열): 일치를 유발하는 필드 유형입니다.

    • ARG_NAMES
    • ARG_VALUES
    • BODY

      • BODY 필드가 로그에 있으면 전체 게시물 본문이 규칙과 일치한다는 의미입니다.
    • COOKIE_VALUES

    • COOKIE_NAMES

    • FILENAME

    • HEADER_VALUES

    • RAW_URI

    • REFERER

    • REQUEST_LINE

    • URI

    • USER_AGENT

    • HEADER_NAMES

    • ARGS_GET

    • X_FILENAME

    • ARG_NAME_COUNT

    • TRANSFER_ENCODING

    • REQUEST_METHOD

  • matchedFieldName(문자열): 이 값이 키-값 쌍의 값 부분과 일치하면 키 값이 이 필드에 저장됩니다. 그렇지 않으면 비어 있습니다.

  • matchedFieldValue(문자열): 일치를 유발하는 필드 부분에 대한 최대 16바이트 프리픽스입니다.

  • matchedFieldLength(정수): 필드의 총 길이입니다.

  • matchedOffset(정수): 일치를 유발하는 필드 내의 시작 오프셋입니다.

  • matchedLength(정수): 일치하는 길이입니다.

예를 들어 SQL 삽입 WAF 규칙이 사용 설정된 프로젝트에 이 요청을 전송할 수 있습니다.

curl http://IP_ADDR/?sql_table=abc%20pg_catalog%20xyz

로그 탐색기의 항목은 다음과 같습니다.

enforcedSecurityPolicy: {
 name: "user-staging-sec-policy"
 priority: 100
 configuredAction: "DENY"
 outcome: "DENY
 preconfiguredExprIds: [
   0: "owasp-crs-v030001-id942140-sqli"
  ]
matchedFieldType: "ARG_VALUES"
matchedFieldName: "sql_table"
matchedFieldValue: "pg_catalog"
matchedFieldLength: 18
matchedOffset: 4
matchedLength: 10
}

상세 로깅이 사용 설정된 경우 개인 정보 보호 유지

상세 로깅을 사용하면 Google Cloud Armor는 사전 구성된 특정 WAF 규칙을 트리거한 수신 요청의 요소 스니펫을 로깅합니다. 이러한 스니펫에는 요청 헤더, 요청 매개변수 또는 POST 본문의 요소가 포함될 수 있습니다. 요청 헤더 또는 본문에 있는 내용과 WAF 규칙을 트리거하는 항목에 따라 수신 요청의 민감한 정보(IP 주소 또는 기타 민감한 정보)가 스니펫에 포함될 수 있습니다.

상세 로깅을 사용 설정하면 Logging의 로그에 잠재적으로 민감한 정보가 누적될 위험이 있습니다. 규칙 생성 및 검증 중에 또는 문제 해결을 위해서만 상세 로깅을 사용 설정하는 것이 좋습니다. 일반 작업 중에는 상세 로깅을 사용 중지된 상태로 두는 것이 좋습니다.

로그 보기

Google Cloud Armor 보안 정책 로그는 Google Cloud Console에서만 볼 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 Google Cloud Armor 정책으로 이동합니다.

    Google Cloud Armor 정책으로 이동

  2. 작업을 클릭합니다.

  3. 로그 보기를 선택합니다.

데이터 로깅 요청

Google Cloud Armor와 함께 사용할 경우 jsonPayload에 다음과 같은 추가 필드가 포함됩니다.

  • securityPolicyRequestData: 최종적으로 일치하는 규칙과 관계없이 보안 정책에 따라 처리 중인 요청과 관련된 데이터
    • recaptchaActionToken: reCAPTCHA Enterprise 작업 토큰과 관련된 데이터
      • score (float): reCAPTCHA Enterprise 작업 토큰에 삽입된 사용자 적법성 점수. reCAPTCHA Enterprise 작업 토큰이 요청에 연결되고 보안 정책 규칙에 따라 성공적으로 디코딩되는 경우에만 표시됩니다. 자세한 내용은 reCAPTCHA Enterprise 평가 시행을 참조하세요.
    • recaptchaSessionToken: reCAPTCHA Enterprise 세션 토큰과 관련된 데이터
      • score (float): reCAPTCHA Enterprise 토큰에 삽입된 사용자 적법성 점수. reCAPTCHA Enterprise 세션 토큰이 요청에 연결되고 보안 정책 규칙에 따라 성공적으로 디코딩되는 경우에만 표시됩니다.
    • tlsJa3Fingerprint: 클라이언트가 HTTPS, HTTP/2, HTTP/3을 사용하여 연결하는 경우 JA3 TTL/SSL 디지털 지문입니다. 디지털 지문을 사용할 수 있고 정책의 표현식이 요청과 일치하는지 여부에 관계없이 요청을 평가하는 보안 정책이 있을 때만 제공됩니다.

로그 예시

다음은 요청을 차단하는 제한 규칙의 로그 세부정보 예시입니다.

jsonPayload: {
 enforcedSecurityPolicy: {
  priority: 100
  name: "sample-prod-policy"
  configuredAction: "THROTTLE"
  outcome: "DENY"
  rateLimitAction: {
    key:"sample-key"
    outcome:"RATE_LIMIT_THRESHOLD_EXCEED"
  }
 }
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:16:48.185763Z"

다음은 요청을 차단하는 비율 기반 차단 규칙의 로그 세부정보 예시입니다.

jsonPayload: {
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 enforcedSecurityPolicy: {
  priority: 150
  name: "sample-prod-policy"
  outcome: "DENY"
  configuredAction: "RATE_BASED_BAN"
  rateLimitAction: {
    key:"sample-key"
    outcome:"BAN_THRESHOLD_EXCEED"
  }
 }
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:27:17.393244Z"

다음 단계

Google Cloud Armor 문제 해결 알아보기