새로 만든 VPS는 온라인에 올라간 지 몇 분 만에 자동화된 공격에 노출됩니다 — 이 체크리스트는 서버를 온전히 지키기 위한 첫 1시간의 하드닝 과정을 순서대로 안내합니다.
새로 만든 서버는 모두 같은 약점을 안고 시작합니다: 기본 root 로그인, 비밀번호만으로 열리는 SSH 문, 활짝 열린 방화벽, 그리고 자동 패치 부재입니다. 봇은 IPv4 전체 주소 공간을 끊임없이 스캔하므로 "아직 내 IP를 아무도 모른다"는 결코 사실이 아닙니다.
이 가이드는 순서대로 그대로 따라 할 수 있는 하드닝 체크리스트입니다. 새로 만든 Debian 또는 Ubuntu 서버에서 위에서 아래로 진행하면, 보안 이론이 걱정하는 취약점이 아니라 공격자가 실제로 노리는 빈틈을 막을 수 있습니다.
서버를 손대기 전에
첫 로그인 전에 내리는 두 가지 결정이 나중에 몇 시간을 절약해 줍니다. SSH 키를 준비하고 root가 아닌 사용자 이름을 정해두세요.
- 1
최신 SSH 키 생성하기
자신의 컴퓨터에서 ssh-keygen -t ed25519 -C "you@device"를 실행하세요. Ed25519 키는 짧고 빠르며, 오래된 RSA-2048 기본값보다 강력합니다.
- 2
개인 키는 서버 밖에 두기
개인 키 절반은 노트북을 절대 벗어나지 않습니다. 서버에는 항상 .pub 파일만 복사합니다. 이 규칙을 어기면 스스로 접속을 차단당해 서버를 처음부터 다시 구성해야 하는 상황에 이르게 됩니다.
- 3
프로비저닝 자격 증명 확인하기
대부분의 제공업체는 임시 root 비밀번호를 이메일로 보내거나, 서버 생성 시점에 키를 미리 심어둡니다. 키가 이미 심어져 있다면 곧바로 사용자 생성 단계로 건너뛸 수 있습니다.
호스트가 배포 시점에 SSH 키를 미리 심어준다면, 비밀번호 기반 시간대는 애초에 존재하지 않습니다 — 가장 큰 공격 표면이 부팅 전에 이미 사라진 것입니다.
1단계 — 모든 것을 패치하고 그 상태를 유지하기
패치되지 않은 커널이나 OpenSSL은 어떤 방화벽 규칙으로도 고칠 수 없는 유일한 결함입니다. 다른 무엇을 설정하기 전에 먼저 업데이트하세요.
- Debian/Ubuntu: apt update && apt full-upgrade -y 실행 후, 커널이 바뀌었다면 재부팅하세요.
- unattended-upgrades를 활성화해 보안 패치가 자동으로 적용되도록 하세요: apt install unattended-upgrades && dpkg-reconfigure unattended-upgrades.
- 재부팅은 스스로 정한 일정에 따라 진행하세요 — Unattended-Upgrade::Automatic-Reboot을 한가한 시간대로 설정해, 커널 업데이트가 절반만 적용된 채로 남지 않도록 하세요.
2단계 — 실제 사용자를 만들고 root는 은퇴시키기
root로 로그인한다는 것은 세션 하나가 탈취되면 기기 전체가 넘어가고, 감사 기록도 전혀 남지 않는다는 뜻입니다. 대신 이름이 있는 sudo 계정을 하나 만드세요.
- 1
사용자 추가하기
adduser deploy 실행 후 usermod -aG sudo deploy(RHEL 계열 시스템에서는 wheel 사용).
- 2
그 사용자를 위해 키 설치하기
노트북에서: ssh-copy-id deploy@your-server-ip. 이렇게 하면 공개 키가 올바른 권한으로 ~/.ssh/authorized_keys에 기록됩니다.
- 3
문을 잠그기 전에 먼저 테스트하기
두 번째 터미널을 열어 ssh deploy@server로 접속되고 sudo -v가 실행되는지 확인하세요. 새 세션이 정상 작동하는 것을 확인하기 전까지는 절대 root나 비밀번호를 비활성화하지 마세요.
SSH 하드닝의 황금률: 인증 설정을 바꾸기 전에 현재 세션은 열어둔 채로, 두 번째 창에서 새 로그인이 작동하는지 반드시 증명하세요. 이 습관 하나가 거의 모든 접속 차단 사고를 막아줍니다.
3단계 — 가장 중요한 SSH 하드닝
SSH는 모든 VPS의 현관문이며, 자동화된 로그인 시도 대부분이 여기로 몰려듭니다. /etc/ssh/sshd_config(또는 /etc/ssh/sshd_config.d/ 안의 드롭인 파일)를 편집해 다음 키들을 설정하세요.
sshd -t로 문법을 검증한 뒤 systemctl restart ssh를 적용하세요. sshd -t에서 오류가 나오면 재시작 전에 반드시 고쳐야 데몬이 멈추는 상황을 피할 수 있습니다.
SSH 포트를 22에서 바꾸는 것은 선택 사항이며 로그 소음만 줄일 뿐입니다 — 이는 보안이 아니라 눈속임(obscurity)입니다. PasswordAuthentication을 끄고 나면 포트 스캐닝 봇이 추측할 것이 아무것도 없으므로, 포트 놀음보다 키 관리에 노력을 쏟으세요.
4단계 — 기본 차단(default-deny) 방화벽 켜기
SSH 데몬을 아무리 강화해도 서버는 여전히 다른 모든 대기 중인 서비스와 기기를 공유합니다. 방화벽은 "내가 열지 않은 한 닫혀 있다"를 기본값으로 만들어줍니다.
- 1
기본값 설정하기
ufw 사용 시: ufw default deny incoming과 ufw default allow outgoing.
- 2
실제로 제공하는 것만 허용하기
ufw allow OpenSSH, 그리고 이 서버가 실제로 웹 트래픽을 서비스할 때만 ufw allow 80,443/tcp.
- 3
활성화하고 확인하기
ufw enable 실행 후 ufw status verbose. 목록에 없는 것은 이제 인터넷에서 접근할 수 없습니다.
ufw를 활성화하기 전에 SSH 규칙부터 방화벽에 넣으세요. 자신의 포트에 대한 허용 규칙 없이 기본 차단 방화벽을 켜면 세션이 끊깁니다.
5단계 — Fail2ban으로 무차별 대입 공격 늦추기
비밀번호를 비활성화해도 봇은 계속 문을 두드리며 로그를 채웁니다. Fail2ban은 반복 공격자를 방화벽 수준에서 차단합니다.
- apt install fail2ban — 기본 제공되는 sshd jail은 별도 설정 없이 바로 작동합니다.
- jail.conf를 jail.local로 복사하고 bantime(예: 1h)은 늘리고 maxretry(예: 3)는 취향에 맞게 줄이세요.
- fail2ban-client status sshd로 정상 작동 여부와 차단된 IP 수를 확인하세요.
6단계 — 공격 표면 줄이기
가장 안전한 서비스는 실행되지 않는 서비스입니다. 무엇이 대기 중인지 점검하고 필요 없는 것은 정리하세요.
열린 포트 점검하기
ss -tulpn은 대기 중인 모든 소켓과 그 뒤의 프로세스를 보여줍니다. 의도적으로 시작하지 않은 것이 있다면 반드시 조사하세요.
쓰지 않는 패키지 제거하기
사용하지 않는 서비스는 비활성화하거나 제거하세요 — 쓰지 않는데 계속 돌아가는 데이터베이스나 메일 에이전트는 순수한 위험 요소일 뿐입니다.
서비스 격리하기
데이터베이스 같은 내부 데몬은 127.0.0.1에 바인딩해, 방화벽이 뚫리더라도 절대 외부에 노출되지 않도록 하세요.
권한 단단히 잠그기
~/.ssh는 700, authorized_keys는 600으로 설정되어 있는지 확인하세요. 권한이 잘못되면 sshd가 아무 알림 없이 키를 무시해 버립니다.
7단계 — 로그를 남기고 모니터링하며 기준선을 파악하기
하드닝은 한 번으로 끝나는 이벤트가 아닙니다. 무언가 바뀌었을 때 이를 알아차려야 합니다.
- journalctl -u ssh나 lastb로 실패한 로그인 등 인증 활동을 검토하세요.
- 특권 작업을 변조 불가능하게 기록하려면 auditd 도입을 고려하세요.
- /etc와 데이터의 서버 외부 백업을 유지하세요. 그러면 침해된 서버를 사후에 신뢰하는 대신 깨끗하게 다시 구축할 수 있습니다.
호스트 자체가 중요한 이유
소프트웨어 하드닝은 OS를 지켜주지만, 그 아래에 무엇이 있는지는 제공업체가 결정합니다 — 네트워크 필터링, 결제 흔적, 그리고 신원이 서버와 연결되는지 여부입니다. ChainVPS에서는 모든 요금제에 디도스(DDoS) 방어와 무제한 트래픽이 기본 포함되며, 서버 비용은 모네로(Monero)를 포함한 21종 코인의 선불 암호화폐 잔액으로 결제되고 KYC가 없습니다. 서버를 자신의 신원과 연결하지 않는 것이 위협 모델에 포함된다면, 저희의 해외 VPS 요금제는 바로 그런 목적을 위해 만들어졌습니다.
위치 역시 하드닝의 일부입니다: 15개 리전 중 6개(NL, CH, RO, IS, MD, LU)가 프라이버시 등급 관할권입니다. 하드닝된 OS와 해외 전용 서버를 함께 사용하면 소프트웨어 표면과 법적 표면을 모두 좁게 유지할 수 있습니다.
1시간 체크리스트, 요약판
- 전체 시스템 업데이트 완료 + 자동 보안 패치 활성화
- 이름이 있는 sudo 사용자 생성, 키 설치, 로그인 테스트 완료
- root SSH 로그인과 비밀번호 인증 모두 비활성화
- sshd -t로 SSH 설정 검증 및 재적용
- 기본 차단 방화벽 활성화, 필요한 포트만 개방
- Fail2ban이 sshd jail에서 실행 중
- 열린 포트 점검 완료, 쓰지 않는 서비스 제거
- 서버 외부 백업 및 로그 검토 체계 구축 완료
SSH 포트를 22가 아닌 다른 번호로 바꿔야 할까요?
선택 사항이며 실제 위험이 아니라 로그 소음만 줄여줍니다. 비밀번호 인증이 꺼져 있고 키가 필수라면, 포트를 옮기는 것은 보안이 아니라 눈속임을 더할 뿐입니다 — 먼저 비밀번호 비활성화를 우선하세요.
키가 하나뿐인데 비밀번호 인증을 꺼도 안전할까요?
네, 별도 세션에서 키 로그인을 테스트했고 개인 키의 백업을 보관하고 있다면 안전합니다. 많은 제공업체가 웹 콘솔이나 복구 모드도 제공하므로, 하드웨어에서 완전히 접속이 막히는 일은 없습니다.
SSH만 실행 중인 서비스라도 방화벽이 필요할까요?
네. 기본 차단 방화벽은 설치했다는 사실조차 잊어버린 서비스나, 나중에 어떤 패키지가 조용히 열기 시작하는 포트로부터 여러분을 지켜줍니다. 비용은 전혀 들지 않으면서 예상치 못한 사고를 막아줍니다.
하드닝은 얼마나 자주 다시 점검해야 하나요?
자동 보안 업데이트가 일상적인 작업을 처리해 주지만, 주요 소프트웨어 설치 이후와 최소 한 달에 한 번은 대기 중인 포트와 인증 로그를 검토하세요. 하드닝된 기준선은 한 번 설정하고 잊어버리는 것이 아니라 계속 확인해야 하는 것으로 다루세요.


