[Nginx] http header에서 Nginx 정보 제거하는 법
개발자 도구나 피들러를 사용하면 해당 웹의 서버를 확인할 수 있습니다.
개발자 도구/피들러:
어떤 웹 페이지들은 서버 이름과 서버 버전 또한 확인할 수 있습니다.
하지만 보안에 좋지 않고, 조금이라도 트래픽을 아끼기 위해 이러한 정보를 숨길 수 있습니다.
오늘은 리눅스 서버의 Nginx에서 서버 버전을 안 보이게 하고, 서버 이름까지 숨기는 방법을 공유하려 합니다.
실행 환경:
- 리눅스 버전: rhel 8.10
- Nginx 버전: nginx 1.24.0
서버 버전 정보를 숨기는 법:
리눅스에서 nginx를 설치하면 /etc/nginx/에 nginx.conf라는 파일이 생깁니다.
해당 파일에서 아래와 같은 설정을 주면 서버 버전 정보를 숨길 수 있습니다.
http {
# 다른 설정들
server_tokens off;
}
서버 이름 숨기는 법:
서버 이름을 숨기기 위해서는 모듈을 설치해야 합니다.
좀 복잡하지만 천천히 하나씩 해보죠.
리눅스에 가서 아래 명령어를 하나씩 적습니다.
먼저 기본적인 툴을 다운로드하여야 합니다.
# 무난한 /home에서 파일 설치를 진행합니다.
cd /home
wget 'http://nginx.org/download/nginx-1.24.0.tar.gz'
tar -xzvf nginx-1.24.0.tar.gz
yum groupinstall "Development Tools"
yum install pcre pcre-devel
모듈 파일 다운로드:
headers-more-nginx-module 메인 페이지
headers-more-nginx-module 다운로드 페이지
메인 페이지에서는 headers-more-nginx-module을 다운로드하고 적용하는 방법에 대해 적혀 있으며,
headers-more-nginx-module 다운로드 페이지에서는 headers-more-nginx-module의 버전들을 확인할 수 있습니다.
저희는 지금 시점의 최신 버전인 0.38 버전을 설치하겠습니다.
0.38 버전을 클릭하고 Source code(tar.gz)을 클릭해 다운로드합니다.
파일을 열면 아래처럼 폴더가 하나 보입니다.
이 폴더를 리눅스의 /home/ 안에 넣습니다.
그 후, 리눅스 안에서 아래 코드를 실행해 줍니다.
cd /home/nginx-1.24.0
./configure --with-compat --add-dynamic-module=../headers-more-nginx-module-0.38
# 위 코드 실행 시 zlib라는 라이브러리가 없다면
# dnf install zlib-devel 코드로 라이브러리 설치 가능
make modules
# 위 명령어로 모듈 빌드 가능.
# 모듈을 빌드하면
# /home/nginx-1.24.0/objs 경로에 ngx_http_headers_more_filter_module.so 파일이 생깁니다.
# ngx_http_headers_more_filter_module.so 파일을 /etc/nginx/modules 안에 넣습니다.
# (modules 폴더가 바로가기라면 삭제 후 modules 폴더를 생성해줍니다.)
해당 폴더에 들어가서 ngx_http_headers_more_filter_module.so 파일을 복사한 후,
/etc/nginx/modules/ 이 위치에 붙여 넣어 줍니다.
so 파일 권한을 755로 줍니다.
chmod 755 ngx_http_headers_more_filter_module.so
파일 복사가 끝났으면 /etc/nginx/nginx.conf 파일을 수정해 줍니다.
load_module /etc/nginx/modules/ngx_http_headers_more_filter_module.so;
# 모듈을 불러온다.
# 바로가기를 사용하셨다면 해당 모듈을 바로가기 경로에 맞게 바꿔줍니다.
http {
# 기타 설정들
server_tokens off;
# 위 코드는 nginx의 버전 정보를 제거하는 코드.
more_clear_headers "Server";
# 위 코드는 server 정보를 없애는 코드.
}
nginx를 재시작합니다.
nginx -t
# 위 명령어로 새롭게 작성한 파일에서 nginx가 이상없이 돌아가는지 확인할 수 있습니다.
systemctl restart nginx
nginx에서 계속 문제가 생긴다면 selinux의 문제일 수 있습니다.
아래 명령어로 리눅스 스스로가 nginx 모듈을 실행할 수 있도록 허용해 줍니다.
# nginx가 모듈 파일을 실행할 수 있도록 허용:
sudo chcon -t httpd_modules_t /etc/nginx/modules/ngx_http_headers_more_filter_module.so
# 파일에 대한 SELinux 정책 추가:
sudo setsebool -P httpd_can_network_connect 1
위 조치를 전부 취한 후 nginx를 다시 재시작해줍니다.
마지막으로 피들러나 개발자 모드에서 다시 서버 정보를 확인해 봅니다.