Debian/Ubuntu에서 Nginx용 ModSecurity를 설치하는 방법


위협으로부터 안전한 보안 웹 애플리케이션을 배포하는 것은 모든 개발자의 바람입니다. "대부분의 경우 이것은 말처럼 쉽지 않습니다. "해커가 마음대로 모든 공격 벡터를 계속 악용함에 따라 웹사이트가 해킹되는 빈도가 계속 증가하고 있습니다.

WebApp 보안은 특히 루트킷, 스캐너, 봇 및 기타 맬웨어와 같은 악성 도구의 확산으로 인해 큰 도전이 될 수 있습니다. 침해를 받는 것은 그렇지 않은 경우의 문제처럼 보일 수 있지만 웹 애플리케이션을 보호하기 위해 몇 가지 적절한 보안 조치를 구현하는 것이 현명합니다.

[당신은 또한 좋아할 수도 있습니다: 맬웨어 및 루트킷에 대해 Linux 서버를 스캔하는 5가지 도구 ]

공격에 대해 적절한 수준의 보안을 제공할 수 있는 도구 중 하나는 ModSecurity입니다. 이것은 XSS(교차 사이트 스크립팅), SQL 주입, 세션 하이재킹 등과 같은 광범위한 계층 7 공격으로부터 웹 응용 프로그램을 보호하는 무료 오픈 소스 WAF(웹 응용 프로그램 방화벽)입니다.

이 가이드에서는 Ubuntu와 같은 데비안 기반 Linux 배포판에서 Nginx와 함께 작동하도록 ModSecurity를 설치하고 구성하는 방법을 보여줍니다.

1단계: 종속성 설치

설치를 시작하려면 설치에 성공하기 위해 여러 소프트웨어 종속성이 필요합니다. 그러나 먼저 다음과 같이 패키지 목록을 업데이트하고 리포지토리를 새로 고칩니다.

$ sudo apt update

다음으로 다음과 같이 종속성을 설치합니다.

$ sudo apt install make gcc build-essential autoconf automake libtool libfuzzy-dev ssdeep gettext pkg-config libcurl4-openssl-dev liblua5.3-dev libpcre3 libpcre3-dev libxml2 libxml2-dev libyajl-dev doxygen libcurl4 libgeoip-dev libssl-dev zlib1g-dev libxslt-dev liblmdb-dev libpcre++-dev libgd-dev

2단계: 최신 Nginx 버전 설치


"다음 단계는 Nginx 웹 브라우저를 설치하는 것입니다. 최신 버전을 설치하려면 2000년부터 데비안 개발자가 현재 유지 관리하고 있는 ondrej/nginx-mainline PPA w에서 설치합니다.

로컬 Ubuntu 시스템에 PPA를 추가하려면 다음 명령을 실행합니다.

$ sudo add-apt-repository ppa:ondrej/nginx-mainline -y

다음으로 패키지 목록을 업데이트하고 다음과 같이 최신 버전의 Nginx를 설치합니다.

$ sudo apt update
$ sudo apt install nginx-core nginx-common nginx nginx-full

일반적으로 기본 리포지토리만 활성화됩니다. 나중에 다음 단계에서 Nginx 소스 코드를 다운로드할 수 있도록 소스 코드 저장소를 활성화하는 것이 좋습니다.

이를 달성하려면 Nginx 리포지토리 파일을 수정하십시오.

$ sudo vim /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list

소스 코드 리포지토리를 활성화하려면 이 줄을 찾아 주석 처리를 제거합니다.

# deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main

이제 파일이 표시된 대로 표시되어야 합니다.

변경 사항을 저장하고 종료합니다.

그런 다음 패키지 색인을 업데이트하십시오.

$ sudo apt update

3단계: Nginx 소스 패키지 다운로드

ModSecurity 동적 모듈을 컴파일하려면 Nginx 소스 코드 패키지를 다운로드해야 합니다. 이를 위해 먼저 Nginx 소스 코드 패키지 파일을 수용할 /usr/local/src/ 경로에 Nginx 디렉토리를 생성합니다.

$ sudo mkdir -p /usr/local/src/nginx 

그런 다음 그림과 같이 디렉터리 권한을 할당합니다. "사용자 이름을 실제 sudo 사용자 이름으로 바꾸십시오.

$ sudo chown username:username -R /usr/local/src/

그런 다음 Nginx 소스 디렉터리로 이동합니다.

