NGINX App Protect WAF Security Log

NGINX App Protect WAF Security Log 에 대해 알아보세요.

목차

1. NGINX App Protect WAF Security Log 개요
2. nginx.conf 지시문
3. NGINX App Protect WAF Security Log 설정 파일
4. Syslog 전송
5. 초기 설정 파일
6. 유효한 Security Log 속성
7. 차단 관찰 가능성

1. NGINX App Protect WAF Security Log 개요

Security logs(Request logs 혹은 Traffic logs로도 칭하는)는 HTTP 요청/응답, NGINX App Protect WAF가 이를 처리하는 방법, 그리고 구성된 정책 매개변수에 따라 수행된 최종 결정에 대한 정보를 포함합니다. 정책 설정은 Security log 에 포함될 정보를 정의하며, 여기에는 위반, 공격 서명, 기타 기준에 따라 요청이 통과, 차단 또는 경고되는지 여부가 포함됩니다.

NGINX App Protect WAF는 NGINX의 기본 로깅 메커니즘인 access 로깅 메커니즘 대신, 자체 로깅 메커니즘을 사용해 요청 로깅을 수행합니다.

Security log에는 다음과 같은 속성이 있습니다.

  • 로그 설정 : security_log.json 파일을 참조하는 app_protect_security_log 지시문
  • 설정 컨텍스트 : nginx.conf: httpserverlocation
  • 파일 목적지 : 파일의 목적지를 stderr, 로컬 파일의 절대경로, syslog, 혹은 Netcat과 pipe를 사용하여 로그를 리다이렉트 할 수 있습니다.
nc -vv -l “[ip]” “[port]” > “[name_of_file]” 2>&1
  • Syslog 목적지

2. nginx.conf 지시문

app_protect_security_log_enable

이 지시문은 해당 컨텍스트에서  security logging의 활성화 여부를 설정합니다.

Security log 속성은 app_protect_security_log 지시문에 의해 결정됩니다. 이 지시문은 httpserverlocation 컨텍스트에서 사용할 수 있습니다. 컨텍스트에 지시문이 존재하지 않을 경우, 상위 컨텍스트에서 상속됩니다: locationserverserver는 http로부터 상속받습니다. 이러한 컨텍스트 중 어느 곳에도 지시문이 없으면, 해당 컨텍스트에 대한 로깅은 비활성화됩니다.

  • Syntax: app_protect_security_log_enable on | off
  • Levels: http, server, location
  • 예시: app_protect_security_log_enable on
인수필수 여부설명기본값
ON-OFFO로깅 활성화 여부off
app_protect_security_log

Security log 속성은 app_protect_security_log 지시문이 활성화된 경우 해당 지시문에 따라 결정됩니다. 이 지시문은 httpserverlocation 컨텍스트에서 사용할 수 있습니다. 이 지시문은 단일 컨텍스트에서 여러 번 사용할 수 있으며, 컨텍스트에 사용된 모든 로그가 사용됩니다. 컨텍스트에 지시문이 존재하지 않을 경우, 상위 컨텍스트에서 상속됩니다: locationserverserver는 http로부터 상속받습니다. 이러한 컨텍스트 중 어느 곳에도 지시문이 없으면, 기본 설정이 적용됩니다.

  • Syntax: app_protect_security_log [LOG-CONFIG-FILE] [DESTINATION]
  • Levels: http, server, location
  • 예시:
app_protect_security_log "/etc/app_protect/conf/log_default.json" stderr;
app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
app_protect_security_log "/etc/app_protect/conf/log_default.json" syslog:server=localhost:514;
app_protect_security_log "/etc/app_protect/conf/log_default.json" syslog:server=my-specific-machine-name:514;
app_protect_security_log "/etc/app_protect/conf/log_default.json" syslog:server=192.168.12.34:514;
app_protect_security_log "/etc/app_protect/conf/log_default.json" syslog:server=my.domain.com:514;

stderr 을 사용할 경우, bd-socket-plugin 프로세스가 stderr 출력을 파일로 리다이렉트 하지 않도록 해야합니다.

Note:

