NGINX App Protect WAF 문제 해결 가이드
이 NGINX App Protect WAF 문제 해결 가이드는 사용자들이 NGINX App Protect WAF의 문제를 식별하고, 해결하는 데 도움을 주기 위해 작성되었습니다. 이 가이드는 NGINX App Protect WAF의 설치, 설정 과정의 문제 해결에 도움이 될 수도 있습니다.
NGINX App Protect WAF의 설치, 설정 관련 알려진 문제는 아래 표를 참고하세요.
목차
1. 알려진 NGINX App Protect WAF 문제 해결
2. SELinux
3. 기술 지원 접수하기
1. 알려진 NGINX App Protect WAF 문제 해결
| 문제 | 해결법 |
| NGINX가 실행되지 않음(ps -aux) NGINX의 reload가 실패함 | /var/log/nginx/error.log의 에러 로그를 확인하여 문제를 해결하고, NGINX 를 재시작합니다. |
| NGINX App Protect WAF가 예상대로 기능하지 않음 | NGINX App Protect WAF는 문제 해결을 위한 다양한 로그가 있습니다. 일반적으로 로그의 경고 혹은 에러 메시지를 확인하는 것이 좋습니다. 로그 개요를 참고하세요. |
| 에러 메시지: Too many open files | file descriptors의 수를 늘립니다. 예를 들어, nginx.conf 파일의 메인 컨텍스트에서 다음 설정을 적용합니다: worker_rlimit_nofile 65535; |
| 에러 메시지: setrlimit … failed (Permission denied) | 다음 명령어를 root 사용자로 사용하여 제한을 늘립니다:setsebool -P httpd_setrlimit 1; |
| 에러 메시지: unknown directive app_protect_xxx | App Protect 모듈이 로드되지 않았습니다. nginx.conf 파일의 메인 컨텍스트에 다음 지시문을 추가합니다:load_module "/etc/nginx/modules/ngx_http_app_protect_module.so"; |
| 컴파일러 에러 메시지 : Expected declarative policy | 정책 설정이 올바른 WAF 정책 형식으로 구성되었는지 확인합니다. 올바른 형식은 아래와 같습니다. |
| 에러 메시지: Policy Bundles version is older than the local version, Policy Bundles version is newer than the local version | 모든 번들을 다시 컴파일합니다. 보안 업데이트가 설치될 때마다 모든 번들은 다시 컴파일되어야 합니다. |
| 에러 메시지: Found mixed content of compiled and raw configuration and Compiler is required, but not installed: Missing /opt/app_protect/bin/config_set_compiler | nginx.conf 파일에선 미리 컴파일된 번들만 사용할 수 있습니다. JSON 정책은 사용하지 마세요. JSON 정책은 번들에 먼저 컴파일되도록 합니다. |
| 에러 메시지: Policy Bundles have differing global states and Policy Bundles have differing cookie seeds | 커스텀 컴파일러로 모든 번들을 다시 컴파일합니다. 번들들은 항상 같은 컴파일러 이미지/버전으로 컴파일되어야 합니다. 기본 정책 번들과 커스텀 정책 번들은 혼용될 수 없습니다. |
| 에러 메시지: Duplicate policy name found | 여러 정책을 같은 이름으로 컴파일하지 마세요. 그리고 하나의 정책을 여러 개의 번들로 컴파일하지 마세요. 각 정책은 한 번만 컴파일될 수 있으나, 번들은 여러 번 재사용할 수 있습니다. |
| 에러 메시지 : Duplicate logging profile name found | 동일한 로깅 프로필을 여러 개의 번들로 컴파일하지 마세요. 각 로깅 프로필은 한번만 컴파일될 수 있으나, 번들은 여러 번 재사용할 수 있습니다. |
| 에러 메시지 : Timeout waiting for enforcer | 내부 문제일 가능성이 큽니다. NGINX App Protect WAF 문제 해결을 위해 번들에 사용된 정책과 함께 지원팀에 문의하세요. |
2. SELinux
일부 운영 체제에서는 SELinux 또는 AppArmor 와 같은 보안 메커니즘이 기본적으로 활성화되어 nginx 프로세스와 waf-config-mgr, waf-enforcer 컨테이너의 필요한 파일 접근을 차단할 수 있습니다. NGINX App Protect WAF v5가 보안을 침해하지 않으면서 원활하게 작동하도록 하려면, 사용자 정의 SELinux 정책이나 AppArmor 프로필을 설정하는 것을 고려해 보세요. 단기적인 문제 해결을 위해 permissive(SELinux) 또는 complain(AppArmor) 모드를 사용하여 이러한 제한을 피할 수 있지만, 이는 보안을 약화하므로 장기간 사용하는 것은 권장되지 않습니다.
3. 기술 지원 접수하기
기술 지원 접수를 위해, NGINX App Protect WAF 문제 해결을 위한 정보를 하나의 디렉터리에 모으고 압축하여, 고객 지원 엔지니어에게 보내세요.
1. Docker compose 배포의 경우, 다음 명령어를 사용해 로그를 수집합니다
$ sudo docker compose logs > docker_compose_logs.txt
ELK stack과 같은 중앙 로깅 시스템을 사용 중이라면, 로그를 CSV 형식으로 수집합니다. (docker_compose_logs.csv)
2. Kubernetes 배포의 경우
아래 명령어/스크립트의 default를 사용자의 네임스페이스 이름으로 바꿔 사용합니다.
다음 명령어로 네임스페이스의 모든 pod 목록을 확인합니다.
$ kubectl get pods -n default
다음 스크립트를 사용하여 모든 pod로부터 로그를 수집합니다.
#!/bin/bash
set -x
# Define the namespace variable
NAMESPACE="default"
# Define a directory to store log files
log_dir="k8s_logs_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$log_dir"
# Loop through all pods and containers, saving logs to the defined directory
for pod in $(kubectl get pods -n $NAMESPACE -o=name | sed 's|pod/||g'); do
for container in $(kubectl get pod/$pod -n $NAMESPACE -o=jsonpath='{.spec.containers[*].name}'); do
kubectl logs $pod -c $container -n $NAMESPACE > "${log_dir}/${pod}_${container}_logs.txt"
done
done
echo "Logs collected and archived in ${log_dir}.tar.gz"
위 스크립트는 네임스페이스에 존재하는 각 pod 내부의 컨테이너별로 로그를 수집하여 별도의 파일로 저장합니다. 이 파일들의 이름은 pod와 컨테이너의 이름을 따서 설정되며, k8s_logs_<생성시간> 디렉터리에 저장됩니다.
3. NGINX가 호스트 머신에 직접 설치된 경우
- CentOS / RHEL / Amazon Linux / Oracle Linux
$ rpm -qa nginx* app-protect* > package_versions.txt
- Debian / Ubuntu
$ apt list --installed | grep -E 'nginx|app-protect' > package_versions.txt
- Alpine Linux
$ apk info -vv | grep -E 'nginx|app-protect' > package_versions.txt
- 다음 명령어를 사용하여 OS 정보를 수집합니다.
$ cat /etc/os-release > system_version.txt && uname -r >> system_version.txt && cat /proc/version >> system_version.txt
- /var/log/nginx/ 디렉터리의 NGINX 로그를 추가합니다
4. NGINX App Protect WAF 문제 식별을 위해 모든 정책과 로그 파일 설정을 추가합니다(JSON과 번들 파일들).
5. /etc/nginx/nginx.conf 파일을 포함한 모든 NGINX 설정 파일을 추가합니다.
6. 위 파일들을 모아놓은 디렉터리에서 다음 명령어를 사용하여 압축 파일을 생성합니다.
$ tar cvfz logs.tgz .
7. 기술 지원 문의에 logs.tgz 파일을 첨부합니다.