VPS 보안을 강화하려면 SSH 키 인증, 방화벽 설정, Fail2ban 도입이 필수입니다.
외부의 악의적인 접근을 차단하고 서버 자원을 안전하게 보호하는 가장 확실한 조치입니다.
VPS를 만들자마자 해킹이 시작된다

새 VPS를 생성하고 공개 IP가 생기면, 곧 전 세계의 자동화된 봇들이 SSH 포트 22번을 스캔하기 시작합니다. 비밀번호 무차별 대입(brute force) 공격이 쏟아지고, 알려진 취약점을 노리는 스캐너가 돌아갑니다. 기본 설정 그대로 둔다면 침해 위험이 큽니다.
이 가이드에서는 VPS 보안을 5단계로 완벽하게 강화하는 방법을 설명합니다. 명령어를 순서대로 따라 하면 기본적인 보안 설정을 갖춘 서버를 만들 수 있습니다. 우분투(Ubuntu) 22.04/24.04 LTS를 기준으로 작성했으며, Debian에서도 동일하게 적용됩니다.
1단계: SSH 보안 강화 — 키 인증 + root 로그인 금지

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
# 다음 항목들을 변경 (설명은 각 항목 윗줄 주석):
# 기본 22에서 다른 포트로
Port 22022
# root 직접 로그인 금지
PermitRootLogin no
# 비밀번호 로그인 끄기
PasswordAuthentication no
# 키 인증 사용
PubkeyAuthentication yes
# 인증 시도 제한
MaxAuthTries 3
# 설정 적용
sudo systemctl restart sshd
Ubuntu 22.10 이후(24.04 포함)는 sshd가 ssh.socket 소켓 활성화로 시작해서 sshd_config의 Port만 바꾸면 적용되지 않는 경우가 있습니다(Ubuntu 서버 팀 안내). 새 포트로 접속되는지 별도 세션에서 확인하기 전에는 기존 22번 접속과 방화벽 규칙을 지우지 마세요. /etc/ssh/sshd_config.d/의 설정 파일이 같은 항목을 덮어쓸 수도 있으니 sudo sshd -T로 실제 적용값을 확인하세요.
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
# Fail2ban 재시작
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# 상태 확인
sudo fail2ban-client status sshd
# 차단 해제 (필요 시)
sudo fail2ban-client set sshd unbanip 차단된IP주소
예전 글에 자주 나오는 [sshd-ddos] jail은 현재 Fail2ban 저장소에 해당 필터 파일이 없어(filter.d/sshd-ddos.conf 없음) 넣으면 시작에 실패할 수 있어 뺐습니다. 대신 sshd 필터의 mode 매개변수(normal, ddos, extra, aggressive)로 탐지 범위를 고릅니다.
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
# 저장소 비밀번호 파일 (cron은 비밀번호를 입력할 수 없으므로 파일로 전달)
echo '강력한비밀번호' | sudo tee /root/.restic-pass > /dev/null
sudo chmod 600 /root/.restic-pass
export RESTIC_PASSWORD_FILE=/root/.restic-pass
# 백업 리포지토리 초기화 (같은 서버의 /backup/vps 는 오프사이트가 아니므로 실제로는 원격 저장소를 쓰세요)
restic init --repo /backup/vps
# 첫 백업
restic backup --repo /backup/vps /var/www /etc /home /opt
# 자동 백업 (root crontab)
sudo crontab -e
# 매일 새벽 3시 백업
0 3 * * * RESTIC_PASSWORD_FILE=/root/.restic-pass restic backup --repo /backup/vps /var/www /etc /home /opt
30 3 * * * RESTIC_PASSWORD_FILE=/root/.restic-pass 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 — 문서가 풍부: DigitalOcean 가입하기
- Hetzner — 가격 대비 사양이 좋은 편(CX23 €5.99/월, 부가세 별도): Hetzner 가입하기
자주 묻는 질문 (FAQ)
Q1. SSH 포트를 바꾸면 보안에 도움이 되나요?
포트 변경 자체는 보안을 강화하지 않습니다(스캐너가 모든 포트를 스캔할 수 있음). 하지만 자동화된 봇의 노이즈 공격을 크게 줄일 수 있어 로그가 깔끔해지고 Fail2ban 부하가 줄어듭니다. 보안보다는 운영 효율성 관점에서 권장합니다.
Q2. Fail2ban bantime은 얼마가 적당한가요?
개인 VPS라면bantime = 86400(24시간)이 적당합니다. 공격이 심하다면bantime = -1(영구 차단)도 고려할 수 있지만, 정상 사용자가 실수로 Lockout될 위험이 있으니 maxretry를 5-10으로 넉넉하게 설정하세요.
Q3. 자동 업데이트가 서버를 망가뜨리지 않나요?
unattended-upgrades는 기본적으로보안 패치만자동 설치합니다. 일반 패키지 업데이트는 포함되지 않으므로 안전합니다. 다만 커널 업데이트 후 재부팅이 필요할 수 있으니,Automatic-Reboot설정을 새벽 시간대로 지정하세요.
관련 글
- VPS에 WireGuard 자체 VPN 구축하기 — 보안 클러스터
- Hetzner vs Vultr vs DigitalOcean 가격 비교
- VPS 모니터링 완벽 가이드
- Let’s Encrypt SSL 자동 발급 튜토리얼
이 글에는 제휴 링크가 포함되어 있습니다. — 제휴 공개(Affiliate Disclosure)



