$ cd /usr/local/src/nginx 

Nginx 소스 파일 패키지를 진행하고 다운로드하십시오.

$ sudo apt source nginx

다음 오류가 발생할 가능성이 큽니다.

W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

이것은 당신을 일하게 만들 아무것도 아닙니다. 따라서 오류를 무시하십시오.

ls 명령을 사용하여 소스 파일을 엿볼 수 있습니다.

$ ls -l

소스 코드 버전이 설치된 Nginx 버전과 일치하는지 확인하십시오.

$ nginx -v

4단계: Libmodsecurity3 라이브러리 설치

Libmodesecurity는 애플리케이션에 대한 HTTP 필터링을 처리하는 Modsecurity 라이브러리입니다. "설치 방법은 2가지가 있습니다. "다음과 같이 apt 패키지 관리자를 사용할 수 있습니다.

$ sudo apt install libmodsecurity3

다른 접근 방식은 최신 버전을 제공하므로 소스에서 설치하는 것입니다. 소스에서 Libmodsecurity 설치를 시작하려면 다음과 같이 git 리포지토리를 복제합니다.

$ git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/

복제된 디렉터리로 이동합니다.

$ cd /usr/local/src/ModSecurity/

서브모듈을 설치하도록 하십시오.

$ sudo git submodule init
$ sudo git submodule update

이후 아래 명령어를 사용하여 환경을 구축합니다.

$ sudo ./build.sh 
$ sudo ./configure

다시 한 번, 아래 표시된 오류를 무시하십시오.

fatal: No names found, cannot describe anything.

그런 다음 소스 코드를 컴파일하고 다음 make 명령을 사용하여 다른 유틸리티를 설치합니다. 약 25분이 소요되며 약간의 인내가 필요합니다.

$ sudo make -j4

완료되면 라이브러리를 설치합니다.

$ sudo make install

5단계: ModSecurity v3 Nginx 커넥터 다운로드 및 컴파일

다음 단계는 ModSecurity Nginx 커넥터를 다운로드하고 컴파일하는 것입니다. 커넥터는 이름에서 알 수 있듯이 Libmodsecurity 라이브러리를 Nginx 웹 서버에 연결합니다. Modsecurity 커넥터를 다운로드하려면 다음과 같이 GitHub 리포지토리에서 복제합니다.

$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/

복제된 디렉터리로 이동합니다.

$ cd /usr/local/src/nginx/nginx-1.21.3/

빌드 종속성 진행 및 설치

$ sudo apt build-dep nginx
$ sudo apt install uuid-dev

다음으로, --with-compat 플래그를 사용하여 ModSecurity Nginx 커넥터 모듈을 컴파일하십시오. --with-compat 옵션은 ModSecurity Nginx 커넥터 모듈을 현재 Nginx 라이브러리와 바이너리 호환 가능하게 만듭니다.

$ sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx

완료되면 make 명령을 사용하여 ModSecurity Nginx 커넥터 모듈을 빌드하십시오.

$ sudo make modules

모듈은 objs/ngx_http_modsecurity_module.so로 저장됩니다. "이 모듈을 다음과 같이 /usr/share/nginx/modules/ 디렉토리에 복사해야 합니다.

$ sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/

6단계: ModSecurity Nginx 커넥터 모듈 로드

Nginx 커넥터 모듈을 로드하려면 먼저 기본 Nginx 구성 파일에 액세스합니다.

$ sudo vim /etc/nginx/nginx.conf

처음 몇 줄 바로 아래에 다음 줄을 추가합니다.

load_module modules/ngx_http_modsecurity_module.so;

또한 http {...} 섹션에 다음 줄을 추가합니다. 이것은 모든 Nginx 가상 호스트에 대해 ModSecurity를 활성화합니다.

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

변경 사항을 저장하고 파일을 종료합니다.

다음으로 ModSecurity 구성을 저장할 /etc/nginx/modsec/ 디렉토리를 만듭니다.

$ sudo mkdir /etc/nginx/modsec/

다음으로 ModSecurity 구성 파일을 다음과 같이 복사합니다.

$ sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf

그런 다음 구성 파일을 엽니다.

$ sudo vim /etc/nginx/modsec/modsecurity.conf

SecRuleEngine 지시문으로 시작하는 줄을 찾습니다.

SecRuleEngine DetectionOnly

