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

안전한 웹서버 구축 보안 가이드 12가지
- 웹서버 보안 취약점 12가지 개선 방법 -
Linux에서 안전한 웹서버를 위한 계정 보안 취약점 개선하는 12가지 할일을 정리해 봅니다.
#웹서버 보안 강화 방법,#웹서버 정보 보호 조치,#웹서버 보안 취약점 12가지 개선 방법,#웹서버 보안 취약점 개선,#안전한 웹서버 구축하는 12가지 할일,#침입 방지 소프트웨어 - fail2ban
Linix 웹서버 보안 취약점을 개선하여 적용하는 방법
- 공개 키 기반 인증 (Public Key Authentication)
- 방화벽 설정
- sudo 권한 제한
- SSH 접속 IP 제한
- SSL 인증서 설치
- 'Nginx 설정' - 디렉토리 목록화 비활성화, IP 접속 허용
- 웹서버 파일 권한 설정
- 웹서버 SELinux 정책 설정
- 로그 모니터링
- 웹 애플리케이션 방화벽 (WAF) 사용
- 보안 모니터링 도구 사용
- 주기적인 보안 점검
웹서버의 보안 취약점을 최소화하기 위해 다음과 같은 조치들을 취할 수 있습니다. 아래의 방법들을 참고하여 보안을 강화하세요:
1. 공개 키 기반 인증 (Public Key Authentication)
- SSH 접근 시 비밀번호 대신 공개 키 기반 인증을 사용하는 것이 좋습니다. 이는 비밀 키와 공개 키를 사용하여 사용자를 인증하는 방법으로, 비밀번호 없이도 안전한 접속이 가능합니다.
/etc/ssh/sshd_config
파일에서PermitRootLogin
을without-password
또는prohibit-password
로 설정하고,PasswordAuthentication
을no
로 설정합니다: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
-
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 등)
공개 키 기반 인증 설정
- 공개 키 생성:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 공개 키를 서버에 복사:
ssh-copy-id user@your_server
- SSH 설정 파일 수정:
/etc/ssh/sshd_config
파일에서 다음과 같이 설정합니다:PermitRootLogin prohibit-password PasswordAuthentication no
방화벽 설정 (firewalld)
- firewalld 설치 및 활성화:
sudo yum install firewalld sudo systemctl enable firewalld sudo systemctl start firewalld
- 방화벽 규칙 추가:
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 등)
공개 키 기반 인증 설정
- 공개 키 생성:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 공개 키를 서버에 복사:
ssh-copy-id user@your_server
- SSH 설정 파일 수정:
/etc/ssh/sshd_config
파일에서 다음과 같이 설정합니다:PermitRootLogin prohibit-password PasswordAuthentication no
방화벽 설정 (ufw)
- ufw 설치 및 활성화:
sudo apt-get install ufw sudo ufw enable
- 방화벽 규칙 추가:
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 계정을 비밀번호 없이도 안전하게 사용할 수 있습니다. 😊