VPS를 만들었다면 가장 먼저 해야 할 보안 설정 10가지
VPS를 만들면 몇 분 안에 공인 IP가 생기고 인터넷에서 접속할 수 있다. 편리하지만 그 순간부터 자동 스캔과 로그인 시도의 대상이 된다. 애플리케이션을 올리기 전에 운영체제와 접속 경로부터 잠그는 이유다.
아래 순서는 Ubuntu 계열 서버를 기준으로 한 출발점이다. 설정을 바꿀 때는 현재 SSH 연결을 유지하고, 새 터미널에서 다시 접속되는지 확인한 뒤 기존 세션을 닫아야 한다. 방화벽이나 SSH 설정을 잘못 적용하면 정상 관리자도 서버에 들어가지 못할 수 있다.
1. 일반 관리자 계정을 만든다
일상 작업에 root 계정을 직접 쓰지 않는다. 별도 계정을 만들고 필요한 작업만 sudo로 수행한다. 누가 어떤 권한으로 변경했는지 추적하기도 쉬워진다.
2. SSH 키 로그인을 먼저 확인한다
비밀번호보다 키 기반 인증을 우선하고, 새 키로 실제 접속되는지 확인한다. Ubuntu 문서는 ed25519 키 사용을 권장하며 필요하면 2단계 인증도 구성할 수 있다고 안내한다. Ubuntu OpenSSH 보안 안내
3. root와 비밀번호 SSH 로그인을 끈다
키 로그인이 검증된 뒤 root 직접 로그인과 비밀번호 인증을 비활성화한다. SSH 포트를 바꾸는 것은 로그 소음을 줄일 수 있지만, 키 인증과 접근 제한을 대신하는 보안 대책은 아니다.
4. 두 겹의 방화벽을 사용한다
VPS 사업자의 네트워크 방화벽과 서버 내부 UFW를 함께 쓴다. 외부에는 80과 443처럼 실제로 필요한 포트만 열고, SSH는 가능하면 회사 VPN이나 고정 IP에서만 허용한다. Ubuntu UFW 안내
5. 보안 업데이트를 자동화한다
운영체제와 패키지를 최신 상태로 유지한다. 현재 Ubuntu Server는 보안 업데이트를 매일 자동 적용하는 구성이 기본이지만, 실제 활성 상태와 재부팅 필요 여부를 점검해야 한다. 애플리케이션 이미지와 라이브러리 업데이트는 별도 절차가 필요하다. Ubuntu 자동 업데이트
6. 애플리케이션 포트를 직접 공개하지 않는다
Node.js나 컨테이너의 내부 포트를 인터넷에 바로 열지 않는다. Nginx, Caddy 같은 역방향 프록시 뒤에 두고 HTTPS를 적용한다. 관리자 화면과 데이터베이스 포트는 공개 인터넷에서 차단한다.
7. 비밀값을 소스와 이미지에서 분리한다
DB 비밀번호, API 키, 서명 키를 Git 저장소나 Docker 이미지에 넣지 않는다. 실행 시 주입하고 파일 권한을 제한하며, 교체 주기와 폐기 절차를 정한다. 로그와 오류 메시지에도 비밀값이 남지 않는지 확인한다. OWASP 비밀정보 관리 지침
8. 컨테이너 권한을 줄인다
컨테이너 안에서도 root가 아닌 사용자로 애플리케이션을 실행한다. 가능하면 Docker의 rootless 모드를 검토한다. Docker rootless 모드는 데몬과 컨테이너를 일반 사용자 권한으로 실행해 데몬 취약점의 영향을 줄인다. Docker rootless 모드
9. 로그와 알림을 서버 밖으로 보낸다
SSH 로그인 실패, sudo 사용, 서비스 재시작, 애플리케이션 오류를 기록한다. 디스크가 꽉 차지 않도록 로그 순환을 설정하고, 서버가 멈춰도 조사할 수 있게 중요한 로그는 외부로 보낸다. 보안 로그에는 개인정보와 토큰을 그대로 남기지 않는다. OWASP 로깅 지침
10. 백업보다 복구를 시험한다
자동 스냅샷만 켜고 끝내지 않는다. DB 덤프와 파일 백업을 별도 위치에 보관하고, 새 서버에서 실제로 복원해 본다. 서버 계정이 침해됐을 때 같은 계정의 백업까지 지워지지 않도록 권한과 저장 위치를 분리한다.
운영 체크리스트
- 사용하지 않는 계정, 패키지, 포트를 제거했는가?
- SSH 접속 실패와 디스크 부족 알림이 오는가?
- 인증서가 자동 갱신되고 만료 전에 알림을 받는가?
- 백업 파일이 암호화되고 복원 시험 기록이 있는가?
- 퇴사자 계정과 키를 즉시 폐기할 수 있는가?
- 장애 때 접근할 비상 계정과 절차가 있는가?
VPS 보안은 한 번의 설치 작업이 아니라 반복되는 운영 업무다. 서버를 만든 날 위 10가지를 적용하고, 매달 계정, 패치, 방화벽, 백업, 알림 상태를 짧게라도 검토하는 것이 현실적인 출발점이다.
함께 읽기
- 사내 시스템 공개 전 확인해야 할 운영 체크리스트 30가지사내 시스템은 외부 고객 서비스보다 사용자가 적다는 이유로 공개 전 점검이 짧아지기 쉽다. 하지만 결재, 계약, 인사, 회계처럼 업무의 기준이 되는 시스템은 한 번의 권한 오류나 데이터 손실도 실제 업무 중단으로 이어진다.
- 듀오랩스가 사내 시스템을 설계하고 운영하는 7가지 원칙사내 시스템의 좋은 아키텍처는 가장 큰 서버나 가장 복잡한 기술 조합이 아니다. 현재 업무를 무리 없이 지원하고, 문제가 생겼을 때 되돌릴 수 있으며, 사용자가 늘면 필요한 부분만 확장할 수 있는 구조다.
- 월 10달러 VPS가 정말 더 저렴할까? 숨은 운영 비용 계산하기월 10달러 안팎의 VPS를 보면 Vercel, Supabase 같은 관리형 서비스를 합친 것보다 훨씬 저렴해 보인다. 실제로 안정적인 부하가 있고 서버를 운영할 사람이 있다면 VPS가 경제적일 수 있다. 하지만 인스턴스 가격만 비교하면 백업, 저장 공간, 전송량, 보안 패치, 장애 대응 시간이 빠진다.
- 클라우드 비용 폭탄을 막는 예산과 사용량 알림 설정클라우드 비용은 서버 한 대의 월정액처럼 움직이지 않는다. 트래픽, 함수 실행 시간, DB 용량, 로그, 파일 전송, 실시간 연결이 각각 늘어난다. 작은 코드 실수나 공개된 API 키 하나가 짧은 시간에 사용량을 키울 수도 있다.
- 배포가 실패해도 5분 안에 되돌리는 소규모 서비스 운영법빠른 롤백은 사람이 명령어를 빨리 입력하는 능력이 아니다. 이전 버전이 무엇인지 알고, 같은 산출물을 다시 실행할 수 있고, DB가 이전 코드와 호환되도록 미리 설계한 결과다. 준비 없이 배포한 뒤 5분 안에 되돌리겠다는 목표는 지키기 어렵다.