본문 바로가기

DevOps/NGINX

NGINX MSA 디지털 트레이닝 - 6강 : NGINX App Protect - WAF

반응형

강의 동영상 : 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": []
      }
      }
      }