WAF(Web Application Firewall) Naxsi
Web과 RestAPI 서비스는 외부에서 제한 받지 않은 모든 트래픽을 수용한다. 특히 Web 서비스는 불특정 다수가 접근할 수 있을 수 있다. Web 서비스는 운영을 위해 다양한 매개변수를 처리할 뿐만 아니라, 데이터베이스에 능동적 접근을 비롯, 다양한 기능을 제공하기 위한 인프라를 갖고 있다.
처음부터 완벽하게 환경을 구축하고, 빈틈 없는 프로그램을 설계 및 개발했다면 문제는 없을 것이다. 하지만, 모든 매개변수를 완벽하게 체크할 수 없고 서버에 사용된 언어가 완전 무결하지 않기 때문에 언제나 허점은 존재할 수 밖에 없다.
Firewall
일반적으로 외부 침입을 효과적으로 차단하기 위해 사용되는 것이 방화벽이다. Network Layer 에 위치해 불순한 접근을 차단함으로써 하위 장비들을 안전하게 보호할 수 있다. 하지만 Network Firewall 은 ‘안전한 것으로 간주된’ 공격을 막을 수는 없다.
Web Application Firewall
Network Firewall은 포트를 차단한다거나, 트래픽을 제한할 수 있다. 하지만 앞서 언급한 것 과 같이 ‘안전한 것으로 보이는 접근’을 막을 수는 없다. 최근 Web 이나 RestAPI 서버를 공격하는 주된 패턴은 일반적인 형태를 취하고 있어 Firewall 을 우회하고, 일반적으로 잘 알려진 취약점을 노리게 된다.
<?php include $_REQUEST['folder']."/common.inc" ;?>
위와 같은프로그램은 다음의 공격이 가능하다
http://server/test.php?folder=/etc/passwd ..
공격 툴은 수만가지 샘플로 사이트를 공격하게 되며, 그 중 하나만 발견되도 서비스에는 큰 영향을 미치게 된다. 이와 같이 Application 의 취약점을 효과적으로 차단 하기 위해 Application Firewall 이 개발 되었는다, 다음과 같은 공격을 대비할 수 있다
- SQL Injection
- Upload
- Evading
- RFI (Remote File Inclusion)
- Directory Traversal
- XSS (Cross site Scripting)
Web Application Firewall(이하 WAF) 각각의 서버에 맞는 모듈이 공개되어 있는데, NginX 기반으로 동작하는 고성능 WAF 인 Naxsi 에 대해 알아보자.
NAXSI
메이커에서 임대 혹은 판매하고 있는 WAF는 편하지만 고가이며, 성능이 그리 훌륭하지 않다. 때문에 여러 오픈소스 WAF 가 공개되어 있는데, Apache 에는 mod_security 가 있고, Nginx 에는 Naxsi 가 있다. 이 글에서 언급할 Naxsi의 정확한 명칭은 Nginx Anti Xss & Sql Injection 로써, 높은 효율과 더불어 기능이 좋아 Web/RestAPI 등을 방어하는데 효과적으로 사용되고 있다. 단지 설정 및 관리가 어려울 뿐이지 ..
Naxsi는 1MB 가 채 되지 않는 크기로 Apache 의 mod_security 보다 월등히 성능이 좋고, NginX를 독립적으로 사용했을 때와 그리 큰 성능 차이를 보이지 않는다는 장점이 있다.
NGINX
|
NGINX+NAXSI
|
성능차이
|
|
---|---|---|---|
RPS | 8687.21 | 7866.73 | 9.4% |
TPR | 0.115 | 0.127 | 9.4% |
전송률 | 1220.48 | 1198.45 | 1.8% |
총 시간 | 1.151s | 1.271s | 9.4% |
다음의 자료는 Apache Bench 기준으로 긴 URL 에 대해 동시에 1,000 건의 요청을 10,000번 요청했을 때의 성능 차이다.
구성도
NAXSI는 크게 두가지 동작 모드를 갖는다. 처음 Whitelist Rules/Blacklist Rules을 생성하기 위해 ‘러닝’모드와, Rules을 실제 서비스에 반영하는 “서비스모드”다.
- “해커”가 정상적인 경로를 통해 접근한다. Security Group/Network Firewall은 이상을 감지할 수 없다.
- NginX가 Naxsi의 룰을 체크한다
- 사용자의 트래픽 정보를 Naxsi의 Interceptor로 필터링한다.
- Interceptor은 Rule에 부합하는지 검사한다
- Naxsi는 통계 및 기반 자료를 DB 에 기록한다
- Interceptor는 통계 자료를 추출 가능한 형태로 가공한다
- 결과 코드를 리턴한다
- 접근 가능 여부에 대한 결과를 사용자에게 보여준다
붉은 색으로 표시된 부분이 “러닝”모드며, 서비스 모드는 “6번에 지정된 룰을 검사한다” 정도가 추가된다. 참고로, 아래의 흐름은 AWS 기반의 HA 구성 되어 있는 서비스에서 구현한 예로, 분석을 위한 DB에 Sqlite를 사용했으며, 한곳에 모으기 위해 S3 를 로컬에 마운트 한다는 것을 가정으로 했다.
설치
AWS 에서 Ubuntu 를 사용하고 있다면 설치는 단 몇줄의 커맨드만으로 끝난다.
sudo apt-get install nginx-full naxsi
간단하지 않은가. apt-get 으로 설치하면 서비스 까지 재시작 해 준다. 설정은 룰을 활성화만 하면 되는데, 주석을 풀어주는 정도로 해결이 가능하다.
nginx.conf
... http { ## NAXSI Security include /etc/nginx/naxsi_core.rules; ...
naxsi-ui.conf (sqlite 를 사용했ㄷ)
... dbtype = sqlite username = root password = hostname = 127.0.0.1 dbname = /mnt/s3/result/naxsi.db/naxsi_sig ...
처음에 naxsi.rules 에 LearningMode; 가 기본이기 때문에 건드릴 필요 없이 Naxsi 는 학습 모드로 동작할 것이다.
감지된 Log와 Rules
NginX 의 error_log에 비 정상적인 로그가 남게 되는데, 통계는 naxsi-ui 로 확인할 수 있다.
- 도메인 별 침입을 가려, 효과적인 차단이 가능하다
- WebUI 로 확인 가능하다
그리고 반복되는 공격 패턴을 Rules 에 설정함으로서 적용할 수 있다
로그
기본 룰
결과
WebUI 를 통해서 현재까지 쌓인 공격 수단과 방법, IP 를 알 수 있다. 더욱이 GeoIP 를 연동하면 그 국가에 붉은색 점을 표시한다.
이제 RulesSet 이 지정 되었다면, 러닝 모드에 주석만 처리함으로써 실질적으로 서비스를 Naxsi 로 보호할 수 있다. 언젠가 AWS 에도 WAF 서비스를 하지 않을까 싶긴 한데. 뭐 지금 당장엔 없으니!