InfraPlatform

안전한 웹서버 구축 보안 가이드 12가지

IT오이시이 2025. 2. 10. 13:36
728x90

 

 

안전한 웹서버 구축 보안 가이드 12가지
- 웹서버 보안 취약점 12가지 개선 방법 -

 
Linux에서 안전한 웹서버를 위한 계정 보안 취약점 개선하는 12가지 할일을 정리해 봅니다.
#웹서버 보안 강화 방법,#웹서버 정보 보호 조치,#웹서버 보안 취약점 12가지 개선 방법,#웹서버 보안 취약점 개선,#안전한 웹서버 구축하는 12가지 할일,#침입 방지 소프트웨어 - fail2ban
 
Linix 웹서버 보안 취약점을 개선하여 적용하는 방법

  1. 공개 키 기반 인증 (Public Key Authentication)
  2. 방화벽 설정
  3. sudo 권한 제한
  4. SSH 접속 IP 제한
  5. SSL 인증서 설치
  6. 'Nginx 설정' -  디렉토리 목록화 비활성화, IP 접속 허용
  7. 웹서버 파일 권한 설정
  8. 웹서버 SELinux 정책 설정
  9. 로그 모니터링
  10. 웹 애플리케이션 방화벽 (WAF) 사용
  11. 보안 모니터링 도구 사용
  12. 주기적인 보안 점검

 


웹서버의 보안 취약점을 최소화하기 위해 다음과 같은 조치들을 취할 수 있습니다. 아래의 방법들을 참고하여 보안을 강화하세요:

1. 공개 키 기반 인증 (Public Key Authentication)

  • SSH 접근 시 비밀번호 대신 공개 키 기반 인증을 사용하는 것이 좋습니다. 이는 비밀 키와 공개 키를 사용하여 사용자를 인증하는 방법으로, 비밀번호 없이도 안전한 접속이 가능합니다.
  • /etc/ssh/sshd_config 파일에서 PermitRootLoginwithout-password 또는 prohibit-password로 설정하고, PasswordAuthenticationno로 설정합니다:
    PermitRootLogin prohibit-password
    PasswordAuthentication no

 

2. 방화벽 설정

  • 불필요한 외부 접근을 차단하고 필요한 포트만 열어두는 것이 좋습니다. 특히 nginx가 동작하는 포트(예: 80, 443)만 열어두고 나머지는 차단합니다.
  • Ubuntu/Debin : ufw를 사용하여 방화벽을 설정할 수 있습니다:
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw enable
  • CentOS/RHEL: firewall-cmd  를 사용하여 방화벽을 설정합니다.
    sudo firewall-cmd --permanent --zone=public --add-service=http
    sudo firewall-cmd --permanent --zone=public --add-service=https


 

3. sudo 권한 제한

  • nginx 계정에 불필요한 sudo 권한이 부여되지 않도록 설정합니다. sudoers 파일을 수정하여 특정 명령어만 허용합니다.
    nginx ALL=(ALL) NOPASSWD: /usr/sbin/nginx

 

4. SSH 접속 IP 제한

  • 특정 IP 주소에서만 SSH 접속을 허용하도록 설정합니다. sshd_config 파일에서 AllowUsers 또는 AllowGroups를 사용하여 제한합니다:
    AllowUsers nginx@your_allowed_ip

 

5.  SSL 인증서 설치

    HTTPS를 사용하기 위해 Nginx에 SSL 인증서를 설정 합니다.

  • 다음과 같이 발급 받은 인증서를 웹서버에 저장하고 설치합니다.
server { 
     listen 80; 
     server_name your_domain www.your_domain; 
     location / {
           # Redirect HTTP to HTTPS 
           return 301 https://$host$request_uri; 
           } 
     } 
     
 server { 
     listen 443 ssl; 
     server_name your_domain www.your_domain; 
     ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
     
     location / { 
       # Your website's root directory 
       root /var/www/html; 
       index index.html index.htm;
       }
    }

       

    • 인증서를 설치/갱신하고 웹서버를 재기동 합니다.       
    • sudo systemctl restart nginx

