들어가며
웹 서버는 웹 애플리케이션을 호스팅하고 외부 요청을 처리하는 핵심적인 요소입니다. 하지만, 이는 공격자의 주요 공격 대상이기도 합니다. 이 글에서는, 웹 서버 보안을 강화하는 방법에 초점을 맞추어 설명하고자 합니다. 초보자들을 위해, 기본 원리와 함께 nginx 서버 설정을 통한 보안 강화 방법을 살펴보겠습니다.
nginx 설정으로 보는 웹 서버 보안
nginx는 가장 널리 사용되는 오픈 소스 웹 서버 중 하나입니다. 웹 서버가 안전하게 운영되도록 하기 위해, nginx 설정 파일을 통해 다양한 보안 조치를 적용할 수 있습니다.
아래는 보안 강화를 위한 nginx 설정 파일의 예시입니다:
server {
server_name aaa.com;
charset utf-8; #(1)
add_header X-Frame-Options SAMEORIGIN; #(2)
add_header X-Content-Type-Options nosniff; #(3)
add_header X-XSS-Protection "1; mode=block"; #(4)
server_tokens off; #(5)
autoindex off; #(6)
location / {
proxy_pass http://localhost:8000;
proxy_set_header HOST $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* /(.git|cache|bin|logs|backup|tests)/.*$ { return 403; } #(7)
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/aaa.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/aaa.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location /uploaded_images {
alias /var/images/uploaded_images;
}
location /upscaled_images {
alias /var/images/upscaled_images;
}
location /user/portfolio_images {
alias /var/images/user/portfolio_images;
}
}
server {
if ($host = aaa.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name aaa.com;
return 404;
}
이 설정 파일에서 각각의 설정이 웹 서버의 보안을 어떻게 강화하는지 하나씩 살펴보겠습니다:
UTF-8 charset 사용: 이 설정은 문자 인코딩 기반의 공격을 방지하는데 도움이 됩니다. 예를 들어, 잘못된 문자 인코딩이 적용될 경우, 특정 문자열을 다른 문자열로 잘못 해석하게 되어 보안 문제가 발생할 수 있습니다. (#1)
동일 출처 정책 (SAMEORIGIN): 이 설정은 클릭재킹 (Clickjacking)이라 불리는 공격 유형을 방지합니다. 클릭재킹은 악의적인 웹 사이트가 사용자의 웹 브라우저에서 사용자의 의도와는 달리 다른 웹 사이트에 대한 클릭이나 키 입력을 트리거하려고 시도하는 것을 말합니다. (#2)
보안 강화 HTTP 헤더 (X-Content-Type-Options, X-XSS-Protection):
X-Content-Type-Options: 이 헤더는 MIME 스니핑 공격을 방지하는데 사용됩니다. MIME 스니핑 공격은 악의적인 페이로드를 포함하는 응답을 웹 브라우저가 잘못 해석하여 실행하는 공격입니다. (#3)
X-XSS-Protection: 이 헤더는 크로스 사이트 스크립팅 (XSS) 공격을 방지하는데 사용됩니다. XSS 공격은 공격자가 웹 사이트에 악의적인 스크립트를 삽입하여 사용자의 정보를 탈취하는 공격입니다. (#4)
서버 정보 숨기기 (server_tokens off): 이 설정은 서버의 버전 및 구현 세부 정보를 숨기므로, 정보 수집을 통한 공격을 방지하는데 도움이 됩니다. 공격자가 이 정보를 통해 알려진 취약점을 이용한 공격을 시도하는 것을 방지할 수 있습니다. (#5)
디렉터리 목록 비활성화 (autoindex off): 이 설정은 디렉터리 내부의 파일에 대한 정보를 숨기며, 불필요한 정보 노출을 방지합니다. 이를 통해 공격자가 중요한 파일을 발견하거나 서버의 내부 구조를 파악하는 것을 방지합니다. (#6)
민감한 파일 접근 차단 (.git, cache, bin, logs, backup, tests): 이 설정은 서버 내의 민감한 파일 및 디렉토리에 대한 접근을 차단합니다. 이를 통해 .git, cache 등의 민감한 정보가 담긴 파일이 외부에 노출되는 것을 방지합니다. (#7)
마무리하며, 웹 서버의 보안 설정은 여러분의 웹 애플리케이션을 안전하게 유지하는데 핵심적인 역할을 합니다. 위에서 언급한 설정 외에도, SSL/TLS 설정, 권한 관리, 액세스 제어 등 다양한 보안 조치가 있습니다. 이러한 조치들을 통해 웹 서버를 공격자로부터 보호하고, 사용자의 정보를 안전하게 유지합시다.
'devOps' 카테고리의 다른 글
SSH 보안 강화, fail2ban 으로 알아보기 (0) | 2023.07.30 |
---|---|
Searx: 개인 정보 보호와 검색 자유를 위한 오픈 소스 메타 검색 엔진 (0) | 2023.07.16 |
Jenkins로 CI/CD 구축하기: 우분투 환경에서 자동화된 빌드 및 배포 (0) | 2023.07.16 |
DevOps란 무엇이며 왜 중요한가요? (0) | 2023.05.23 |