Develop

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를 보니 수천 건의 해외 IP발 SSH 로그인 시도 기록이 찍혀 있더군요. 깜짝 놀라서 그 이후로는 새 서버를 분양받으면 30분 이내에 무조건 SSH 키 인증을 걸고 비밀번호 로그인을 전면 차단합니다. UFW 방화벽을 켜고 fail2ban 패키지까지 설치해 두면, 하루에도 수십 개씩 무차별 대입 공격을 시도하다가 차단 목록에 박히는 IP 주소들을 보며 든든한 보안의 쾌감을 느끼게 됩니다.

1. 최초 기동과 인프라 보안 위험

Ubuntu 서버 개설 즉시 SSH 보안 설정이 절실한 이유

클라우드 웹 콘솔에서 새로운 가상 사설 서버(VPS)나 EC2 인스턴스를 발급받고 공인 IP가 할당되는 그 찰나의 순간부터, 우리의 서버는 온 세상 해커들과 자동 스캔 봇의 표적이 됩니다. 특히 SSH 기본 포트인 22번은 전 세계 스크립트 키디와 봇넷이 가장 먼저 찔러보는 관문이죠. 임시 계정명이나 root에 단순한 패스워드를 묶어둔 채 방치하면 단 수 시간 만에 무차별 대입 공격(Brute-Force) 스크립트에 의해 해킹당해 서버 자원을 채굴이나 악성 패킷 숙주로 강탈당하게 됩니다. 이 참사를 예방하는 가장 우아하고 강력한 해법은 비밀번호 기반 로그인을 법적으로 금지하고, 2048비트 이상의 강력한 SSH 공개키/개인키 쌍을 이용한 인증 방식으로 서버를 걸어 잠그는 것입니다.

2. 키 인증 셋업 및 계정 요새화

로컬에서 비밀키를 생성하고 Ubuntu 서버에 SSH 키 등록하는 방법

안전한 접속 환경을 짓기 위해 먼저 내 개발 컴퓨터(로컬)의 터미널에서 ssh-keygen 명령을 수행하여 강력한 Ed25519 혹은 RSA 알고리즘 키 쌍을 만듭니다. 이때 생성된 .pub 확장자의 공개키 문자열만 타겟 서버의 ~/.ssh/authorized_keys 파일 하단에 고이 복사해 주면 되죠. ssh-copy-id 헬퍼 명령어를 사용하면 이 복사 과정을 단 한 줄로 자동 수행해 줍니다. 한 가지 실무 팁으로, 리눅스 시스템은 디렉토리와 보안 키 파일의 접근 권한 권고안을 엄격하게 지켜야만 SSH 구동을 허용하므로, 복사를 마친 후 .ssh 폴더는 700 권한으로, authorized_keys 파일은 600 권한으로 확실하게 제한을 설정해 두어야 권한 충돌 에러 없이 바르게 기동됩니다.

# 1. 로컬 개발 장비에서 SSH 키 쌍 생성
ssh-keygen -t ed25519 -C "my-server-key"

# 2. 공개키를 타겟 Ubuntu 서버로 전송 등록
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@123.45.67.89

# 3. 타겟 서버 내 보안 디렉토리 권한 조정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

비밀번호 접속을 막아 SSH 보안 인증 요새 구축하기

공개키 주입 후 해당 키를 가진 로컬 단말기에서 패스워드 없이 로그인이 매끄럽게 통과하는 걸 최종 확인했다면, 이제 기존의 취약한 패스워드 문을 폐쇄할 차례입니다. 서버의 /etc/ssh/sshd_config 설정 파일을 열고 PasswordAuthentication noPermitRootLogin no 옵션을 명시적으로 기재합니다. root 사용자의 직접 로그인을 거부하고 비밀번호 입력을 원천 거부하도록 막는 세팅이죠. 설정을 마친 뒤 sudo sshd -t 구문 검사 명령으로 오타가 없는지 검증하고, 문제가 없다면 sudo systemctl restart sshd 커맨드로 서비스를 재시작합니다. 현재 접속해 있는 터미널 세션을 끊지 말고 그대로 유지한 상태에서, 새 쉘 창을 열어 패스워드 없는 키 접속이 완벽히 먹히는지 관찰해 두어야 혹시 모를 접속 잠김 사고를 예방할 수 있습니다.

3. 방화벽 적용 및 무차별 대입 방어

Ubuntu 방화벽인 UFW 활성화 시 접속 끊김 예방 요령

