infra

Ubuntu 서버 초기 설정 완벽 가이드 — SSH 키 인증, UFW 방화벽, fail2ban 설정

새 Ubuntu 서버를 받으면 가장 먼저 해야 할 보안 설정을 정리했다. root 직접 로그인 차단, SSH 키 인증 설정, UFW 방화벽 구성, fail2ban으로 무차별 대입 공격 방어까지 순서대로 다룬다.

UbuntuSSHUFW보안infra
Ubuntu 서버 터미널에서 UFW 방화벽 상태와 허용된 포트 목록이 표시된 화면
  • ·SSH 기본 포트 22: 봇이 가장 먼저 스캔하는 포트, 변경하거나 fail2ban으로 보호 필요
  • ·UFW: Ubuntu 기본 방화벽, iptables를 쉽게 관리하는 인터페이스
  • ·fail2ban: 로그를 분석해 일정 횟수 이상 실패한 IP를 자동으로 차단
  • ·authorized_keys: SSH 공개키를 등록하는 파일, ~/.ssh/authorized_keys 경로
클라우드에서 VPS를 처음 개설했을 때 root 비밀번호만 설정하고 방치했다가 /var/log/auth.log를 보니 수천 건의 SSH 로그인 시도가 찍혀 있었다. 그 이후로 새 서버를 받으면 처음 30분 안에 SSH 키 인증 설정, 비밀번호 로그인 차단, UFW 방화벽 활성화를 반드시 먼저 한다. fail2ban을 설치하고 나면 auth.log에서 차단된 IP 목록이 쌓이는 걸 보면서 얼마나 많은 공격이 들어오는지 체감하게 된다.

Ubuntu 서버 초기 보안 설정이 필요한 이유

Ubuntu 서버를 개설하면 즉시 SSH 보안 설정을 해야 하는 이유

클라우드 서비스에서 새 VPS나 EC2 인스턴스를 생성하면 공인 IP가 할당되는 순간부터 인터넷에 노출된다. SSH 포트 22번은 봇이 가장 먼저 스캔하는 포트 중 하나다. 서버를 개설하고 몇 시간만 지나도 /var/log/auth.log에 외부 IP에서 들어온 SSH 로그인 시도 기록이 쌓이기 시작한다. root 계정에 간단한 비밀번호를 쓰거나 비밀번호 인증을 열어두면 무차별 대입 공격(브루트포스)에 취약하다. 자동화된 공격 스크립트들이 흔한 비밀번호 조합을 수천 번씩 시도하기 때문에 단순한 비밀번호는 시간 문제로 뚫린다. 이를 막는 가장 효과적인 방법은 SSH 비밀번호 인증을 완전히 차단하고 키 기반 인증만 허용하는 것이다. 공개키/개인키 쌍을 사용하는 SSH 키 인증은 개인키 없이는 접근이 불가능하기 때문에 비밀번호 기반 공격이 원천적으로 차단된다. 서버를 처음 받으면 가장 먼저 해야 할 일은 SSH 키 설정과 방화벽 구성이다. 이 작업은 10~20분이면 충분하고, 하지 않으면 언제든 보안 사고가 생길 수 있다.

SSH 키 인증과 root 로그인 차단 설정

Ubuntu 서버에 SSH 키 인증을 설정하는 방법

SSH 키 인증을 설정하려면 먼저 로컬 머신에서 키 쌍을 생성해야 한다. ssh-keygen -t ed25519 -C '이메일' 명령으로 Ed25519 알고리즘 키 쌍을 만든다. 생성된 개인키(~/.ssh/id_ed25519)는 절대 다른 곳에 공유하면 안 되고, 공개키(~/.ssh/id_ed25519.pub)를 서버에 등록한다. 서버에 공개키를 등록하는 방법은 두 가지다. ssh-copy-id -i ~/.ssh/id_ed25519.pub user@서버IP 명령을 쓰면 자동으로 서버의 ~/.ssh/authorized_keys에 추가된다. 수동으로 하려면 서버에서 ~/.ssh/authorized_keys 파일을 열고 공개키 내용을 붙여넣으면 된다. 파일이 없으면 만들면 된다. .ssh 디렉토리의 권한은 700, authorized_keys 파일의 권한은 600이어야 SSH가 키 파일을 읽는다. 키를 등록한 후 키 인증으로 로그인이 되는 걸 확인한 다음에 비밀번호 인증을 차단해야 한다. 확인하기 전에 비밀번호 인증을 막으면 서버에 접근할 수 없게 될 수 있다.

# 로컬에서 키 생성
ssh-keygen -t ed25519 -C 'your@email.com'

# 공개키를 서버에 복사
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@서버IP

# 서버에서 권한 설정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# SSH 비밀번호 인증 차단 (/etc/ssh/sshd_config 수정)
PasswordAuthentication no
PermitRootLogin no

# sshd 재시작
sudo systemctl restart sshd

Ubuntu 서버에서 root 로그인과 SSH 비밀번호 인증을 차단하는 방법

