웹사이트 검색

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


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

웹앱 보안은 특히 루트킷, 스캐너, 봇 및 기타 악성 코드와 같은 악성 도구가 널리 퍼져 있는 상황에서 큰 문제가 될 수 있습니다. 침해당하는 것은 언제가 문제인지 아닌지의 문제로 보일 수 있지만, 웹 애플리케이션을 보호하기 위해 적절한 보안 조치를 구현하는 것이 현명합니다.

공격에 대해 적절한 수준의 보안을 제공할 수 있는 도구 중 하나가 ModSecurity입니다. 이는 크로스 사이트 스크립팅(WAF)과 같은 다양한 레이어 7 공격으로부터 웹 애플리케이션을 보호하는 무료 오픈 소스 웹 애플리케이션 방화벽(WAF)입니다. >XSS), SQL 삽입, 세션 하이재킹 등이 있습니다.

이 가이드에서는 Ubuntu와 같은 Debian 기반 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 라이브러리입니다. 설치하는 방법에는 두 가지가 있습니다. 그림과 같이 적절한 패키지 관리자를 사용할 수 있습니다

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 Connector 모듈을 컴파일합니다. --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 Corerule 세트 다운로드

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

OWASP 핵심 규칙 세트(CRS)는 SQL 삽입, XSS(교차 사이트 스크립팅).

wget 명령을 사용하여 표시된 대로 Github에서 OWASP 핵심 규칙 세트를 다운로드합니다.

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"

지금까지 DebianUbuntu에서 NginxModsecurity를 설정하는 방법에 대한 개요였습니다. 이것이 도움이 되었기를 바랍니다.