← 블로그

DigitalOcean Droplet 초기 설정 가이드 2026 — 보안까지 챙기는 서버 세팅

zazabook editors · 2026-07-02 · 4 분 읽기

이 페이지의 일부 링크는 제휴 링크이며, 구매 시 추가 비용 없이 소정의 수수료를 받을 수 있습니다.

DigitalOcean에서 Droplet을 하나 만들고 나면 root 비밀번호가 담긴 이메일 한 통만 덜렁 옵니다. 여기서 바로 애플리케이션을 올리는 건 위험합니다. 인터넷에 노출된 IP는 생성되고 몇 분 안에 무차별 로그인 시도(brute force)가 시작되는 경우가 흔하고, root 계정을 그대로 쓰다가 실수 한 번으로 서버 전체가 날아가는 일도 드물지 않습니다. App Platform처럼 관리형 서비스와 달리 Droplet은 순수 VPS라서 OS 레벨 보안을 전부 직접 챙겨야 합니다. 이 글은 Ubuntu 기준으로 Droplet을 만든 직후 반드시 해야 할 초기 설정을 순서대로 따라갑니다.

준비물

  • DigitalOcean 계정과 생성된 Droplet(Ubuntu 22.04 이상 권장)
  • 로컬 컴퓨터에 SSH 키 페어 — 없다면 터미널에서 ssh-keygen -t ed25519 -C "[email protected]"로 생성
  • Droplet의 공인 IP 주소와 root 초기 비밀번호(이메일로 전달됨)

1단계 — SSH 키로 로그인 설정(비밀번호 로그인 비활성화)

Droplet 생성 화면에서 SSH 키를 미리 등록해뒀다면 이 단계는 이미 반쯤 끝난 상태입니다. 등록하지 않았다면 로컬에서 공개키를 서버로 복사합니다.

ssh-copy-id root@your_droplet_ip

ssh-copy-id가 없는 환경(Windows)이라면 ~/.ssh/id_ed25519.pub 내용을 복사해서 서버의 ~/.ssh/authorized_keys에 직접 붙여넣어도 됩니다. 키로 로그인이 되는 걸 확인했으면(ssh root@your_droplet_ip) 비밀번호 로그인을 꺼야 진짜 의미가 있습니다. /etc/ssh/sshd_config를 열어 아래 값을 수정합니다.

PasswordAuthentication no
PermitRootLogin prohibit-password

수정 후 systemctl restart ssh로 반영합니다. 여기서 반드시 기존 SSH 세션을 끊지 말고 새 터미널 창을 하나 더 열어서 키 로그인이 되는지 재확인하세요. 세션을 먼저 끊으면 설정에 실수가 있을 때 콘솔(DigitalOcean 웹 콘솔)로만 접속 가능한 상황이 됩니다.

2단계 — 방화벽(UFW) 기본 규칙

Ubuntu에는 UFW(Uncomplicated Firewall)가 기본 내장되어 있습니다. SSH 포트를 막아버리면 서버에 접속조차 못 하게 되니 반드시 허용 규칙부터 넣고 활성화합니다.

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

ufw status로 규칙이 제대로 적용됐는지 확인합니다. 웹 서버를 아직 안 올렸다면 80·443 포트는 나중에 열어도 되지만, 미리 규칙만 만들어두면 배포할 때 방화벽 때문에 헤매는 일이 줄어듭니다. DigitalOcean 콘솔의 Networking → Firewalls에서 클라우드 방화벽을 별도로 설정할 수도 있는데, UFW(서버 내부)와 클라우드 방화벽(네트워크 레벨)을 이중으로 걸어두면 한쪽 설정 실수가 있어도 다른 쪽이 방어해줍니다.

3단계 — 일반 사용자 계정 생성(root 직접 사용 지양)

root로 계속 작업하면 명령어 하나 잘못 쳐도 시스템 전체에 영향을 줍니다. sudo 권한을 가진 일반 사용자를 만들어 평소에는 이 계정으로 로그인합니다.

adduser deploy
usermod -aG sudo deploy

새 계정에도 SSH 키 로그인이 되도록 root의 authorized_keys를 복사합니다.

rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