이 줄은 ModSecurity에게 HTTP 트랜잭션만 기록하도록 지시하지만 웹 앱 공격에 직면했을 때 아무 조치도 취하지 않습니다. Modsecurity가 웹 공격을 탐지할 뿐만 아니라 차단할 수 있도록 변경해야 합니다.

줄을 아래 줄로 변경

SecRuleEngine On

변경 사항을 저장하고 파일을 종료합니다.

다음으로 /etc/nginx/modsec/main.conf 파일을 생성합니다.

$ sudo vim  /etc/nginx/modsec/main.conf

/etc/nginx/modsec/modsecurity.conf 구성 파일을 참조하려면 이 줄을 추가하십시오.

Include /etc/nginx/modsec/modsecurity.conf

변경 사항을 저장하고 파일을 종료합니다.

또한 유니코드 매핑 파일을 복사합니다.

$ sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/

그런 다음 Nginx 구성을 테스트합니다.

$ sudo nginx -t

테스트가 성공해야 합니다. 그렇지 않은 경우 돌아가서 모든 변경 사항이 올바른지 확인하십시오.

그런 다음 마지막으로 Nginx를 다시 시작하여 모든 변경 사항을 적용합니다.

$ sudo systemctl restart nginx

그리고 Nginx가 예상대로 실행되고 있는지 확인하십시오.

$ sudo systemctl status nginx

7단계: OWASP 코어룰 세트 다운로드

ModSecurity가 웹 애플리케이션을 보호하려면 의심스러운 활동을 감지하고 차단할 규칙을 지정해야 합니다. 시작하려면 로프를 배우는 데 도움이 될 기존 규칙 세트를 설치하는 것이 좋습니다.

OWASP CRS(핵심 규칙 집합)는 SQL 주입, XSS(교차 사이트 스크립팅)와 같은 일반적인 공격 벡터를 방지하기 위한 규칙을 제공하는 무료 오픈 소스 및 커뮤니티 유지 규칙 집합입니다.

wget 명령을 사용하여 표시된 대로 Github에서 OWASP Core Rule Set을 다운로드합니다.

$ wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz

압축 파일을 추출합니다.

$ tar xvf v3.3.0.tar.gz

압축되지 않은 디렉토리를 /etc/nginx/modsec/ 경로로 이동해야 합니다.

$ sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/

그런 다음 crs-setup.conf.example 파일의 이름을 crs-setup.conf로 바꿉니다.

$ sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf

다시 ModSecurity 구성 파일로 돌아가십시오.

$ sudo vim /etc/nginx/modsec/main.conf

그리고 다음 줄을 추가합니다.

Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf

이제 파일에 3줄이 있어야 합니다.

파일을 저장하고 다시 한 번 Nginx를 다시 시작합니다.

$ sudo systemctl restart nginx

8단계: ModSecurity 테스트

마지막으로 ModSecurity 테스트를 수행하여 의심스러운 HTTP 트래픽을 감지하고 차단할 수 있는지 확인합니다.

ModSecurity 구성 파일을 편집하고 웹 브라우저에서 액세스할 때 특정 URL에 대한 액세스를 차단하는 차단 규칙을 만들 것입니다.

$ sudo vim /etc/nginx/modsec/modsecurity.conf

SecRuleEngine On 지시문 바로 아래에 이 줄을 추가하십시오.

SecRule ARGS:testparam "@contains test" "id:254,deny,status:403,msg:'Test Successful'"

'id' 및 'msg' 태그를 원하는 값으로 설정할 수 있습니다.

변경 사항을 저장하고 Nginx를 다시 시작하십시오.

$ sudo systemctl restart nginx

이제 브라우저를 실행하고 ?testparam=test 접미사가 있는 아래 URL을 방문하십시오.

http://server-ip/?testparam=test

403 '금지됨' 오류가 발생해야 합니다. 이것은 웹 서버에서 금지된 리소스에 액세스하려고 시도하고 있음을 나타냅니다.

또한 Nginx 오류 로그를 확인하여 클라이언트가 차단되었는지 확인할 수 있습니다.

$ cat /var/log/nginx/error.log | grep "Test Successful"

[ 당신은 또한 좋아할 수도 있습니다: Debian/Ubuntu에서 Apache로 ModSecurity를 설정하는 방법 ]

여기까지가 Debian 및 Ubuntu에서 Nginx로 Modsecurity를 설정하는 방법에 대한 개요였습니다. "이것이 도움이 되었기를 바랍니다.