이 글에는 제휴 링크가 포함되어 있습니다. 링크를 통해 가입하시면 추가 비용 없이 소정의 수수료를 받습니다. — 공개
VPS를 만들자마자 해킹이 시작된다
새 VPS를 생성한 직후, 놀랍게도 4시간 이내에 전 세계의 자동화된 봇들이 SSH 포트 22번을 스캔하기 시작합니다. 비밀번호 무차별 대입(brute force) 공격이 쏟아지고, 알려진 취약점을 노리는 스캐너가 돌아갑니다. 기본 설정 그대로 둔다면 해킹은 시간문제입니다.
이 가이드에서는 VPS 보안을 5단계로 완벽하게 강화하는 방법을 설명합니다. 명령어를 순서대로 따라 하면 30분 안에 프로 수준의 보안 서버를 구축할 수 있습니다. 우분투(Ubuntu) 22.04/24.04 LTS를 기준으로 작성했으며, Debian에서도 동일하게 적용됩니다.
1단계: SSH 보안 강화 — 키 인증 + root 로그인 금지
해커의 90% 이상이 SSH를 통해 들어옵니다. 따라서 SSH 보안이 가장 중요합니다. 세 가지를 설정합니다: 비밀번호 로그인 비활성화, root 직접 로그인 금지, SSH 포트 변경.
SSH 키 생성 및 복사
# 로컬 PC에서 SSH 키 생성 (ed25519 권장)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 공개키를 서버에 복사
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip
SSH 설정 변경 (/etc/ssh/sshd_config)
# SSH 설정 파일 편집
sudo nano /etc/ssh/sshd_config
# 다음 항목들을 변경:
Port 22022 # 기본 22에서 다른 포트로
PermitRootLogin no # root 직접 로그인 금지
PasswordAuthentication no # 비밀번호 로그인 끄기
PubkeyAuthentication yes # 키 인증만 허용
MaxAuthTries 3 # 인증 시도 제한
# 설정 적용
sudo systemctl restart sshd
2단계: UFW 방화벽 — 필요한 포트만 개방
UFW(Uncomplicated Firewall)는 우분투의 기본 방화벽 도구입니다. 핵심 원칙은 필요한 포트만 열고 나머지는 모두 막는 것입니다.
# 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH 포트 개방 (변경한 포트 사용!)
sudo ufw allow 22022/tcp
# 웹 서버 포트
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 절대 외부에 열지 말 것:
# sudo ufw allow 3306 # MySQL — 로컬만
# sudo ufw allow 5432 # PostgreSQL — 로컬만
# sudo ufw allow 6379 # Redis — 로컬만
# 방화벽 활성화 (SSH 포트 확인 후!)
sudo ufw enable
# 상태 확인
sudo ufw status verbose
3단계: Fail2ban — 무차별 대입 공격 자동 차단
Fail2ban은 로그를 실시간으로 모니터링하면서, 비정상적으로 많은 로그인 시도를 하는 IP를 자동으로 방화벽 차단하는 도구입니다. SSH뿐만 아니라 Nginx, Apache, WordPress 로그도 모니터링할 수 있습니다.
# Fail2ban 설치
sudo apt update && sudo apt install fail2ban -y
# 로컬 설정 파일 생성
sudo nano /etc/fail2ban/jail.local
# 다음 설정 추가:
[sshd]
enabled = true
port = 22022
maxretry = 5
findtime = 3600
bantime = 86400
[sshd-ddos]
enabled = true
port = 22022
# Fail2ban 재시작
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# 상태 확인
sudo fail2ban-client status sshd
# 차단 해제 (필요 시)
sudo fail2ban-client set sshd unbanip
bantime = 86400은 24시간 차단, findtime = 3600은 1시간 내, maxretry = 5는 5회 실패를 의미합니다. 즉 1시간 안에 5번 로그인에 실패하면 24시간 동안 자동 차단됩니다.
4단계: 자동 보안 업데이트 — unattended-upgrades
보안 패치는 하루라도 늦으면 안 됩니다. 알려진 취약점이 발견되면 해커가 그보다 빠르게 공격 도구를 배포합니다. unattended-upgrades로 보안 업데이트를 자동 설치하세요.
# 패키지 설치
sudo apt install unattended-upgrades apt-listchanges -y
# 자동 업데이트 활성화
sudo dpkg-reconfigure -plow unattended-upgrades
# 자동 설정 확인 (/etc/apt/apt.conf.d/20auto-upgrades)
cat /etc/apt/apt.conf.d/20auto-upgrades
# 다음과 같아야 함:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
# 수동으로 테스트 (dry-run)
sudo unattended-upgrade --dry-run --verbose
보안 패치만 자동 설치되며, 일반 패키지 업데이트는 수동으로 진행해야 안전합니다. 업데이트 로그는 /var/log/unattended-upgrades/에서 확인할 수 있습니다.
5단계: 모니터링 + 정기 백업
로그 모니터링 (logwatch)
# logwatch 설치 — 매일 시스템 로그 요약 이메일
sudo apt install logwatch -y
# 수동으로 보고서 생성
sudo logwatch --output mail --email your@email.com --detail high
# 실패한 SSH 로그인 확인
grep "Failed password" /var/log/auth.log | tail -20
# root 로그인 시도 확인
grep "root" /var/log/auth.log | grep "Failed" | wc -l
자동 백업 (restic)
# restic 설치
sudo apt install restic -y
# 백업 리포지토리 초기화
restic init --repo /backup/vps
# 첫 백업
restic backup --repo /backup/vps /var/www /etc /home /opt
# 자동 백업 (cron)
crontab -e
# 매일 새벽 3시 백업
0 3 * * * restic backup --repo /backup/vps /var/www /etc /home /opt
30 3 * * * restic forget --repo /backup/vps --keep-daily 7 --keep-weekly 4 --prune
VPS 보안 체크리스트 요약
| 단계 | 항목 | 명령어 |
|---|---|---|
| 1 | SSH 키 인증 | ssh-keygen -t ed25519 |
| 1 | 비밀번호 로그인 금지 | PasswordAuthentication no |
| 1 | root 로그인 금지 | PermitRootLogin no |
| 2 | UFW 방화벽 | ufw enable |
| 3 | Fail2ban | apt install fail2ban |
| 4 | 자동 업데이트 | apt install unattended-upgrades |
| 5 | 모니터링 | apt install logwatch |
| 5 | 백업 | restic backup |
추천 VPS (보안 강화 후 사용)
보안 가이드를 따라 설정할 VPS가 필요하시다면 다음을 추천합니다:
- Vultr — 서울 리전 보유, $100 크레딧: Vultr 가입하기
- DigitalOcean — 문서·생태계 최강, $200 크레딧: DigitalOcean 가입하기
- Hetzner — 압도적 가성비 ($3.79/월): Hetzner 가입하기
FAQ — 자주 묻는 질문
SSH 포트를 바꾸면 보안에 도움이 되나요?
포트 변경 자체는 보안을 강화하지 않습니다(스캐너가 모든 포트를 스캔할 수 있음). 하지만 자동화된 봇의 노이즈 공격을 크게 줄일 수 있어 로그가 깔끔해지고 Fail2ban 부하가 줄어듭니다. 보안보다는 운영 효율성 관점에서 권장합니다.
Fail2ban bantime은 얼마가 적당한가요?
개인 VPS라면 bantime = 86400(24시간)이 적당합니다. 공격이 심하다면 bantime = -1(영구 차단)도 고려할 수 있지만, 정상 사용자가 실수로 Lockout될 위험이 있으니 maxretry를 5-10으로 넉넉하게 설정하세요.
자동 업데이트가 서버를 망가뜨리지 않나요?
unattended-upgrades는 기본적으로 보안 패치만 자동 설치합니다. 일반 패키지 업데이트는 포함되지 않으므로 안전합니다. 다만 커널 업데이트 후 재부팅이 필요할 수 있으니, Automatic-Reboot 설정을 새벽 시간대로 지정하세요.
관련 글
- VPS에 WireGuard 자체 VPN 구축하기 — 보안 클러스터
- Hetzner vs Vultr vs DigitalOcean 가격 비교
- VPS 모니터링 완벽 가이드
- Let’s Encrypt SSL 자동 발급 튜토리얼
이 글에는 제휴 링크가 포함되어 있습니다. — 제휴 공개(Affiliate Disclosure)



