stderr 을 사용할 경우, bd-socket-plugin 프로세스가 stderr 출력을 파일로 리다이렉트 하지 않도록 해야 합니다.
– 관리자 가이드의 Docker entrypoint.sh 시작 스크립트를 사용하는 경우, stderr을 리다이렉트 하지 않도록 해야 합니다.
– 서비스 시작 시 nginx-app-protect.service의 서비스 시작 파일이 stderr을 리다이렉트 하지 않도록 해야 합니다.
인수 필수 여부 설명 기본값
LOG-CONFIG-FILE X 로그 설정 파일 경로. 자세한 내용은 하단을 참고하세요. /etc/app_protect/conf/log_default.json 파일은 설치 후의 “/opt/app_protect/share/defaults/log_illegal.json” 파일과 같지만 이후 수정할 수 있습니다.
DESTINATION X NGINX 형식의 로그 메시지의 목적지입니다. 지원되는 목적지 옵션은 stderr, 로컬 파일의 절대 경로, 또는 localhost, 호스트명, IP 주소 혹은 선택적 포트와 FQDN을 가진 syslog 서버입니다. syslog:server=localhost:514

3. NGINX App Protect WAF Security Log 설정 파일

Security log 설정 파일은 JSON 형식이며, 두 부분으로 구성됩니다.

  1. filter : 어떤 요청이 로깅될지 정의합니다.
  2. content : 메시지가 어떻게 포맷될지 정의합니다.
Filter

Filter는 필수지만, 비워둘 수 있습니다.

인수설명유형/값기본값
request_typeApp Protect가 요청에서 감지한 내용에 따라 로깅합니다.열거된 값:
all: 모든 요청
illegal: 위반 사항이 있는 요청(경고 혹은 차단됨)
blocked: 위반 사항이 있어 차단된 요청
all
Content

설정 파일의 이 부분은 로깅할 내용, 메시지의 형식, 크기 제한을 지정합니다.

Content는 필수입니다. Content 필드 전체 혹은 속성 중 일부가 정의되지 않으면, 시스템에서 정의한 기본값이 사용됩니다.

인수설명유형/값필수 여부기본값비고
format사전 정의된 로그 메시지의 형식 혹은 format_string에서 정의될 사용자 정의 형식 중 하나를 선택합니다.열거된 값:
arcsight : F5에 맞춘 커스텀 필드가 포함된 ArcSight Common Event Format (CEF)에 맞춘 형식.
big-iq : BIG-IP를 위한 F5 중앙 관리 플랫폼인 BIG-IQ에 맞춘 형식.
default : App Protect의 기본 형식. 더 자세한 내용은 하단의 NGINX Format Strings 섹션을 확인하세요.
grpc : gRPC 트래픽에 맞게 default를 변형한 형식. 더 자세한 내용은 하단의 NGINX Format Strings 섹션을 확인하세요.
splunk : F5 플러그인을 사용한 Splunk SIEM에 맞춘 형식.
user-defined : format_string 필드에 정의된 사용자 정의 형식.
Xdefault
format_string로그 메시지에 기록된 필드의 레이아웃 템플릿입니다.메시지 속성에 대한 placeholder를 포함하는 메시지 템플릿을 나타내는 문자열입니다.
현재 사용 가능한 security log 속성은 Available Security Log Attributes 섹션에 명시되어 있습니다. 각 속성 이름은 퍼센트 기호로 구분됩니다. 예: %violation_rating%
format이 user-defined인 경우에만 해당.N/A
max_message_size전체 메시지 크기를 KB단위로 제한합니다.1k-64k 사이의 범위. max_request_size보다 커야합니다.X2k
max_request_sizebyte 단위로 로그의 request, request_body_base64 필드의 크기를 제한합니다. max_message_size보다 작아야합니다.1-10240 사이의 정수 혹은 any. any는 10240과 동일합니다. 유형은 any 옵션을 포함하기 위해 JSON 스키마의 문자열입니다. 로그 설정의 max_request_size 제한이 2k에서 10k로 증가했습니다.X2k요청 필드가 로그에 있는 경우에만 해당됩니다.
escaping_characters로그 값의 문자를 다른 문자로 바꿀 수 있습니다. 두 하위 필드를 설정해야 합니다.
from: 변경할 문자를 정의합니다.
to: 변경 후의 문자를 정의합니다.
from, to 필드 모두 문자열XN/A
list_prefix로그에 있는 값 목록의 접두사를 정의합니다.문자열XN/A
list_delimiter로그에 있는 값 목록의 구분 기호를 정의합니다.문자열X,
list_suffix로그에 있는 값 목록의 접미사를 정의합니다.문자열XN/A
예제
기본 로깅 내용

/etc/app_protect/conf/log_default.json의 내용입니다. app_protect_security_log_enabled on으로 설정되고, app_protect_security_log가 설정되지 않았을 때 기본적으로 사용됩니다.

