[Nginx] Hardening Nginx
- Nginx
- 2020. 8. 31.
이번글에서는 nginx의 보안성을 강화할 수 있는 몇가지 방법에 대해 알아보도록 하겠습니다.
1. Hardening Nginx
response data에 nginx의 version을 숨기는 방법입니다.
nginx은 지속적으로 관리되고 업데이트되는 오픈소스 프로젝트입니다.
따라서 주기적으로 이전 버전에 대한 bug fix및 보안이슈 등을 개선하며, 해당 내용을 http://nginx.org/ 에 게시하고 있습니다.
하지만 만약 nginx server의 보안 취약점이 발견됬음에도 불구하고 최신 version으로 업데이트 하지 않았다면, 악의적인 공격자들은 이전 version의 보안구멍을 이용해 공격을 시도할 수 있습니다.
따라서 nginx 관리자는 주기적으로 nginx의 version을 최신화할뿐만아니라, 현재의 nginx version을 hide 함으로써 혹시모를 보안 공격에 대비할 수 있습니다.
nginx 뿐만아니라, 아래의 명령어로 linux version도 최신으로 유지하는 것이 좋습니다. 😎
# update
sudo yum update
# upgrade
sudo yum upgrade
hardening을 적용하기 전에는 아래와 같이 response data에 nginx의 version이 노출되고 있습니다. 하지만 response header에 nginx version을 명시하는 것은 어떠한 benefit도 존재 하지 않기 때문에, 이를 hide하는 것이 좋습니다.
nginx의 version을 hide 하기위해 nginx.conf의 http 블럭에 아래와 같은 구문을 추가합니다.
nginx.conf
http {
# hide nginx version
server_tokens off;
...
}
reload 한뒤 확인해보면 아래와 같이 더이상 nginx version이 노출되지 않는것을 확인할 수 있습니다.
2. X-Frame-Options
악의 적인 사용자가 본인의 사이트에 nginx server의 embedding 하는 것을 제한하는 방법입니다.
악의적인 사용자는 본인들의 사이트에 아래와 같이 iframe을 사용해서 다른 nginx server의 resource를 embedding 할 수 있습니다.
만약 nginx server에 X-Frame-Options이 적용되어 있지 않을 경우, 악의적인 사이트에서 다른 server의 resource를 마치 본인들의 site인 마냥 게시할 수 있게 되며 이를 '클릭재킹'이라고 합니다.
클릭재킹 : 웹 사용자가 자신이 클릭하고 있다고 인지하는 것과 다른 어떤 것을 클릭하게 속이는 악의적인 기법으로써 잠재적으로 공격자는 비밀 정보를 유출시키거나 그들의 컴퓨터에 대한 제어를 획득할 수 있게 됩니다. (https://ko.wikipedia.org/wiki/%ED%81%B4%EB%A6%AD%EC%9E%AC%ED%82%B9)
이를 방지하기 위해선 아래와 같이 nginx.conf의 server 블록에 다음의 구문을 추가합니다.
nginx.conf
server {
# X-Frame-Options
add_header X-Frame-Options "SAMEORIGIN";
...
}
reload 한뒤 확인해보면 아래와 같이 더이상 same origin이 아닌 곳, 즉 악의적인 사용자의 site에서 나의 nginx server의 resource를 사용할 수 없게됩니다.
에러 log를 확인해보면 아래와 같은 에러를 확인할 수 있습니다.
3. X-XSS-Protection
악의 적인 사용자가 본인의 사이트로 XSS 공격을 하는 것을 제한하는 방법입니다.
악의적인 사용자는 공격하고자하는 nginx server에 악의적인 스크립트를 입력해 공격할 수 있습니다.
이를 방지하기 위해선 아래와 같이 nginx.conf의 server 블록에 다음의 구문을 추가합니다.
nginx.conf
server {
# X-XSS-Protection
add_header X-XSS-Protection "1; mode=block";
...
}
크로스 사이트 스크립팅 : 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점입니다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어집니다. 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타납니다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있습니다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 합니다. (https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85)
4. without Nginx module
만약 보안 취약점이 발견된 default 모듈을 Nginx에서 제거하고 싶을 경우 아래와 같이 제거할 수 있습니다.
먼저 Nginx source code가 있는 directory로 이동합니다.
제거할 수 있는 default 모듈을 확인하기위해 아래의 명령어를 입력합니다.
./configure --help | grep without
위의 모듈들 중 제거하고 싶은 모듈을 선택해 install을 진행하면 됩니다.
nginx의 모듈을 install 하는 방법은 이 글(https://velog.io/@minholee_93/Nginx-Adding-Dynamic-Module-rkk61t6miw)을 참고하시면 되겠습니다. 😎
'Nginx' 카테고리의 다른 글
[Nginx] Reverse Proxy (0) | 2020.08.31 |
---|---|
[Nginx] Let's Encrypt - SSL Certificates (0) | 2020.08.31 |
[Nginx] Basic Auth (0) | 2020.08.31 |
[Nginx] Rate Limiting (0) | 2020.08.31 |
[Nginx] HTTPS (SSL) (0) | 2020.08.31 |