피드로 돌아가기
Dev.toDevOps
원문 읽기
Nginx 보안 설정을 3개의 모듈식 파일로 분리해 서버 신원 마스킹, 악성 트래픽 필터링, HTTP 보안 헤더 주입 구현
Hardening Nginx: A Practical Guide to Modular Security Configuration
AI 요약
Context
Nginx는 기본 설정 상태에서 자동화된 공격(스캐너, 스크래핑 봇, 브루트포스)에 취약하다. 보안 설정이 여러 가상 호스트에 분산되면 유지보수와 감사가 어렵다.
Technical Solution
- 서버 신원 마스킹:
server_tokens off로 Nginx 버전 숨기고,headers-more-nginx-module의more_set_headers지시어로 Server 헤더를 임의 값으로 변경 - 경로 기반 악성 트래픽 필터링: Nginx
map모듈로$request_uri를 검사해 wp-admin, .env, .git, 경로 순회 시도(../../etc/passwd), 클라우드 메타데이터 SSRF(169.254.169.254), 스크립트/백업 확장자(.sh, .sql, .tar 등)를 탐지하고return 444로 즉시 연결 종료 - User-Agent 기반 봇 차단:
$http_user_agent를 정규식으로 검사해 havij, nikto, sqlmap, nmap, gobuster 등 알려진 스캐닝 도구 탐지 - DDoS 방어를 위한 속도 제한:
limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=20r/s설정으로 IP당 초당 20 요청 제한 - HTTP 보안 헤더 주입: X-Frame-Options(SAMEORIGIN), X-XSS-Protection, X-Content-Type-Options(nosniff), Referrer-Policy(same-origin), Permissions-Policy(지오로케이션/마이크/카메라 비활성화), HSTS(max-age=31536000 + includeSubDomains + preload) 추가
- 숨김 파일 및 임시 파일 차단:
location ~ /\.블록으로 점(.)으로 시작하는 모든 파일(.git, .htaccess 등)과 에디터 임시 파일(~로 끝나는 파일) 접근 거부 - 설정 모듈화: security-global.conf, security-location.conf, security-headers.conf로 분리해 http 블록, server 블록, location 블록에서 개별 포함 가능
Key Takeaway
보안 설정을 논리적 단위로 분리하면 유지보수성이 향상되고, Nginx의 map 모듈과 정규식을 활용해 무거운 조건문 없이 엣지에서 악성 트래픽을 필터링할 수 있어 백엔드 리소스를 절감할 수 있다.
실천 포인트
Nginx를 운영하는 팀에서 제시된 3가지 모듈식 설정 파일(security-global.conf, security-location.conf, security-headers.conf)을 `/etc/nginx/snippets`에 저장한 후 `include` 지시어로 로드하면, 모든 가상 호스트에 일관된 보안 기준선을 적용할 수 있고 설정 변경 시 중복 작업을 제거할 수 있다.