{
    "filter": {
        "request_type": "illegal"
    },
    "content": {
        "format": "default",
        "max_request_size": "2k",
        "max_message_size": "5k"
    }
}
위반 사항이 있는 요청을 키 – 값 형식으로 기록
{
    "filter": {
        "request_type": "illegal"
    },
    "content": {
        "format": "user-defined",
        "format_string": "client_ip=%ip_client%,client_port=%src_port%,request=%request%,violations=%violations%,signature_ids=%sig_ids%",
        "max_request_size": 2000,
        "max_message_size": "5k"
    }
}
로그 상태 변경 요청
{
    "filter": {
        "request_type": "all"
    },
    "content": {
        "format": "default",
        "max_request_size": "2k",
        "max_message_size": "5k"
    }
}
자세한 사용자 정의 메시지
{
    "filter": {
        "request_type": "illegal"
    },
    "content": {
        "format": "user-defined",
        "format_string": "Request ID %support_id%: %method% %uri% received on %date_time% from IP %ip_client% had the following violations: %violations%",
        "max_request_size": "2k",
        "max_message_size": "5k"
    }
}
Escaped Character와 사용자 지정 접두사 / 구분 기호 / 접미사가 있는 로그
{
    "filter": {
        "request_type": "all"
    },
    "content": {
        "format": "default",
        "max_request_size": "2k",
        "max_message_size": "5k",
        "escaping_characters": [
      	    {
                "from": "/",
                "to": "|"
            }
        ],
        "list_prefix": "[",
        "list_delimiter": "::",
        "list_suffix": "]"
    }
}

마지막 예제 참고 사항:

  • security log의 목록 요소 문자열에서 / 는 | 로 대체됩니다.
    예 : string/another_stringstring|another_string로 대체됩니다.
  • 모든 리스트는 [ 로 시작되고 ] 로 끝나며, 리스트의 각 요소는 :: 로 구분됩니다.
    예 : first,second,third[first::second::third]로 기록됩니다.
NGINX Format Strings

만약 format 값이 default 혹은 grpc인 경우, 메시지는 Available Security Log Attributes에 명시된 속성으로 구성된 쉼표로 구분된 키-값 형식으로 나타납니다. grpc 형식은 gRPC 전용 필드와 요청 본문을 Base64로 인코딩하여 헤더와 분리하여 포함합니다. 반면, default 형식은 요청 전체를 하나의 필드에 원래 인코딩으로 포함합니다.

default, grpc 문자열은 모두 다음과 같이 시작합니다:
“attack_type=\”%attack_type%\”,blocking_exception_reason=\”%blocking_exception_reason%\”,…”

4. Syslog 전송

Syslog 전송은 TCP로 이루어집니다. 현재는 SSL/TLS가 지원되지 않아 보안이 적용되지 않습니다. 로그를 원격 목적지로 직접 전송하지 않고, NGINX App Protect WAF와 같은 pod 혹은 VM에 있는 로컬 syslog 서버를 통해 프록시하는 것을 권장합니다. 로컬 syslog 서버는 로그를 원격 목적지로 보안 채널을 통해 전달합니다. 로그가 전송되는 동안 중간에서 가로채거나 변경하려는 공격을 방지하기 위해 상호 인증 TLS(mTLS)를 사용하는 것을 권장합니다.

필터와 일치하는 모든 요청이 실제 목적지에 도달한다고 보장할 수 없습니다. 특히 시스템이 들어오는 트래픽으로 인해 과부하가 걸리는 경우, 일부 로그 레코드가 누락될 수 있습니다.

5. 초기 설정 파일

NGINX는 /opt/app_protect/share/defaults/ 경로에 다음 구성으로 예시 설정을 제공합니다.

이름필터내용
log_allallformat=default
log_blockedblocked requestsformat=default
log_f5_arcsightillegal requestsformat=arcsight, 사이즈는 시스템 정의되어 바꿀 수 없습니다.
log_f5_splunkillegal requestsformat=splunk, 사이즈는 시스템 정의되어 바꿀 수 없습니다.
log_grpc_allallformat=grpc
log_grpc_blockedblocked requestsformat=grpc
log_grpc_illegalillegal requestsformat=grpc
log_illegalillegal requestsformat=default

6. 유효한 Security Log 속성

아래의 표는 security log에 생성되는 속성을 나열합니다. 사용자 정의 로그를 사용할 때(예: format=user-defined), 아래 목록의 항목을 추가하거나 제거할 수 있습니다. 기본 제공 형식인 defaultgrpc형식에 해당 속성이 포함되는지 표에 명시되어 있습니다.

