해킹 방지를 위한 Nginx 설정

들어가며

웹 서버는 웹 애플리케이션을 호스팅하고 외부 요청을 처리하는 핵심적인 요소입니다. 하지만, 이는 공격자의 주요 공격 대상이기도 합니다. 이 글에서는, 웹 서버 보안을 강화하는 방법에 초점을 맞추어 설명하고자 합니다. 초보자들을 위해, 기본 원리와 함께 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; 
}

이 설정 파일에서 각각의 설정이 웹 서버의 보안을 어떻게 강화하는지 하나씩 살펴보겠습니다:

  1. UTF-8 charset 사용: 이 설정은 문자 인코딩 기반의 공격을 방지하는데 도움이 됩니다. 예를 들어, 잘못된 문자 인코딩이 적용될 경우, 특정 문자열을 다른 문자열로 잘못 해석하게 되어 보안 문제가 발생할 수 있습니다. (#1)

  2. 동일 출처 정책 (SAMEORIGIN): 이 설정은 클릭재킹 (Clickjacking)이라 불리는 공격 유형을 방지합니다. 클릭재킹은 악의적인 웹 사이트가 사용자의 웹 브라우저에서 사용자의 의도와는 달리 다른 웹 사이트에 대한 클릭이나 키 입력을 트리거하려고 시도하는 것을 말합니다. (#2)

  3. 보안 강화 HTTP 헤더 (X-Content-Type-Options, X-XSS-Protection):

  • X-Content-Type-Options: 이 헤더는 MIME 스니핑 공격을 방지하는데 사용됩니다. MIME 스니핑 공격은 악의적인 페이로드를 포함하는 응답을 웹 브라우저가 잘못 해석하여 실행하는 공격입니다. (#3)

  • X-XSS-Protection: 이 헤더는 크로스 사이트 스크립팅 (XSS) 공격을 방지하는데 사용됩니다. XSS 공격은 공격자가 웹 사이트에 악의적인 스크립트를 삽입하여 사용자의 정보를 탈취하는 공격입니다. (#4)

  1. 서버 정보 숨기기 (server_tokens off): 이 설정은 서버의 버전 및 구현 세부 정보를 숨기므로, 정보 수집을 통한 공격을 방지하는데 도움이 됩니다. 공격자가 이 정보를 통해 알려진 취약점을 이용한 공격을 시도하는 것을 방지할 수 있습니다. (#5)

  2. 디렉터리 목록 비활성화 (autoindex off): 이 설정은 디렉터리 내부의 파일에 대한 정보를 숨기며, 불필요한 정보 노출을 방지합니다. 이를 통해 공격자가 중요한 파일을 발견하거나 서버의 내부 구조를 파악하는 것을 방지합니다. (#6)

  3. 민감한 파일 접근 차단 (.git, cache, bin, logs, backup, tests): 이 설정은 서버 내의 민감한 파일 및 디렉토리에 대한 접근을 차단합니다. 이를 통해 .git, cache 등의 민감한 정보가 담긴 파일이 외부에 노출되는 것을 방지합니다. (#7)

마무리하며, 웹 서버의 보안 설정은 여러분의 웹 애플리케이션을 안전하게 유지하는데 핵심적인 역할을 합니다. 위에서 언급한 설정 외에도, SSL/TLS 설정, 권한 관리, 액세스 제어 등 다양한 보안 조치가 있습니다. 이러한 조치들을 통해 웹 서버를 공격자로부터 보호하고, 사용자의 정보를 안전하게 유지합시다.