강의 동영상 : https://www.youtube.com/watch?v=Gk449A7u8sg
원본 동영상 : https://www.youtube.com/watch?v=NuJwQ7E8Zs8
1. Web Application Firewall
HTTP Protocol위에서 동작하는 Firewall. Web Service로 오는 HTTP Request들을 Filtering, Blocking, Mintoring하는데 사용.
Layer 7 Firewall 이다.
아래 그림에서 Firewall을 지나간 HTTP Request들 중에서 Mal-ware나 Invalid Request들을 구분해서 Backend에 위치한 Application Server Group을 보호하는 역할을 맡는다.
2. NGINX App Protect
- Code 기반에 가까운 방화벽. 배포 관점에서 쉽게 설정을 변경해 적용 가능.
- 특정 요구 사항에 맞게 보안 정책을 설정할 수 있고, 보안 정책에 Request의 Blcoking/Transparent 설정 가능
- Header나 Body에 특정 단어가 포함될 경우 Blocking 가능. (ex. 댓글에 "<script"로 시작하는 mal-ware script 방어)
- 특정 Data 유형을 Masking 하는 기능 제공.
- 관련 문서 : https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/
- Monolothic Application vs Microservice Application
- Monolothic Application 의 경우에는 Request와 Response의 경로가 단일하기 때문에 기존의 Firewall로 보안 가능.
- Microservice : 내부적으로 다양한 Service들이 동작하고 서로 통신하기 때문에 Firewall안쪽에서 특정 서비스들에 전해질 수 있는 이상 동작을 방지하기 위해 WAF가 필요
3. Demo-1
Kubernetes Ingress Controller에 NGINX App Protect 구현 (Demo 코드는 공유되지 않음)
주요 구성 파일
- ap-apple-uds.yaml : "apple"이라는 단어가 포함된 Request에 대한 설정을 정의한 Signature
- ap-dataguard-alarm-policy.yaml : 특정 형식의 Data를 보호하기 위한 보안 설정. 이 Demo에서는 Card Number를 Masking하는데 사용.
- ap-logconf.yaml : 로그설정 파일 (내용은 동영상에 나오지 않음)
- syslog.yaml : System Log를 특정 포트로 확인할 수 있게 설정.
Capture
Case 1) 일반적인 Request들에 대해 정상적으로 처리하는 경우
Case 2) 'Apple'이라는 단어가 Header나 Parameter에 포함된 경우 : Blocking Response가 전달됨.
Case 3) 일반적인 숫자가 포함된 Request에 대해 정상적으로 처리하는 예.
Case 4) 카드번호로 추정되는 숫자가 포함된 Request에 대해 Data를 Masking하는 예.
Case 5) WAF를 종료시키고 카드번호로 추정되는 숫자가 포함된 Request에 대해 Masking하지 않는 예.
주요 Yaml 파일
# # ap-apple-uds.yaml # apiVersion: appprotect.f5.com kind: APUserSig metadata: name: apple spec: signature: - accuracy: medium attackType: name: Brute Force Attack description: Medium accuracy user defined signature with tag (Fruits) name: Apple_medium_acc risk: medium # 'apple' 단어에 대한 설정 rule: content:"apple"; nocase; signatureType: request systems: - name: Microsoft Windows - name: Unix/Linux tag: Fruits
# # ap-dataguard-alarm-policy.yaml # apiVersion: ... kind: APPolicy metadata: name: dataguard-alarm spec: policy: signature-requirements: - ag: Fruits signature-sets: - name: apple_sigs block: true signatureSet: filter: tagValue: Fruits tagFilter: eq applicationLanguage: utf-8 blocking-settings: violations: - alarm: true block: false name: VIOL_DAA_GUARD data-guard: # 카드 번호에 대한 Data Guard를 On 시킴. creditCardNumbers: true enforcementMode: ignore-urls-in-list enforcementUrls: [] lastCcnDigitsToExpose: 4 lastSsnDigitsToExpose: 4 # 카드 번호를 Masking 함 maskData: true unSocialSecurityNumbers: true enforcementMode: blocking name: dataguard-alarm template: name: POLICY_TEMPLATE_NGINX_BASE
# # syslog.taml # ... kind: Deployment metadata: name: syslog spec: replicas: 1 selector: matchLabels: app: syslog template: metadata: labels: app:syslog spec: containers: - name: syslog image: balabit/syslog-ng.3.28.1 ports: - containerPort: 514 - containerPort: 601 --- apiVersion: v1 kind: Service metadata: name: syslog-svc spec: ports: - port: 514 targetPort: 514 protocol: TCP selector: app: syslog
# # waf.xml # apiVersion: k8s.nginx.org/v1 kind: Policy metadata: name: waf-policy spec: waf: enable: true apPolicy: "default/dataguard-alarm" securityLog: enable: true apLogConf: "default/logconf" logDest: "syslog:server=127.0.0.1:514"
4. Demo-2
Docker Container를 통해 NGINX Plus를 실행하고, 여기에 NGINX App Protect 기능을 가동하는 예.
Git 자료 : https://github.com/jay-nginx/app-protect-dvwa
- 단, Demo에서 보여주는 nginx-repo.key와 nginx-repo.key는 Trial을 통해 따로 구해야함.
nginx.conf
- load_module을 통해 app_protect 기능을 제공하는 module을 추가
- app_protect_enable on/off 를 통해 app protect의 기능을 On/Off 시킴
- app_protect_policy_file에서 protect policy를 명시한 파일을 참조하게 함. 이 Demo에서는 기본 설정이 담긴 NginxDefaultPolicy.json 외에 policy_type_dataguard.json를 별도로 정의해서 사용
user nginx; ... worker_processes auto; load_module modules/ngx_http_app_protect_module.so; load_module modules/ngx_http_headers_more_filter_module.so; load_module modules/ngx_http_app_protect_dos_module.so; ... http { ... server { listen 80; ... app_protect_enable on; app_protect_security_log_enable on; app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log; app_protect_policy_file "/etc/app_protect/conf/NginxDefaultPolicy.json"; ... ## DOS Policies app_protect_dos_enable on; app_protect_dos_name dvwa-example; app_protect_dos_policy_file "/etc/app_protect_dos/BADOSDefaultPolicy.json"; app_protect_dos_monitor "dvwa.example.com"; app_protect_dos_security_log_enable on; app_protect_dos_security_log "/etc/app_protect_dos/log-default.json" /var/log/app_protect/security_dos.log; ... location = /vulnerabilities/xss_s/ { app_protect_enable on; app_protect_security_log_enable on; app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/data_guard.log; app_protect_policy_file "/etc/nginx/policy_type_dataguard.json"; status_zone dataguard_endpoint; client_max_body_size 0; default_type text/html; # set your backend here proxy_pass http://app_backend_com; proxy_set_header Host $host; } ... }
policy_type_dataguard.json
- enforcementMode : 위반 사례를 Blocking할 경우에는 'Blocking'으로 설정, Logging만 할 경우에는 'Transparent'로 설정
- response-pages : 위반 했을 경우 Redirect되는 Page 정의
- blocking-setting : 위반 사례에 대해 blocking/logging 여부 설정. (단, Transparent 모드일 경우에는 Blocking 되지 않는다.) Demo에 사용된 설정 중 VIOL_HTTP_PROTOCOL은 http protocol에 대해 Blocking을 설정한 예이다.
- data-guard : 카드 번호로 의심되는 Data에 대해 Masking하게 설정.
{ "policy": { "name": "dvwa-dataguard", "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" }, "applicationLanguage": "utf-8", "enforcementMode": "transparent", "response-pages": [ { "responseContent": "<html>...</html>", "responseHeader": "HTTP/1.1 302 OK\\r\\nCache-Control: no-cache\\r\\nPragma: no-cache\\r\\nConnection: close", "responseActionType": "custom", "responsePageType": "default" } ], "blocking-settings": { "violations": [ { "name": "VIOL_HTTP_PROTOCOL", "alarm": true, "block": false }, ... ] }, "data-guard": { "enabled": true, "maskData": true, "creditCardNumbers": true, "enforcementMode": "ignore-urls-in-list", "enforcementUrls": [] } } }
'DevOps > NGINX' 카테고리의 다른 글
NGINX MSA 디지털 트레이닝 - 8강 : Basics and Best Practices (1) | 2022.05.22 |
---|---|
NGINX MSA 디지털 트레이닝 - 7강 : NGINX Kick Starter (1) | 2022.05.06 |
NGINX MSA 디지털 트레이닝 - 5강 : Kubernetes NGINX Ingress Controller (1) | 2022.03.30 |
NGINX MSA 디지털 트레이닝 - 4강 : API Gateway (1) | 2022.03.21 |
NGINX MSA 디지털 트레이닝 - 3강 : Load Balancing (1) | 2022.03.13 |