속성 이름설명포함된 형식
attack_type의심되는 공격의 이름을 쉼표로 구분한 목록default, grpc
blocking_exception_reason구성된 위반 사항이 차단되지 않았을 때의 예외 사유default, grpc
bot_anomalies탐지된 이상 현상들을 쉼표로 구분한 목록default, grpc
bot_category탐지된 봇의 카테고리default, grpc
bot_signature_name탐지된 봇의 이름default, grpc
client_class클라이언트의 분류.
다음 값 중 하나를 가집니다 : N/A, Suspicious Browser, Malicous Bot, Trusted Bot, Untrusted Bot. 클라이언트가 표준 브라우저로 분류되면 값은 N/A입니다.
default, grpc
date_timeApp Protect가 요청을 수신한 날짜와 시간default, grpc
dest_port들어오는 요청을 수신하기 위해 할당된 포트default, grpc
enforced_bot_anomalies요청 차단의 원인이 된 이상 현상을 쉼표로 구분한 목록default, grpc
grpc_methodgRPC 요청의 메서드 이름(URI에서 파생됨). http_method와 혼동하지 마세요. gRPC Content Profile에 의해 처리되는 요청에만 적용됩니다. 이외의 경우에 값은 N/A입니다.grpc
grpc_servicegRPC 요청의 서비스 이름(URI에서 파생됨). gRPC Content Profile에 의해 처리되는 요청에만 적용됩니다. 이외의 경우에 값은 N/A입니다.grpc
grpc_messagegrpc-message 헤더의 값grpc
compression_method메시지에 사용된 압축 알고리즘. 현재는 다음 값 중 하나입니다: gzip, deflate, none, n/agrpc
headers쿼리 문자열을 포함하고 본문을 포함하지 않는 요청의 헤더 부분grpc
ip_client요청을 시작한 클라이언트의 소스 IP.
Note: 프록시를 사용하는 경우, 이 값은 X-Forwarded-For 헤더의 IP에 따라 달라질 수 있습니다.
default, grpc
is_truncated_boolsecurity log의 요청이 잘렸다면 true를 반환하고, 그렇지 않다면 false를 반환하는 플래그default, grpc
Note: 이 속성에 사용되는 로그 필드 이름은 is_truncated입니다.
json_log트랜잭션과 관련된 위반 사항, 적용된 서명 이름, ID를 포함합니다. 더 많은 정보는 Blocking Observability를 참고하세요.
Note: 4.3 버전부터 json_log 필드는 JSON 형식으로 포맷된 위반 사항의 상세한 내용을 포함합니다.
default, grpc
json_log.stream.id현재 메시지가 속한 gRPC 스트림(요청)의 id. 스트림 내의 모든 메시지를 연관시키는 데 사용합니다. 현재 이 번호는 헤더 메시지의 지원 id와 동일합니다.grpc
json_log.stream.index스트림 내에서 메시지의 순차적인 번호를 나타내는 값. 번호는 0부터 시작하며, 0은 항상 요청 헤더 이벤트를 의미합니다. Unary rpcs의 경우 0과 1만이 존재합니다.grpc
json_log.stream.controlState클라이언트 스트림의 현재 상태를 메시지로 나타냅니다:
start: 헤더
ongoing: 마지막 이전의 gRPC 메시지
end: 스트림 종료를 나타내는 빈 로그 항목
grpc
method요청의 메서드
예: GET, POST, HEAD
default, grpc
outcome다음 중 하나:
PASSED: 요청이 백엔드 서버에 전송됨
RECEDTED: 요청이 차단됨
default, grpc
outcome_reason다음 중 하나:
SECURITY_WAF_OK: 위반 사항 없이 허용됨
ECURITY_WAF_VIOLATION: 보안 위반으로 차단됨
SECURITY_WAF_FLAGGED: 허용되었지만, 위반 사항이 있음
SECURITY_WAF_VIOLATION_TRANSPARENT: 정책이 tranparent mode일 경우 허용되지만, blocking mode일 경우 차단됨
default
policy_name위반이 발생한 App Protect 정책의 이름default, grpc
protocol사용된 프로토콜. App Protect에서 SSL termination 발생 시 HTTP 혹은 HTTPS입니다.default, grpc
request헤더, 쿼리 문자열, 데이터를 포함한 전체 요청을 원래 인코딩된 형태입니다. 요청에 binary로 작성된 내용이 있거나 로그 목적지가 지원하지 않는 텍스트 인코딩을 사용하는 경우, 올바르게 렌더링 되지 않을 수 있습니다. 이 경우 request_body_base64, headers 필드를 사용하는 것을 권장합니다.default
request_body_base64요청의 body를(존재할 경우) Base64 형식으로 인코딩한 값. binary로 작성된 내용에 적합합니다.grpc
request_statusApp Protect 정책에 의해 지정된 웹 애플리케이션에 클라이언트의 요청 상태. 다음 값 중 하나입니다.
blocked: 위반이 발생하여 요청이 차단됨. 차단 응답 페이지가 클라이언트에게 반환됨
alerted: 요청에 위반 사항이 포함되었지만, 차단되지 않음 (일반적으로 enforcement mode가 transparent로 설정된 경우)
passed: 위반 사항이 없는 성공적인 요청
default, grpc
response_code서버로부터 수신한 응답 코드default, grpc
severity요청에서 발견된 모든 위반 사항 중 가장 높은 위험도를 나타내는 값. 이 값은 위반 사항에서 제공되는 정적 값입니다.default, grpc
sig_cves매칭된 서명의 서명 CVEs 값default, grpc
sig_ids위반을 발생시킨 매칭된 서명의 서명 ID 값default, grpc
sig_names위반을 발생시킨 매칭된 서명의 이름default, grpc
sig_set_names매칭된 서명의 서명 세트 이름default, grpc
src_port클라이언트의 소스 포트default, grpc
sub_violations‘HTTP protocol compliance failed’, ‘Evasion technique detected’ 위반 항목에서 감지된 하위 위반을 나타냅니다.default, grpc
support_id트랜잭션을 식별하기 위한 고유 id입니다.default, grpc
threat_campaign_names쉼표로 구분된 요청에서 감지된 Threat Campaign의 이름default, grpc
unit_hostnameapp-protect 인스턴스의 호스트 이름default, grpc
uri요청의 URI(Uniform Resource Identifier)default, grpc
violation_details각 위반 사항의 세부 정보를 포함한 XMLdefault, grpc
violation_rating요청이 실제 위협일 가능성을 0~5로 추정한 값.
0 – 위협이 아님(위반 사항 없음)
5 – 위협일 가능성이 높음
default, grpc
violations쉼표로 구분된 논리적 위반 이름의 목록(예 : VIOL_ATTACK_SIGNATURESVIOL_HTTP_PROTOCOL)default, grpc
vs_name이 요청과 관련된 nginx.conf 파일 내부 위치의 고유 식별자. 이 식별자는 nginx.conf 파일의 서버 블록이 포함된 줄 번호, 서버 이름, 동일 서버의 여러 항목을 구분하는 숫자 식별자, 위치 이름을 포함합니다. 예 : ’34-mydomain.com:0-~/.*php(2).default, grpc
x_forwarded_for_header_valueX-Forwarded-For 헤더 정보. 이 옵션은 프록시가 포함된 경우 요청의 원본 발신자를 추적하기 위해 주로 사용됩니다.default, grpc

