본문 바로가기
정보보호 (Security)

ModSecurity 로그 Elasticsearch 수집하고 Kibana 통한 분석

by 날으는물고기 2023. 11. 27.

ModSecurity 로그 Elasticsearch 수집하고 Kibana 통한 분석

Creating an OpenWAF solution with Nginx, ElasticSearch and ModSecurity

ModSecurity 로그를 Elasticsearch에 저장하고 Kibana를 사용하여 검색 및 보고서를 생성하는 방법에 대한 요구 사항은 다음과 같습니다.

  1. ModSecurity 버전 3 및 Nginx 사용
  2. "Audit Log" 구성
  3. ModSecurity 로그를 Elasticsearch로 전송하는 Python 스크립트 사용

이 설정은 ModSecurity 2.9 및 Apache가 아닌 Nginx 및 Libmodsecurity (또는 ModSecurity v3)를 기반으로 합니다.

[PDF] Integración del WAF ModSecurity y la plataforma para inteligencia de amenazas MISP

Audit Log 구성 및 Python 스크립트를 사용하여 ModSecurity 로그를 Elasticsearch로 전송하는 방법을 보여줍니다. 이후 Kibana를 사용하여 검색 및 보고서 생성이 가능합니다.

  1. Nginx 설정
    모든 웹 사이트에 대한 Nginx 설정에서 ModSecurity 규칙 파일을 각각 지정하여 감사 로그를 저장할 위치를 선택할 수 있습니다.
    예를 들어:
    server {
      listen 80;
      server_name www.example.com;
      modsecurity on;
      modsecurity_rules_file modsecurity/www.example.com.conf;
      ...
    }
    여기서 modsecurity_rules_file 내에서 SecAuditLog 부분을 다음과 같이 편집해야 합니다.
    SecRuleEngine On
    SecRequestBodyAccess On
    # ...
    SecAuditEngine On
    SecAuditLogRelevantStatus "^[0-9]+"
    SecAuditLogParts ABCIJDEFHZ
    SecAuditLogType concurrent
    SecAuditLogStorageDir /usr/local/nginx/logs/modsecurity/www.example.com
    • SecAuditEngine On: ModSecurity 감사 로그 엔진을 활성화합니다.
    • SecAuditLogRelevantStatus: HTTP 응답 상태 코드 (200, 404 등)에 대한 정규 표현식으로, 해당 코드와 일치하면 감사 로그가 생성됩니다.
    • SecAuditLogParts: 요청 및 응답의 어떤 부분을 로깅할지를 감사 로그 엔진에 알려줍니다.
    • SecAuditLogType concurrent: 감사 로깅에 사용되는 트랜잭션 당 하나의 파일을 의미합니다.
    • SecAuditLogStorageDir: 각 로그 파일의 대상 디렉토리를 설정합니다.
  2. 디렉토리 및 권한 설정
    다음 디렉토리를 생성하고 Nginx 사용자가 쓸 수 있도록 권한을 부여합니다.
    $ mkdir /usr/local/nginx/logs/modsecurity
    $ mkdir /usr/local/nginx/logs/modsecurity/www.example.com
    $ chown -R nobody:nogroup /usr/local/nginx/logs/modsecurity/*
    여기서 /usr/local/nginx/logs/modsecurity/*는 해당 경로의 모든 하위 디렉토리와 파일에 대한 소유자를 nobodynogroup으로 설정합니다.
  3. Nginx 구성 리로드
    Nginx 구성을 다시 로드하면 SecAuditLogStorageDir 경로에 많은 JSON 형식의 파일이 생성됩니다.

이제 감사 로그 파일을 파싱하고 Elasticsearch로 전송할 시간입니다.

  1. GitHub에서 파서 클론 및 설정
    $ cd /opt/
    $ git clone https://github.com/theMiddleBlue/modsecurity-to-elasticsearch.git
    $ cd modsecurity-to-elasticsearch/
    $ vi modsec_parser.py
    여기서 modsec_parser.py 파일을 열어 Elasticsearch URL이 올바른지 확인합니다.
    es = Elasticsearch(['http://127.0.0.1:9200'])
  2. elasticsearch-py SDK 설치
    만약 설치되어 있지 않다면, elasticsearch-py SDK를 설치해야 합니다. pip를 사용하여 설치할 수 있습니다. (apt-get install python-pip가 필요할 수 있습니다.)
    pip install elasticsearch
  3. 스크립트 실행
    다음 명령을 사용하여 스크립트를 실행합니다. <auditlog directory>는 ModSecurity 감사 로그가 저장된 디렉토리입니다.
    python modsec_parser.py -d <auditlog directory>
    이 스크립트는 간단하게 "-d" 디렉토리에 있는 각 파일을 재귀적으로 읽고 파일 내용에서 JSON을 로드한 다음 elasticsearch-py 모듈을 사용하여 Elasticsearch로 전송합니다. "messages" 목록을 여러 다른 배열로 변환하여 "객체 배열" 문제를 해결합니다. 스크립트를 시작하면 다음과 같은 출력이 표시됩니다.
    이는 매일 인덱스를 생성하고 해당 날짜에 파일이 읽힌 날짜로 인덱스에 모든 수신 로그를 작성합니다. 모든 로그를 단일 인덱스에 저장해야 하는 경우 이를 변경할 수 있습니다.
  4. 백그라운드에서 실행
    백그라운드에서 스크립트를 실행하려면 다음과 같이합니다.
    python modsec_parser.py -d <auditlog directory> > /dev/null 2>&1 &
    이 명령은 스크립트를 백그라운드에서 실행하고 출력을 무시합니다.
이제 다음과 같이 인덱스 패턴을 구성해야 합니다.
  1. Kibana에서 인덱스 패턴 설정
    • Kibana 대시보드로 이동하고 "Management" 섹션에서 "Index Patterns"을 선택합니다.
    • "Create Index Pattern"을 클릭합니다.
    • "Index pattern" 필드에 modsecurity_*와 같은 패턴을 입력하고 "Next step"을 클릭합니다.
    • "Time Filter field name"에서 "unixts"를 선택하고 "Create index pattern"을 클릭합니다.
  2. 검색 및 보고서 생성
    • 이제 Kibana 대시보드에서 "Discover" 섹션으로 이동하여 검색을 시작할 수 있습니다.
  3. ModSecurity 로그 확인
    • "Discover" 섹션에서는 ModSecurity 로그를 자세히 볼 수 있습니다. 필요한 필드를 선택하고 해당 로그를 확인할 수 있습니다.
  4. msg.tags 필드에 대한 쿼리
    • "Discover" 섹션에서 "msg.tags" 필드에 대한 쿼리를 수행할 수 있습니다. 예를 들어, 특정 태그를 가진 로그를 검색하는 쿼리를 작성할 수 있습니다.
  5. msg.tags 필드로 분할된 파이 차트 생성
    • "Visualize" 섹션으로 이동하여 "Create a visualization"을 선택합니다.
    • "Pie chart"를 선택하고 "msg.tags" 필드를 사용하여 파이 차트를 생성합니다.
    • 필요에 따라 차트를 구성하고 저장한 다음 대시보드에 추가할 수 있습니다.

이제 Kibana를 사용하여 ModSecurity 로그에 대한 검색 및 시각화를 시작할 수 있습니다.

 

Nginx Ingress에서 ModSecurity를 활성화하고, ModSecurity Audit 로그를 Elasticsearch에 Fluentd를 사용하여 수집하는 방법은 다음과 같습니다. 이를 위해서는 Kubernetes 클러스터와 관련된 설정도 함께 고려해야 합니다.

  1. ModSecurity 설치 및 구성
    • Nginx Ingress에 ModSecurity를 적용하기 위해 먼저 ModSecurity를 설치하고 구성해야 합니다.
    • ModSecurity를 설치하려면 먼저 필요한 패키지 및 종속성을 설치하세요.
      sudo apt-get update
      sudo apt-get install -y libmodsecurity3 libmodsecurity-dev
    • ModSecurity를 Nginx에 통합하기 위한 모듈인 modsecurity-nginx를 다운로드하고 컴파일합니다.
      git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
      cd ModSecurity
      git submodule init
      git submodule update
      ./build.sh
      ./configure
      make
      make install
    • Nginx를 ModSecurity와 함께 빌드하려면 Nginx를 재빌드하고 ngx_http_modsecurity_module을 활성화하세요.
      git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
      cd ModSecurity-nginx
      git submodule init
      git submodule update
    • Nginx를 빌드하기 전에 nginx 소스를 다운로드하고 configure 단계에서 --add-dynamic-module 플래그를 사용하여 ModSecurity-nginx를 추가합니다.
      ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
      make
      make install
    • Nginx를 시작하고 nginx.conf 파일에 ModSecurity 모듈을 로드합니다.
      load_module modules/ngx_http_modsecurity_module.so;
      
      events {
          worker_connections  1024;
      }
      
      http {
          modsecurity on;
          modsecurity_rules_file /etc/nginx/modsec/main.conf;
      
          server {
              listen 80;
              server_name your_domain.com;
      
              location / {
                  modsecurity_rules
              }
          }
      }
  2. Fluentd 및 Elasticsearch 설정
    • Fluentd를 Elasticsearch에 연결하려면 먼저 Fluentd를 설치하고 Elasticsearch 플러그인을 추가해야 합니다.
      gem install fluentd
      gem install fluent-plugin-elasticsearch
    • Fluentd 설정 파일 (fluent.conf)을 생성하고 Elasticsearch에 로그를 전송하는 구성을 추가합니다.
      <source>
        @type tail
        path /var/log/modsec_audit.log
        pos_file /var/log/td-agent/modsec_audit.log.pos
        tag modsecurity_audit_log
        read_from_head true
        <parse>
          @type none
        </parse>
      </source>
      
      <match modsecurity_audit_log>
        @type elasticsearch
        host YOUR_ELASTICSEARCH_HOST
        port YOUR_ELASTICSEARCH_PORT
        logstash_format true
        logstash_prefix modsecurity
        include_tag_key true
        type_name "_doc"
      </match>
    • 위의 구성에서 YOUR_ELASTICSEARCH_HOSTYOUR_ELASTICSEARCH_PORT를 Elasticsearch의 호스트 및 포트로 대체하세요.
  3. Nginx Ingress Controller 설정
    • Nginx Ingress Controller에 ModSecurity 옵션을 활성화하려면 nginx.ingress.kubernetes.io/modsecurity-snakeoil annotation을 추가합니다.
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example-ingress
        annotations:
          nginx.ingress.kubernetes.io/modsecurity-snakeoil: "true"
      spec:
        rules:
        - host: your_domain.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: your-service
                  port:
                    number: 80
  4. ModSecurity 규칙 관리
    • ModSecurity 규칙을 관리하려면 main.conf 파일에 규칙을 추가하고 이 파일을 Nginx Ingress에 연결하세요.
      SecRuleEngine On
      SecAuditEngine RelevantOnly
      SecAuditLog /var/log/modsec_audit.log
    • 필요한 규칙은 ModSecurity 커뮤니티에서 다운로드할 수 있습니다.
  5. 적용 및 테스트
    • 설정을 적용하려면 Nginx Ingress Controller를 새로고침하거나 Pod를 다시 시작하세요.
      kubectl rollout restart deployment <nginx-ingress-controller-deployment>
    • ModSecurity가 활성화되고 Fluentd가 Elasticsearch에 로그를 전송하는지 확인하려면 요청을 보내고 로그를 확인하세요.

이제 Nginx Ingress에서 ModSecurity를 사용하여 보안을 강화하고, Fluentd를 통해 Elasticsearch에 Audit 로그를 수집하고 검색할 수 있게 되었습니다.

728x90

댓글