6. 'Nginx 설정' -  디렉토리 목록화 비활성화, IP 접속 허용

  • 디렉토리 목록화 비활성화: 웹서버 설정에서 디렉토리 목록화, 특정 IP 접속 제한 기능을 비활성화합니다.
    server {
        listen 80;
        server_name your_domain www.your_domain;
    
        location / {
            root /var/www/html;
            index index.html index.htm;
            autoindex off;  # 디렉토리 목록화 비활성화
            
                    
            # 특정 IP 주소만 허용
            allow 192.168.1.100;  # 허용할 IP 주소
            allow 192.168.1.101;  # 허용할 추가 IP 주소
            deny all;             # 다른 모든 IP 
        }
    }

       위 설정에서 allow 지시자를 사용하여 특정 IP 주소를 허용하고, deny all;을 사용 합니다.
 


7. 웹서버 파일 권한 설정

  • 파일 권한 설정: 웹서버의 파일 및 디렉토리 권한을 적절히 설정하여 불필요한 접근을 차단합니다.

 

  • 7.1. 웹 소스 디렉토리 소유자 및 그룹 설정
    - 웹 디렉토리와 파일의 권한을 적절히 설정하여 불필요한 접근을 방지합니다. 
    sudo chown -R nginx:webadmin /var/www/html
    

  • 7.2. 웹 소스 파일 권한 설정 :
    - 웹 디렉토리와 파일의 권한을 적절히 설정하여 불필요한 접근을 방지합니다.
    디렉토리에는 750 권한을, 파일에는 640 권한을 설정합니다. 이를 통해 소유자와 그룹만 해당 디렉토리와 파일에 접근할 수 있습니다:
    sudo find /var/www/html -type d -exec chmod 750 {} \; 
    sudo find /var/www/html -type f -exec chmod 640 {} \;


  • 7.3. Nginx 설정 파일 권한 설정
    -
    Nginx 설정 파일의 소유자를 nginx 계정으로 설정하고, 권한을 적절히 설정하여 불필요한 접근을 방지합니다
    sudo chown nginx:webadmin /etc/nginx/nginx.conf
    sudo chmod 600 /etc/nginx/nginx.conf
    
    일반적으로 설정 파일에는 600 권한을 설정합니다


  • 7.4 로그 파일 권한 설정
    - Nginx 로그 파일의 소유자를 nginx 계정으로 설정하고, 권한을 적절히 설정하여 불필요한 접근을 방지합니다.
    sudo chown nginx:webadmin /var/log/nginx/access.log
    sudo chown nginx:webadmin /var/log/nginx/error.log
    sudo chmod 640 /var/log/nginx/access.log
    sudo chmod 640 /var/log/nginx/error.log

     

  • 7.5 실행 파일 권한 설정
    - Nginx 실행 파일의 권한을 설정하여 불필요한 접근을 방지합니다.
    sudo chmod 755 /usr/sbin/nginx

 


8. 웹서버 SELinux 정책 설정

Nginx가 웹 소스 파일과 로그 파일에 접근할 수 있도록 SELinux 정책을 설정합니다. httpd_sys_content_t 태그를 사용하여 웹 소스 파일에 대한 접근을 허용하고, httpd_log_t 태그를 사용하여 로그 파일에 대한 접근을 허용합니다.

  • 8.1 웹 소스 파일 selinux 설정
    웹 소스 파일 디렉토리와 파일에 httpd_sys_content_t 태그를 적용합니다:
     
    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
    sudo restorecon -Rv /var/www/html
    

 

  • 8.2 웹 로그 파일 selinux  설정
    - 로그 파일 디렉토리와 파일에 httpd_log_t 태그를 적용합니다:
     
    sudo semanage fcontext -a -t httpd_log_t "/var/log/nginx(/.*)?"
    sudo restorecon -Rv /var/log/nginx
    
  • 8.3. SELinux 상태 확인 
    SELinux가 올바르게 설정되었는지 확인합니다:
    sudo getenforce
    

    위 명령어를 실행하면 SELinux 상태가 표시됩니다. 상태가 Enforcing일 경우 SELinux가 활성화되어 정책이 적용되고 있음을 의미합니다.

  • 8.4. Nginx 서버 재시작
    Nginx 서버를 재시작하여 SELinux 설정을 적용합니다:
    sudo systemctl restart nginx
    


9. 로그 모니터링

  • 로그 모니터링: 웹서버의 액세스 로그와 에러 로그를 주기적으로 모니터링하여 비정상적인 활동을 탐지합니다.
     
    tail -f /var/log/nginx/access.log
    tail -f /var/log/nginx/error.log
    

 