이후로는 ssh deploy@your_droplet_ip로 접속하고, 관리자 권한이 필요할 때만 sudo를 붙입니다. 1단계에서 PermitRootLoginprohibit-password로 설정해뒀다면 root는 키로도 로그인은 가능한 상태이므로, 완전히 막고 싶다면 이 단계 이후에 no로 바꿔도 됩니다.

4단계 — 자동 보안 업데이트 설정

리눅스 패키지의 보안 패치는 손으로 매번 챙기기 어렵습니다. unattended-upgrades를 설치하면 보안 업데이트를 자동으로 적용해줍니다.

sudo apt update && sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

설정 창에서 "Yes"를 선택하면 /etc/apt/apt.conf.d/50unattended-upgrades에 규칙이 생성되고, 매일 자동으로 보안 업데이트만 골라서 적용합니다. 커널 업데이트가 재부팅을 요구하는 경우가 있으니, 같은 설정 파일에서 Unattended-Upgrade::Automatic-Reboot을 필요에 따라 true로 켜두면 편리합니다(운영 중인 서비스가 있다면 재부팅 시간대를 새벽으로 지정하는 걸 권장).

5단계 — fail2ban으로 무차별 로그인 차단

SSH 포트가 열려 있는 한 로그인 시도 자체는 계속 들어옵니다. fail2ban은 일정 횟수 이상 로그인에 실패한 IP를 자동으로 차단해줍니다.

sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

jail.local에서 [sshd] 섹션을 찾아 enabled = true로 바꾸고, maxretry(기본 5회)와 bantime(기본 10분)을 필요에 맞게 조정합니다. 운영 서버라면 bantime = 1h 이상으로 늘려서 차단 효과를 확실히 하는 걸 추천합니다.

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

마지막 명령으로 현재 차단된 IP 목록과 실패 횟수를 확인할 수 있습니다. 1단계에서 비밀번호 로그인을 이미 껐다면 무차별 대입 공격 자체는 거의 무력화되지만, fail2ban을 같이 켜두면 로그가 시도 기록으로 도배되는 것도 막아줍니다.

6단계 — 스왑 메모리 설정(소형 인스턴스)

512MB~1GB 메모리의 저렴한 Droplet은 빌드 작업이나 트래픽 스파이크 때 메모리가 금방 바닥납니다. 스왑을 설정해두면 메모리 부족으로 프로세스가 강제 종료(OOM Kill)되는 상황을 줄일 수 있습니다.

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

스왑 크기는 메모리와 비슷하거나 그 이하로 잡는 게 일반적입니다(1GB 메모리 인스턴스라면 스왑도 1GB 정도). free -h로 스왑이 잡혔는지 확인하세요. 다만 스왑은 디스크 기반이라 RAM보다 훨씬 느리므로, 스왑이 계속 가득 차는 상황이 반복된다면 인스턴스 사이즈를 올리는 게 근본적인 해결책입니다.

흔한 실수

  • SSH 세션을 끊고 나서야 sshd_config 오타를 발견 — 반드시 새 세션으로 접속 테스트를 먼저 한 뒤 기존 세션을 닫으세요.
  • UFW를 활성화하면서 SSH 포트를 허용하지 않아 원격 접속이 완전히 막혀버림 — ufw allow OpenSSH를 가장 먼저 적용하세요.
  • root 계정으로 애플리케이션을 계속 실행 — 배포 스크립트도 일반 사용자 권한으로 돌리는 게 안전합니다.
  • fail2ban 설치 후 jail.local에서 enabled = true로 바꾸는 걸 빼먹어서 실제로는 동작하지 않는 경우.
  • 스왑 없이 소형 인스턴스에서 빌드·배포를 돌리다 메모리 부족으로 프로세스가 죽는 걸 원인 모르고 반복 재시작.

마무리

여기까지 마치면 Droplet은 root 노출 최소화, 방화벽, 무차별 로그인 방어, 자동 보안 패치까지 갖춘 상태가 됩니다. 이후에 Nginx나 Node.js 애플리케이션을 올려도 최소한의 보안 기본기는 확보된 셈입니다. 서버 관리를 직접 하지 않고 Git push만으로 배포하고 싶다면 DigitalOcean App Platform으로 배포하기도 함께 참고해 보세요. Droplet부터 시작해보고 싶다면 DigitalOcean에서 Droplet 만들기로 지금 바로 서버를 띄워보세요.