ModSecurity 로그를 Elasticsearch에 저장하고 Kibana를 사용하여 검색 및 보고서를 생성하는 방법에 대한 요구 사항은 다음과 같습니다.
- ModSecurity 버전 3 및 Nginx 사용
- "Audit Log" 구성
- ModSecurity 로그를 Elasticsearch로 전송하는 Python 스크립트 사용
이 설정은 ModSecurity 2.9 및 Apache가 아닌 Nginx 및 Libmodsecurity (또는 ModSecurity v3)를 기반으로 합니다.
Audit Log 구성 및 Python 스크립트를 사용하여 ModSecurity 로그를 Elasticsearch로 전송하는 방법을 보여줍니다. 이후 Kibana를 사용하여 검색 및 보고서 생성이 가능합니다.
- 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
: 각 로그 파일의 대상 디렉토리를 설정합니다.
- 디렉토리 및 권한 설정
다음 디렉토리를 생성하고 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/*
는 해당 경로의 모든 하위 디렉토리와 파일에 대한 소유자를nobody
및nogroup
으로 설정합니다. - Nginx 구성 리로드
Nginx 구성을 다시 로드하면SecAuditLogStorageDir
경로에 많은 JSON 형식의 파일이 생성됩니다.
이제 감사 로그 파일을 파싱하고 Elasticsearch로 전송할 시간입니다.
- 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'])
- elasticsearch-py SDK 설치
만약 설치되어 있지 않다면, elasticsearch-py SDK를 설치해야 합니다. pip를 사용하여 설치할 수 있습니다. (apt-get install python-pip가 필요할 수 있습니다.)pip install elasticsearch
- 스크립트 실행
다음 명령을 사용하여 스크립트를 실행합니다.<auditlog directory>
는 ModSecurity 감사 로그가 저장된 디렉토리입니다.
이 스크립트는 간단하게 "-d" 디렉토리에 있는 각 파일을 재귀적으로 읽고 파일 내용에서 JSON을 로드한 다음 elasticsearch-py 모듈을 사용하여 Elasticsearch로 전송합니다. "messages" 목록을 여러 다른 배열로 변환하여 "객체 배열" 문제를 해결합니다. 스크립트를 시작하면 다음과 같은 출력이 표시됩니다.python modsec_parser.py -d <auditlog directory>
이는 매일 인덱스를 생성하고 해당 날짜에 파일이 읽힌 날짜로 인덱스에 모든 수신 로그를 작성합니다. 모든 로그를 단일 인덱스에 저장해야 하는 경우 이를 변경할 수 있습니다. - 백그라운드에서 실행
백그라운드에서 스크립트를 실행하려면 다음과 같이합니다.
이 명령은 스크립트를 백그라운드에서 실행하고 출력을 무시합니다.python modsec_parser.py -d <auditlog directory> > /dev/null 2>&1 &
이제 다음과 같이 인덱스 패턴을 구성해야 합니다.
- Kibana에서 인덱스 패턴 설정
- Kibana 대시보드로 이동하고 "Management" 섹션에서 "Index Patterns"을 선택합니다.
- "Create Index Pattern"을 클릭합니다.
- "Index pattern" 필드에
modsecurity_*
와 같은 패턴을 입력하고 "Next step"을 클릭합니다. - "Time Filter field name"에서 "unixts"를 선택하고 "Create index pattern"을 클릭합니다.
- 검색 및 보고서 생성
- 이제 Kibana 대시보드에서 "Discover" 섹션으로 이동하여 검색을 시작할 수 있습니다.
- ModSecurity 로그 확인
- "Discover" 섹션에서는 ModSecurity 로그를 자세히 볼 수 있습니다. 필요한 필드를 선택하고 해당 로그를 확인할 수 있습니다.
- msg.tags 필드에 대한 쿼리
- "Discover" 섹션에서 "msg.tags" 필드에 대한 쿼리를 수행할 수 있습니다. 예를 들어, 특정 태그를 가진 로그를 검색하는 쿼리를 작성할 수 있습니다.
- msg.tags 필드로 분할된 파이 차트 생성
- "Visualize" 섹션으로 이동하여 "Create a visualization"을 선택합니다.
- "Pie chart"를 선택하고 "msg.tags" 필드를 사용하여 파이 차트를 생성합니다.
- 필요에 따라 차트를 구성하고 저장한 다음 대시보드에 추가할 수 있습니다.
이제 Kibana를 사용하여 ModSecurity 로그에 대한 검색 및 시각화를 시작할 수 있습니다.
Nginx Ingress에서 ModSecurity를 활성화하고, ModSecurity Audit 로그를 Elasticsearch에 Fluentd를 사용하여 수집하는 방법은 다음과 같습니다. 이를 위해서는 Kubernetes 클러스터와 관련된 설정도 함께 고려해야 합니다.
- 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 } } }
- 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_HOST
및YOUR_ELASTICSEARCH_PORT
를 Elasticsearch의 호스트 및 포트로 대체하세요.
- Fluentd를 Elasticsearch에 연결하려면 먼저 Fluentd를 설치하고 Elasticsearch 플러그인을 추가해야 합니다.
- 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
- Nginx Ingress Controller에 ModSecurity 옵션을 활성화하려면
- ModSecurity 규칙 관리
- ModSecurity 규칙을 관리하려면
main.conf
파일에 규칙을 추가하고 이 파일을 Nginx Ingress에 연결하세요.SecRuleEngine On SecAuditEngine RelevantOnly SecAuditLog /var/log/modsec_audit.log
- 필요한 규칙은 ModSecurity 커뮤니티에서 다운로드할 수 있습니다.
- ModSecurity 규칙을 관리하려면
- 적용 및 테스트
- 설정을 적용하려면 Nginx Ingress Controller를 새로고침하거나 Pod를 다시 시작하세요.
kubectl rollout restart deployment <nginx-ingress-controller-deployment>
- ModSecurity가 활성화되고 Fluentd가 Elasticsearch에 로그를 전송하는지 확인하려면 요청을 보내고 로그를 확인하세요.
- 설정을 적용하려면 Nginx Ingress Controller를 새로고침하거나 Pod를 다시 시작하세요.
이제 Nginx Ingress에서 ModSecurity를 사용하여 보안을 강화하고, Fluentd를 통해 Elasticsearch에 Audit 로그를 수집하고 검색할 수 있게 되었습니다.
728x90
댓글