7. 차단 관찰 가능성

NGINX App Protect 정책이 Transparent 모드로 시행되면, Blocking 모드가 True로 설정될 경우 어떤 트랜잭션이 차단될지 알기 쉽습니다. 그리고 어떤 위반 사항과 서명이 해당 트랜잭션을 차단하도록 했는지 알 수 있습니다.

이를 용이하게 하기 위해, NGINX App Protect는 JSON 형식 데이터를 포함하는 json_log라는 새로운 security log 필드를 도입합니다. 이 필드는 트랜잭션과 연관된 위반 사항, 적용할 수 있는 서명 이름, ID를 포함합니다. 이 필드는 위반 사항/서명 설정에 따라 특정 위반 사항/서명이 차단을 발생시킬지 여부를 나타냅니다. (isBlocked 속성에 나타남)

감지된 각 서명은 VIOL_ATTACK_SIGNATURE 위반 사항과 isBlocked 불리언 속성을 포함한 JSON 블록으로 보고됩니다.

다음은 여러 위반 사항과 서명이 포함된 json_log 필드의 예제입니다.

{
  "violations": [
    {
      "enforcementState": {
        "isBlocked": false
      },
      "violation": {
        "name": "VIOL_URL_METACHAR"
      }
    },
    {
      "enforcementState": {
        "isBlocked": true
      },
      "violation": {
        "name": "VIOL_RATING_THREAT"
      }
    },
    {
      "enforcementState": {
        "isBlocked": true
      },
      "signature": {
        "name": "XSS script tag (URI)",
        "signatureId": 200000099
      },
      "violation": {
        "name": "VIOL_ATTACK_SIGNATURE"
      }
    },
    {
      "enforcementState": {
        "isBlocked": true
      },
      "signature": {
        "name": "XSS script tag end (URI)",
        "signatureId": 200000093
      },
      "violation": {
        "name": "VIOL_ATTACK_SIGNATURE"
      }
    }
  ]
}

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required