SSH 키 인증이 동작하는 걸 확인했으면 비밀번호 인증을 차단한다. /etc/ssh/sshd_config 파일을 편집한다. PasswordAuthentication no로 변경하면 비밀번호 로그인이 차단된다. PermitRootLogin no로 설정하면 root 계정으로 직접 SSH 접속을 막는다. root 대신 sudo 권한이 있는 일반 사용자 계정을 만들어서 그 계정으로 접속하는 게 원칙이다. PubkeyAuthentication yes가 설정되어 있는지 확인하고, ChallengeResponseAuthentication no와 UsePAM no도 추가한다. 설정 파일을 저장한 후 sudo sshd -t 명령으로 설정 문법을 검증한다. 오류 없이 통과하면 sudo systemctl restart sshd로 재시작한다. 현재 열려 있는 SSH 세션은 끊기지 않는다. 변경 후 새 터미널을 열어서 키 인증으로 접속이 되는지, 비밀번호로는 접속이 거부되는지 확인한다. sshd_config 수정 실수로 접속이 안 될 경우를 대비해 클라우드 콘솔의 웹 기반 터미널이나 시리얼 콘솔 접근 방법을 미리 알아두는 게 좋다.

UFW 방화벽과 fail2ban으로 Ubuntu 서버 보안 강화

UFW 방화벽으로 Ubuntu 서버 포트를 제어하는 방법

UFW(Uncomplicated Firewall)는 Ubuntu에 기본 내장된 방화벽 관리 도구다. iptables를 직접 다루는 것보다 훨씬 간단한 명령어로 방화벽 규칙을 설정할 수 있다. 기본적으로 UFW는 비활성 상태다. 활성화하기 전에 SSH 포트를 반드시 허용해야 한다. SSH를 허용하지 않고 UFW를 켜면 서버에 접속할 수 없게 된다. sudo ufw allow 22로 SSH 포트를 허용하거나 sudo ufw allow OpenSSH를 써도 된다. 이후 필요한 포트를 추가로 허용한다. 웹 서버는 80과 443, Node.js 앱을 Nginx 없이 직접 노출한다면 해당 포트를 허용한다. 허용 규칙을 추가한 후 sudo ufw enable로 방화벽을 활성화한다. sudo ufw status verbose로 현재 규칙 목록을 확인할 수 있다. 허용된 포트만 외부에서 접근 가능하고 나머지는 모두 차단된다. 나중에 포트를 추가하거나 제거할 때는 sudo ufw allow 포트 또는 sudo ufw deny 포트 명령을 쓴다.

fail2ban으로 Ubuntu 서버 SSH 무차별 대입 공격을 차단하는 방법

UFW로 방화벽을 설정해도 허용된 SSH 포트로 들어오는 무차별 대입 공격은 막을 수 없다. fail2ban은 인증 실패 로그를 분석해서 지정한 횟수 이상 실패한 IP를 자동으로 차단하는 도구다. sudo apt install fail2ban으로 설치한다. 기본 설정 파일은 /etc/fail2ban/jail.conf인데, 이 파일을 직접 수정하면 업데이트 시 덮어쓰여질 수 있다. 대신 /etc/fail2ban/jail.local 파일을 만들어 커스텀 설정을 작성한다. [DEFAULT] 섹션에서 bantime(차단 시간), findtime(감시 시간 창), maxretry(최대 실패 허용 횟수)를 설정한다. [sshd] 섹션에서 SSH 보호를 활성화한다. 설정 후 sudo systemctl enable fail2ban && sudo systemctl start fail2ban으로 시작한다. sudo fail2ban-client status sshd로 현재 차단된 IP 목록과 통계를 확인할 수 있다. 직접 확인해보면 설치 후 수 시간 만에 차단된 IP 목록이 쌓이기 시작한다. SSH 키 인증과 fail2ban을 함께 쓰면 외부 공격으로 서버가 뚫릴 가능성이 사실상 없어진다.

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

# 시작
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 상태 확인
sudo fail2ban-client status sshd

자주 묻는 질문

UFW를 활성화하고 나서 서버에 접속이 안 되면 어떻게 하나요?+

UFW 활성화 전에 SSH 포트 허용을 빠뜨린 경우입니다. 클라우드 콘솔의 웹 기반 터미널(VNC 콘솔, EC2 직렬 콘솔 등)로 접속해서 sudo ufw allow 22 후 sudo ufw reload를 실행하면 됩니다.

SSH 포트를 22번에서 다른 번호로 바꾸면 보안이 향상되나요?+

봇의 자동 스캔을 일부 줄일 수 있지만 근본적인 보안 향상은 아닙니다. 키 기반 인증과 fail2ban이 더 효과적입니다. 포트를 바꾼다면 UFW에서 새 포트를 허용하고 22번을 차단한 뒤, /etc/ssh/sshd_config의 Port 항목을 변경해야 합니다.

fail2ban이 내 IP를 실수로 차단하면 어떻게 해제하나요?+

sudo fail2ban-client set sshd unbanip 차단된IP 명령으로 즉시 해제할 수 있습니다. 자신의 IP를 실수로 차단하지 않도록 fail2ban.local의 ignoreip에 본인 IP를 추가해두는 것이 좋습니다.

sudo 권한을 가진 새 사용자를 만드는 방법이 있나요?+

adduser 새사용자이름으로 계정을 만들고 usermod -aG sudo 새사용자이름으로 sudo 그룹에 추가하면 됩니다. 이후 새 사용자로 SSH 접속이 되는 걸 확인하고 root 로그인을 차단하는 순서로 진행하세요.

관련 글