
ML 기반 피드백 WAF의 첫 번째 반복
NGWAF는 @yupengfei, @zhangbosen, @matthewng 및 @elizabethlim에 의해 만들어졌습니다.
특별히 @ruinahkoh에게 NGWAF 초기 단계에 기여해 주신 점에 감사드립니다.
NGWAF는 실험적인 개념 증명이며 현재 형태로는 프로덕션 사용에 적합하지 않습니다.
목차
2000년대 초반 이후 웹 애플리케이션의 폭발적인 성장과 함께 웹 기반 공격은 점점 더 만연해지고 있습니다. 일반적인 해결책 중 하나는 웹 애플리케이션 방화벽(WAF)입니다. 그러나 현재 WAF의 규칙을 수정하여 탐지 메커니즘을 개선하는 것은 복잡하고 어려울 수 있습니다. NGWAF는 새로운 머신러닝 및 격리-허니팟 기반 아키텍처를 통해 이러한 단점을 해결하고자 합니다.
실제 WAF 운영의 어려움에서 영감을 받은 NGWAF는 다음 프로세스를 통해 WAF 운영을 단순화하고 재구성하고자 합니다:
| 문제점 | NGWAF 기능 |
|---|---|
| 탐지 메커니즘 및 규칙 유지 관리가 복잡할 수 있음 | 머신러닝을 활용하여 탐지 메커니즘 생성 및 업데이트 프로세스 자동화 |
| 악성 트래픽의 즉각적인 차단은 향후 WAF 개선을 위한 위협 행위자 행동 학습 기회를 줄임 | 기존 악성 트래픽의 드롭 및 차단 대신 리디렉션된 격리를 통한 위협 제거 |
배포를 간단하고 이식 가능하게 만들기 위해 아키텍처의 다양한 구성 요소를 docker를 사용하여 컨테이너화하고 docker-compose 파일로 구성했습니다. 이렇게 하면 종속성이 docker에 의해 자동으로 처리되므로 새로 설치 시 빠르고 쉽게 실행할 수 있습니다. 배포는 로컬 또는 클라우드 제공업체 기반 쿠버네티스 클러스터로 확장할 수 있어 사용자가 많은 양의 트래픽을 처리하기 위해 노드/팟 수를 늘릴 수 있어 확장성이 뛰어납니다.
배포는 macOS(Docker Desktop), linux(ubuntu)에서 테스트되었습니다.
NGWAF는 세 가지 주요 구성 요소로 즉시 실행되며, 위에서 언급한 구성 요소는 모두 컨테이너화되어 원하는 사용량에 따라 확장 가능합니다. 보호 대상 리소스는 설정 내에서 배포 변경을 통해 사용자 지정할 수 있습니다.
다양한 당사자의 예상 트래픽 흐름을 포함한 NGWAF의 높은 수준 아키텍처
NGWAF는 다음과 같은 주요 사용자 이점을 염두에 두고 설계되었습니다:
NGWAF는 기존 규칙 세트를 딥러닝 모델로 대체하여 규칙 관리 및 업데이트의 복잡성을 줄입니다. 규칙을 수동으로 편집하는 대신 NGWAF의 머신러닝이 악성 데이터로부터 패턴 학습 프로세스를 자동화합니다. 격리 환경에서 수집된 데이터는 자동으로 정리되고 배치되어 필요에 따라 탐지 모델에 재학습될 수 있습니다.
NGWAF는 잠재적인 적대적 공격자를 격리하기 위해 구축된 대화형 격리 환경으로 구성된 새로운 아키텍처를 채택합니다. 탐지 시 차단하는 기존 WAF와 달리 NGWAF는 위협 행위자를 에뮬레이션된 시스템으로 전환하여 그들을 가두어 악의적인 행동의 영향을 완화시킵니다. 이 환경은 또한 현재 공격 방법을 수집하는 싱크홀 역할을 하여 악성 데이터의 관찰 및 수집을 가능하게 합니다. 이 데이터는 NGWAF의 탐지 능력을 더욱 향상시키는 데 사용될 수 있습니다.
작동 중인 NGWAF: SQL 인젝션 탐지 시 NGWAF는 시도를 드롭하거나 차단하는 대신 격리 환경으로 리디렉션합니다.
NGWAF 제작의 기본 원칙은 Open Web Application Security Project의 표준 인식 문서인 OWASP Top 10 2021에서 강조된 위험으로부터 보호하는 것입니다.
NGWAF의 학습 데이터 및 규정 준수 확인은 이 요구 사항을 기반으로 수집 및 수행됩니다.
수동이 필요할 때 뉴럴로 가자
시간이 지남에 따라 분석가가 수동으로 식별하고 규칙을 추가해야 하는 기존 규칙 세트 대신 NGWAF는 탐지 메커니즘에 종단 간 머신러닝 파이프라인을 활용하여 WAF 규칙 관리, 특히 복잡한 페이로드 탐지의 복잡성을 크게 줄입니다.
이를 위해 먼저 사용자가 시작할 수 있는 기본 모델과 아키텍처를 만든 후, 나중에 자체 애플리케이션에서 수집한 데이터를 재학습 및 미세 조정에 사용할 수 있도록 해야 했습니다:
기본 모델의 일반적인 아키텍처는 아래와 같은 양방향 LSTM 모듈을 가진 간단한 RNN입니다:
Tensorflow에서 가져온 이미지 (링크)
이 RNN 아키텍처를 사용하여 더 간단한 모델보다 성능 향상을 달성할 수 있었습니다:
| 모델 아키텍처 | 정확도 |
|---|
다양한 애플리케이션의 로그를 포함하여 기본 모델의 일반화 가능성을 개선했지만, 모델의 추가 유지 관리 및 재학습은 다음을 위해 중요합니다:
이를 해결하기 위해 NGWAF 사용자는 패키지화된 종단 간 모델 재학습 파이프라인의 이점을 누릴 수 있으며, 내부를 깊이 들여다볼 필요 없이 몇 가지 간단한 단계로 모델 유지 관리를 쉽게 트리거할 수 있습니다. (아래 섹션 3 참조).
놓아주지 마라, 그들을 구금하라!
악성 트래픽이 즉시 차단되거나 드롭되는 기존 WAF와 달리 NGWAF는 더 유연한 접근 방식을 취합니다. 즉, 악성 행위자를 격리 환경으로 리디렉션하고 구금합니다. 이 환경은 다양한 대화형 에뮬레이션 허니팟으로 구성되어 더 많은 공격 방법/데이터를 수집하려고 시도하며, 이 데이터는 NGWAF의 보다 현대적이고 복잡한 공격 탐지율을 잠재적으로 향상시키는 데 사용됩니다.
현재 NGWAF의 격리 환경은 포획된 공격자가 제출한 모든 데이터를 분석 및 시각화를 위해 ELK 스택으로 전달합니다. 데이터는 HTTP 요청의 다양한 구성 요소로 자동 정리된 후 내부적으로 환경의 백엔드에서 JSON 형식으로 패키징된 후 전달됩니다. 이는 재학습 프로세스를 시작할 때 데이터를 정리하고 인덱싱하는 데 필요한 인건비를 낮추는 데 도움이 됩니다.
NGWAF는 현재 사용자가 격리 환경 내 허니팟의 프론트엔드 측면의 모양과 느낌을 변경할 수 있도록 합니다(사용자 정의 버전의 drupot 기반). 사용자는 docker 볼륨 내의 assets 폴더를 원하는 프론트엔드 자산으로 교체하기만 하면 됩니다.
NGWAF는 또한 격리 환경의 일부로 자체 허니팟을 연결하려는 사용자를 수용합니다. 사용자는 허니팟의 HTTP 요청을 환경의 백엔드 서버로 전달하기만 하면 됩니다(백엔드 프로세스는 자동으로 데이터를 정리하고 분석 대시보드(ELK 스택)로 전달합니다).
똑똑한 것은 계속 배울 수 있을 때 비로소 똑똑한 것이다
새로운 페이로드와 공격 벡터가 등장함에 따라 보안을 보장하기 위해 탐지 기능을 업그레이드하는 것이 중요합니다. 따라서 재학습 기능이 NGWAF에 내장되어 방어자가 머신러닝 모델을 훈련하여 새로운 페이로드를 탐지할 수 있도록 합니다. 데이터 과학이나 신경망에 익숙하지 않은 사용자도 이 간단한 인터페이스를 통해 모델을 미세 조정할 수 있으며, 복잡한 단계는 자동으로 처리됩니다.
사용자는 자체 라이브 시스템에서 소량의 레이블이 지정된 데이터 샘플(예: 수천 개 정도)을 업로드하기만 하면 백엔드에서 기존 모델을 미세 조정하는 데 사용됩니다:
훈련이 완료되면 사용자는 새 모델을 평가할 수 있도록 몇 가지 간단한 모델 진단(예: 테스트 세트 및 다양한 점수 임계값에서의 성능)도 제공받습니다.
재학습 프로세스를 트리거하려면 대시보드로 이동하여 다음 단계를 따르세요:
payload [str]: 시스템의 페이로드이거나 일부 문자열 기반 예제(예: SQLi 인젝션 예제)이어야 합니다.label [int]: 비악성 예제의 경우 0, 악성 예제의 경우 1이어야 합니다.is_url [bool]: 페이로드가 시스템에서 온 경우(즉, 경로 및 장치와 같은 다른 시스템 정보 포함) TRUE, 문자열 기반 예제(예: "1==1")인 경우 FALSE여야 합니다.http://localhost:8088로 이동하여 NGWAF 관리 패널을 봅니다.
NGWAF는 ELK 스택을 사용하여 NGWAF를 통과하는 네트워크 데이터의 로그를 캡처하여 사용자가 추가 분석을 위해 NGWAF를 통과하는 트래픽을 모니터링할 수 있도록 합니다.
NGWAF는 또한 실시간 텔레그램 알림 기능을 제공하여 NGWAF가 탐지한 실시간 악성 위협에 대해 소유자에게 알려줍니다.
테스트된 운영 체제
Docker가 실행 중인 상태에서 다음 명령어를 사용하여 파일을 실행하세요:
./run.sh
대상을 변경하려면 /waf/WafApp/waf.py 파일에서 dest_server 및 honey_pot_server 변수를 올바른 대상으로 지정하세요:
# 나를 교체하세요
dest_server = "dvwa"
honey_pot_server = "drupot:5000"
Docker 컨테이너가 실행되면 localhost를 방문할 수 있으며, 다음 포트에서 이러한 서비스가 실행 중입니다:
또한 waf-secrets.env 파일에 다음을 설정하세요:
# ML MODEL API ENDPOINT
API_ENDPOINT="https://xxxxx.xxx"
API_KEY="******************"
# TELEGRAM CONFIG
TELEGRAM_CHAT_ID="-57893457893457345"
TELEGRAM_TOKEN="******************"
또한 waf-admin-secrets.env 파일에 다음을 설정하세요:
# ML MODEL API ENDPOINT
API_ENDPOINT="https://xxxxxx.xxx"
API_KEY="******************"
BUCKET_NAME="******************"
ACCESS_KEY_ID="******************"
SECRET_ACCESS_KEY="******************"
SQL_USERNAME="******************"
SQL_PASSWORD="******************"
SQL_SERVER="******************"
SQL_DATABASE_NAME="******************"
NGWAF는 작업 진행 중인 오픈 소스 프로젝트이며, 기능 및 특징은 패치에 따라 변경될 수 있습니다. 기여에 관심이 있으시면 언제든지 이슈를 생성하거나 풀 리퀘스트를 제출해 주세요!
| F1 점수 |
|---|
| 최종 모델 | 0.995 | 0.993 |
| LSTM 모듈이 없는 신경망 | 0.956 | 0.891 |
| 결정 트리 | 0.878 | 0.840 |
| 로지스틱 회귀 | 0.946 | 0.914 |
| 포트 | 서비스 | 설명 | 자격 증명 (해당하는 경우) |
|---|
| 8080 | DVWA | WAF가 있는 곳 | admin:password |
| 5601 | Elasticsearch | 로그 보기 | elastic:changeme |
| 8088 | 관리 대시보드 | WAF 모델을 관리하는 대시보드 | |
| 5001 | Drupot | 허니팟 |