관리 메뉴

피터의 개발이야기

[Nginx] NGINX 보안 강화를 위한 기본 설정 본문

DevOps/nginx

[Nginx] NGINX 보안 강화를 위한 기본 설정

기록하는 백앤드개발자 2025. 3. 22. 00:01
반응형

ㅁ 들어가며

 회사에서 보안검수를 수행하는데, 본 프로그램에 대한 사항보다 nginx에 대한 점검사항이 많았다. Nginx의 보안 강화를 위한 기본적인 설정에 대해서 잘 모르고 있었다. 보안은 웹 서버를 안전하게 운영하기 위해 필수적이다. 이 글에서는 Nginx 보안을 강화하기 위한 주요 설정 사항들을 정리해 보았다.

 

ㅁ 보안 체크리스트

ㅇ Nginx 버전 정보 숨기기 (server_tokens off;)
ㅇ 보안 헤더 추가 (X-Frame-Options, XSS Protection 등)
ㅇ 불필요한 HTTP 메서드 차단 (limit_except GET POST)
ㅇ 디렉토리 리스팅 비활성화 (autoindex off;)
ㅇ 파일 업로드 크기 제한 (client_max_body_size 10M;)
ㅇ 민감한 파일 접근 차단 (location ~* /\. { deny all; })
ㅇ SSL/TLS 적용 및 강력한 암호화 설정 (ssl_protocols TLSv1.2 TLSv1.3;)
ㅇ 요청 속도 제한 (limit_req_zone)
ㅇ 로그 분석 및 모니터링 (access_log, error_log)

 

ㅁ Nginx 버전 정보 숨기기

server_tokens off;

 

ㅇ 기본적으로 Nginx는 에러 페이지와 응답 헤더에서 버전 정보를 노출함.

ㅇ 공격자가 서버 정보를 쉽게 알 수 있으므로 버전 정보를 숨겨야 함.

ㅇ nginx.conf에 적용하면 Server: nginx 헤더에서 버전 정보가 제거됨.

 

ㅁ 보안 헤더 추가 (Strict-Transport-Security, X-Frame-Options, XSS Protection)

add_header X-Frame-Options DENY;                   
add_header X-XSS-Protection "1; mode=block";       
add_header X-Content-Type-Options nosniff;         
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

ㅇ 웹 보안 강화를 위해 주요 HTTP 헤더를 추가해야 함.

ㅇ nginx.conf에 적용하면 브라우저가 보안 정책을 준수하도록 강제할 수 있음.

 

 

ㅁ 불필요한 HTTP 메서드 차단 (PUT, DELETE 등)

server {
    location / {
        limit_except GET POST {
            deny all;
        }
    }
}

 

ㅇ 위 설정을 적용하면 GET과 POST 이외의 모든 요청이 차단됨.

ㅇ 일반적으로 GET, POST만 허용하면 충분함. 기본적으로 PUT, DELETE 같은 메서드는 차단하는 것이 좋음.

 

 

ㅁ 디렉토리 리스팅 비활성화

autoindex off;

ㅇ 위 설정을 적용하면 Nginx가 디렉토리 목록을 표시하지 않음.

ㅇ 디렉토리 목록이 노출되면 민감한 파일이 유출될 수 있음.

 

 

ㅁ 파일 업로드 크기 제한

client_max_body_size 10M;

ㅇ 위 설정을 적용하면 최대 10MB까지만 업로드 가능함.

ㅇ 악성 파일을 무분별하게 업로드하지 못하도록 크기를 제한해야 함.

 

 

ㅁ 특정 파일 접근 차단 (.git, .env 등 민감한 파일 보호)

location ~* /\. {
    deny all;
    access_log off;
    log_not_found off;
}

ㅇ 위 설정을 적용하면 .git, .env, .htpasswd 같은 파일에 직접 접근할 수 없음.

ㅇ .git, .htpasswd, .env 같은 파일이 노출되면 보안 취약점이 발생할 수 있음.

 

ㅁ SSL/TLS 설정 강화 (HTTPS 적용)

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
}

ㅇ TLS 1.0, 1.1은 보안 취약점이 존재하므로 비활성화하는 것이 좋음.
ㅇ HTTPS를 사용하여 데이터 암호화를 강화해야 함.

ㅇ Let’s Encrypt 무료 SSL 인증서를 적용하는 것도 좋은 방법.

 

ㅁ 요청 속도 제한 (Rate Limiting)

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

server {
    location /login {
        limit_req zone=one burst=10 nodelay;
    }
}

ㅇ 위 설정을 적용하면 같은 IP에서 초당 5개 이상의 요청을 보내면 제한됨.

ㅇ DDoS 공격 및 무차별 대입 공격을 방지하려면 요청 속도를 제한해야 함.
ㅇ 특히 로그인 페이지(/login) 같은 민감한 경로에 적용하면 보안 강화 가능.

 

ㅁ 로그 설정 및 모니터링 (보안 로그 분석)

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;

ㅇ 로그를 분석하면 보안 위협을 감지할 수 있음.
ㅇ 로그는 /var/log/nginx/access.log, /var/log/nginx/error.log에 저장됨.

ㅇ 공격 패턴을 감지하려면 로그를 모니터링하는 것이 중요함.
ㅇ fail2ban 같은 도구를 활용하면 자동으로 악성 IP를 차단할 수도 있음.

 

ㅁ 함께 보면 좋은 사이트

ㅇ AI가 알려주는 Nginx - 서버 관리자를 위한 필수 가이드

  ㄴ 4.1 Nginx 보안 강화를 위한 기본 설정

반응형
Comments