계정 방어를 끝마쳤다면 다음 코스는 운영체제 포트를 조율하는 UFW(Uncomplicated Firewall) 방화벽 셋업입니다. Ubuntu에 내장된 이 방화벽 헬퍼는 복잡한 iptables 규칙을 외우지 않아도 직관적으로 차단벽을 조립하게 돕습니다. 한 가지 절대 잊지 말아야 할 주의사항은, ufw를 활성화하기 전에 **반드시 SSH 접속을 허용하는 규칙(sudo ufw allow 22)을 먼저 선언해야 한다는 것**입니다. 이를 빠뜨린 채 설익게 ufw enable 명령을 질렀다가는, 활성화 즉시 내 포트까지 차단막에 걸려 서버 접속 능력을 영구 소실하고 클라우드 인스턴스를 날려버리는 자살골을 넣게 됩니다. SSH 포트와 필요한 웹 포트(80, 443 등) 개방을 완전히 마치고 나서 방화벽을 기동해야 평화롭습니다.

무작위 차단을 수행하는 Ubuntu fail2ban 보안 패키지 적용법

SSH 비밀번호를 막고 방화벽을 켰더라도 포트 22번 자체는 열려있기 때문에 봇들의 의미 없는 접속 시도는 계속 발생하고 서버 네트워크 대역을 소모시킵니다. 이를 지능적으로 처단해 주는 보안 감시자가 바로 fail2ban 패키지입니다. fail2ban/var/log/auth.log 등의 접속 인증 로그를 상시 모니터링하여, 지정된 시간 이내에 몇 번 이상(예: maxretry = 5) 로그인에 연달아 실패한 악성 IP를 검출한 뒤, 해당 IP를 일정 시간 동안 방화벽 블랙리스트에 집어넣어 아예 패킷 응답조차 안 하도록 벤(Ban) 처리해 줍니다. /etc/fail2ban/jail.local 파일을 커스텀 개설하여 감시 시간대와 패널티 차단 시각을 심플하게 적어주면, 서버 관리자가 24시간 감시하지 않아도 해커들의 부적절한 노크 시도를 스스로 단속해 줍니다.

# /etc/fail2ban/jail.local 파일 설정 내용
[DEFAULT]
bantime  = 86400  # 24시간 동안 접근 차단
findtime = 600    # 10분간의 로그 추적
maxretry = 5      # 최대 5회 실패 시 벤 처리

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

차단된 이력을 조회하고 fail2ban 동작 상태 검증하기

fail2ban 서비스를 올리고 시간이 흐른 뒤 sudo fail2ban-client status sshd 명령어를 쳐보면, 실시간으로 차단망에 가입된 해커 IP 목록과 누적 차단 통계 수치가 화면에 인쇄됩니다. 내 로컬 IP 주소를 실수로 차단하지 않도록 jail.local 설정의 ignoreip 목록에 내 IP나 사내 대역을 화이트리스트로 적어두는 센스를 장착하면 실무 트러블이 없습니다. 만약 실수로 내 컴퓨터 접속이 벤당해 잠겼다면, 클라우드 웹 콘솔 터미널로 우회 진입하여 sudo fail2ban-client set sshd unbanip [내IP] 명령으로 안전하게 락을 해제해 주면 됩니다.

자주 묻는 질문

UFW 방화벽을 켠 직후 SSH 원격 쉘 접속이 완전히 차단되어 접근할 수 없습니다.+

UFW를 enable 하기 전에 SSH 포트 개방 명령(`sudo ufw allow 22`)을 선언하지 않아 일어난 대참사입니다. 클라우드 관리 콘솔에 제공되는 웹 브라우저 기반 VNC 직렬 콘솔로 로그인하여 `sudo ufw disable` 또는 `sudo ufw allow 22`를 입력해 방화벽을 일시 해제하셔야 복구됩니다.

fail2ban이 작동 중인데 실수로 제 개발 머신 IP가 차단당했습니다. 어떻게 푸나요?+

안전한 우회 망이나 클라우드 웹 터미널로 서버에 로그인한 뒤, `sudo fail2ban-client set sshd unbanip [차단된IP]`를 입력하면 즉각 락이 풀립니다. 추가로 `/etc/fail2ban/jail.local` 파일 내의 `ignoreip` 필드에 본인 아이피를 미리 등록해 두면 자동 차단을 영구 방지할 수 있습니다.

관련 글