10. 웹 애플리케이션 방화벽 (WAF) 사용

  • WAF 사용: ModSecurity와 같은 웹 애플리케이션 방화벽을 사용하여 웹 애플리케이션에 대한 공격을 탐지하고 차단합니다.
    sudo apt-get install libapache2-mod-security2
    sudo a2enmod security2
    sudo systemctl restart 

 

11. 보안 모니터링 도구 사용(침입차단)

  • 보안 이벤트를 모니터링하고 알림을 받을 수 있는 도구를 사용합니다.
  • Fail2ban은 서버 보안을 강화하는 데 사용되는 침입 방지 소프트웨어입니다.
  • 주로 SSH, HTTP, SMTP와 같은 서비스에서 발생하는 비정상적인 로그인 시도를 탐지하고 차단하는 역할을 합니다.
  • 이 도구는 서버 로그 파일을 모니터링하여 여러 번의 실패한 로그인 시도를 감지하면, 공격 의심 IP 주소를 방화벽을 통해 차단하는 할 수 있습니다.

예를 들어, fail2ban을 사용하여 비정상적인 로그인 시도를 차단할 수 있습니다:

  sudo apt-get install fail2ban

 

12. 주기적인 보안 점검

  • 시스템과 소프트웨어의 보안 업데이트를 주기적으로 확인하고 적용합니다. 보안 패치를 신속하게 적용하여 취약점을 최소화합니다. 
  • sudo apt-get update or sudo apt-get upgrade 명령으로 정기적으로 패키지를 업데이트 합니다.
sudo apt-get update 
sudo apt-get upgrade

 
이러한 조치를 통해 nginx 웹서버의 계정을 비밀번호 없이도 보안을 강화할 수 있습니다.
 


Red Hat 계열과 Ubuntu는 두 가지 주요 리눅스 배포판 계열로, 각기 다른 특징과 사용 방법이 있습니다.
각각의 보안 조치 방법을 구분하여 설명드리겠습니다.

Red Hat 계열 (RHEL, CentOS, Fedora 등)

공개 키 기반 인증 설정

  1. 공개 키 생성:
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. 공개 키를 서버에 복사:
    ssh-copy-id user@your_server
  3. SSH 설정 파일 수정:
    /etc/ssh/sshd_config 파일에서 다음과 같이 설정합니다:
    PermitRootLogin prohibit-password
    PasswordAuthentication no

방화벽 설정 (firewalld)

  1. firewalld 설치 및 활성화:
    sudo yum install firewalld
    sudo systemctl enable firewalld
    sudo systemctl start firewalld
  2. 방화벽 규칙 추가:
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --reload

sudo 권한 제한

  • /etc/sudoers 파일을 수정하여 특정 명령어만 허용:
     nginx ALL=(ALL) NOPASSWD: /usr/sbin/nginx

 


 

Ubuntu 계열 (Ubuntu, Linux Mint 등)

공개 키 기반 인증 설정

  1. 공개 키 생성:
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. 공개 키를 서버에 복사:
    ssh-copy-id user@your_server
  3. SSH 설정 파일 수정:
    /etc/ssh/sshd_config 파일에서 다음과 같이 설정합니다:
    PermitRootLogin prohibit-password
    PasswordAuthentication no

방화벽 설정 (ufw)

  1. ufw 설치 및 활성화:
    sudo apt-get install ufw
    sudo ufw enable
  2. 방화벽 규칙 추가:
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp

sudo 권한 제한

  • /etc/sudoers 파일을 수정하여 특정 명령어만 허용:
     nginx ALL=(ALL) NOPASSWD: /usr/sbin/nginx

 

공통 보안 조치

  • SSH 접속 IP 제한: 특정 IP 주소에서만 SSH 접속을 허용:
     AllowUsers nginx@your_allowed_ip
  • 보안 모니터링 도구 사용 (침입차단):
    fail2ban 설치:
     sudo yum install fail2ban  # Red Hat 계열
     sudo apt-get install fail2ban  # Ubuntu 계열
  • 주기적인 보안 점검:
     sudo yum update  # Red Hat 계열
     sudo apt-get update  # Ubuntu 계열

이러한 조치를 통해 nginx 계정을 비밀번호 없이도 안전하게 사용할 수 있습니다. 😊

728x90
반응형