테마 전환

Ubuntu 초기 설정 전체 과정: 사용자, SSH, fail2ban 보안 구성

Easton editorial illustration: lifecycle journey rail

새벽 세 시, 터미널에 뜬 “Permission denied” 오류를 바라보며 식은땀이 흘렀습니다.

서버에 들어갈 수 없었습니다. SSH 설정 하나를 별생각 없이 바꾸면서 복구할 방법을 남겨 두지 않았기 때문입니다.

3년 전 처음 VPS를 샀을 때의 일입니다. 지금 생각하면 당시 작업 방식은 교과서에 나올 법한 나쁜 사례였습니다. root로 바로 로그인했고, 생일을 비밀번호로 썼으며, SSH는 기본 22번 포트를 그대로 사용했습니다. 방화벽이요? 들어 본 적도 없었습니다. 그 결과 서버를 운영한 지 2주도 안 돼 온갖 스캔에 시달렸고 로그에는 무차별 대입 공격 흔적이 가득했습니다.

솔직히 많은 초보자가 VPS를 구매한 뒤 가장 먼저 하는 일은 서둘러 프로그램을 설치하고 프로젝트를 배포하는 것입니다. 사용자 관리와 SSH 보안 강화는 번거로우니 나중에 하겠다고 미룹니다. 하지만 그렇게 미룬 작업이 서버가 얼마나 오래 버틸지를 결정합니다.

이 글의 목표는 하나입니다. 새로 구매한 Ubuntu 서버(22.04 또는 24.04)를 처음부터 안전하고 사용할 수 있는 상태로 구성합니다. 사용자 권한, SSH 보안 강화, fail2ban 자동 차단을 빠짐없이 다룹니다. 단순히 복사해 붙여 넣을 명령어만 나열하지 않고 각 단계를 왜 해야 하는지도 설명하겠습니다.

약 10분이면 전체 과정을 끝낼 수 있습니다. 완료하고 나면 서버의 보안 수준은 인터넷에 무방비로 노출된 서버 80%보다 높아질 것입니다.

1. 초기 설정 전 준비 작업

작업을 시작하기 전에 필요한 도구부터 준비합니다. 로컬 컴퓨터에서 SSH 키 쌍을 생성해야 합니다.

비밀번호 대신 키를 사용하는 이유는 무엇일까요? 간단히 말하면 비밀번호는 무차별 대입으로 알아낼 수 있지만 키는 사실상 불가능합니다. 256비트 Ed25519 키를 무차별 대입으로 해독하는 데는 우주의 나이보다 긴 시간이 걸립니다.

키 생성

지금은 기존 RSA보다 안전하고 키 길이도 짧은 Ed25519 알고리즘을 권장합니다. 생성 명령어는 간단합니다.

# macOS / Linux
ssh-keygen -t ed25519 -C "[email protected]"

# Windows(PowerShell, OpenSSH 클라이언트 필요)
ssh-keygen -t ed25519 -C "[email protected]"

실행하면 키를 저장할 위치와 비밀번호 설정 여부를 묻습니다. Enter를 눌러 기본 경로를 사용하면 됩니다. 비밀번호는 필요에 따라 설정하세요. 설정하면 더 안전하지만 연결할 때마다 입력해야 합니다.

생성이 끝나면 로컬에 두 파일이 생깁니다.

  • ~/.ssh/id_ed25519 — 개인 키이므로 절대 유출하면 안 됩니다.
  • ~/.ssh/id_ed25519.pub — 잠시 후 서버에 업로드할 공개 키입니다.

터미널 도구는 macOS 기본 Terminal이면 충분합니다. Windows에서는 Windows Terminal이나 MobaXterm을 권장합니다. 핵심 내용은 아니므로 자세한 설명은 생략하겠습니다.

2. 사용자 및 권한 관리

먼저 root로 서버에 로그인합니다. root로 직접 로그인하는 것은 이번이 마지막이며, 이후에는 비활성화합니다.

ssh root@내서버IP

root를 사용하지 않는 이유

한마디로 결과가 너무 치명적이기 때문입니다.

root는 권한이 지나치게 큽니다. 파일 하나를 잘못 삭제하거나 설정 하나를 잘못 바꾸면 시스템 전체가 망가질 수 있습니다. 더 큰 문제는 많은 공격 스크립트가 root 계정을 노리고 무차별 대입을 시도한다는 점입니다. SSH 로그인에 root를 노출하는 것은 해커에게 커다란 표적을 내주는 것과 같습니다.

일상적인 작업은 일반 계정으로 진행하고, 권한이 필요할 때만 sudo를 사용하세요. 이는 Linux의 기본 보안 원칙입니다.

배포용 사용자 생성

저는 ‘배포 전용’이라는 의미로 deploy라는 이름을 선호합니다. 원하는 다른 이름을 사용해도 됩니다.

# 사용자 생성(비밀번호와 일부 정보 입력 안내가 표시됩니다)
adduser deploy

# sudo 권한 부여
usermod -aG sudo deploy

Ubuntu가 비밀번호와 사용자 정보를 입력하라고 합니다. 기억할 수 있는 비밀번호를 설정하고 나머지 정보는 Enter를 눌러 건너뛰면 됩니다.

새 사용자에게 공개 키 업로드

이제 로컬 공개 키를 새 계정에 업로드해야 합니다. 로컬 컴퓨터에서 다음 명령어를 실행합니다.

# macOS / Linux
ssh-copy-id deploy@내서버IP

# Windows(PowerShell)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@내서버IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

그런 다음 deploy로 로그인할 수 있는지 테스트합니다.

ssh deploy@내서버IP

로그인되나요? 그렇다면 이후 작업은 deploy 계정으로 진행하고 root로 돌아가지 마세요. root 권한이 필요할 때는 sudo를 붙이면 됩니다.

여러 사용자가 함께 쓰는 경우

팀원 여러 명이 서버를 사용해야 한다면 사람마다 별도의 계정을 만들 수 있습니다. 예를 들면 다음과 같습니다.

# 동료 장싼(zhangsan)의 계정 생성
adduser zhangsan
usermod -aG sudo zhangsan

# 공개 키 업로드(본인이 로컬 컴퓨터에서 실행)
ssh-copy-id zhangsan@내서버IP

각자 자신의 계정을 사용하면 작업 기록을 추적할 수 있고 문제가 생겼을 때 원인을 조사하기도 쉽습니다.

3. SSH 보안 강화

이 단계는 전체 초기 설정에서 가장 중요하며, 동시에 실수로 ‘자기 자신을 문밖에 가두는’ 사고가 가장 자주 발생하는 부분입니다.

경고: SSH 설정을 바꾸기 전에 현재 연결을 반드시 유지하고, 터미널 창을 하나 더 열어 테스트하세요. 설정을 잘못 바꾸더라도 기존 창에서 복구할 수 있습니다.

SSH 설정 파일 편집

sudo nano /etc/ssh/sshd_config

핵심 매개변수 설명

1. Port 포트

Port 22    # 기본값, 변경 권장

22번 포트는 인터넷 전체를 대상으로 하는 스캔의 최우선 표적입니다. 높은 번호의 포트(예: 22222 또는 54321)로 바꾸면 대부분의 무차별 스캔을 피할 수 있습니다.

Port 54321

주의: 클라우드 서비스 제공자(Alibaba Cloud, Tencent Cloud, AWS 등)를 사용한다면 포트를 바꾼 뒤 보안 그룹 또는 방화벽에서 새 포트를 허용해야 합니다. 그렇지 않으면 접속할 수 없습니다.

2. PermitRootLogin으로 root 로그인 금지

PermitRootLogin no    # 반드시 변경

왜 그럴까요? 앞에서 설명했듯 root는 해커의 최우선 표적입니다. root 로그인을 막으면 공격 표면을 크게 줄일 수 있습니다.

3. PasswordAuthentication으로 비밀번호 로그인 비활성화

PasswordAuthentication no    # 키 로그인만 허용

무차별 대입 공격을 막는 핵심 설정입니다. 개인 키만 유출되지 않는다면 누군가 비밀번호를 알아도 로그인할 수 없습니다.

4. 기타 보안 매개변수

MaxAuthTries 3              # 최대 3회 시도
ClientAliveInterval 300     # 5분 동안 작업이 없으면 연결 종료
ClientAliveCountMax 2       # 최대 2회 무응답 허용

이 매개변수는 오랫동안 유휴 상태인 연결이 리소스를 차지하지 않게 하고 무차별 대입 시도 횟수도 제한합니다.

3단계 설정 검증

설정을 바꿨다고 바로 재시작하지 말고 먼저 검증하세요.

1단계: 설정 문법 테스트

sudo sshd -t

아무 출력도 없다면 좋은 소식입니다. 문법에 문제가 없다는 뜻입니다.

2단계: 새 창에서 연결 테스트

현재 창은 그대로 둔 채 다른 터미널 창을 열고 새 포트와 deploy 계정으로 연결합니다.

ssh -p 54321 deploy@내서버IP

연결되나요? 그렇다면 설정이 적용됐고 자기 자신을 문밖에 가두지도 않은 것입니다.

3단계: 이상이 없음을 확인한 뒤 서비스 재시작

sudo systemctl restart sshd
# 또는
sudo systemctl restart ssh

재시작한 뒤 새 창에서 다시 한 번 테스트합니다. 정상적으로 로그인되는 것을 확인해야 이 단계가 실제로 완료됩니다.

알아 두면 좋은 팁

설정을 바꾼 뒤 접속할 수 없더라도 당황하지 마세요. 클라우드 서비스 제공자 콘솔에서 VNC로 로그인하고 설정을 되돌린 다음 서비스를 재시작하면 됩니다. 제가 SSH 설정을 바꾸기 전에 기존 연결 하나를 유지하라고 계속 강조하는 이유도 바로 이것입니다.

4. fail2ban 자동 차단

앞에서 설명한 SSH 설정의 주된 목적은 무차별 대입 공격을 막는 것입니다. 그래도 누군가 포기하지 않고 계속 비밀번호를 시도한다면 어떻게 해야 할까요? 이때 fail2ban이 필요합니다.

fail2ban이란 무엇일까요? 로그를 자동으로 감시하고 의심스러운 IP를 차단하는 도구입니다. 누군가 비밀번호를 연속으로 여러 번 틀리면 일정 시간 자동 차단합니다. 단순하지만 효과는 탁월합니다.

설치 및 시작

sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

sshd jail 구성

fail2ban은 ‘jail’이라는 개념으로 서비스별 감시 규칙을 관리합니다. SSH에는 기본 sshd jail이 있습니다.

로컬 설정 파일을 생성합니다. 업그레이드할 때 덮어써질 수 있으므로 기본 설정을 직접 수정하지 마세요.

sudo nano /etc/fail2ban/jail.local

다음 내용을 입력합니다.

[sshd]
enabled = true
port = 54321          # 내 SSH 포트로 변경
maxretry = 3          # 3회 실패하면 차단
findtime = 600        # 10분 동안
bantime = 3600        # 1시간 차단

매개변수 설명:

  • maxretry: 허용되는 최대 실패 횟수입니다. 기본값은 5이며, 여기서는 더 엄격하게 3으로 바꿉니다.
  • findtime: 초 단위의 시간 범위입니다. 600초, 즉 10분 안에 3번 실패하면 차단 조건이 발동합니다.
  • bantime: 초 단위의 차단 시간입니다. 3600은 1시간입니다. 86400(하루)이나 더 긴 시간으로 설정해도 됩니다.

설정을 마친 뒤 서비스를 재시작합니다.

sudo systemctl restart fail2ban

차단 상태 확인

# 모든 jail 상태 확인
sudo fail2ban-client status

# sshd jail 상세 정보 확인
sudo fail2ban-client status sshd

현재 차단된 IP 목록이 표시됩니다.

IP 차단 해제

디버깅 중 비밀번호를 너무 많이 틀리는 등의 이유로 자신의 IP가 잘못 차단됐다면 다음과 같이 해제할 수 있습니다.

sudo fail2ban-client set sshd unbanip 내IP

고급 설정: 사용자 정의 규칙

fail2ban은 SSH뿐 아니라 Nginx, Apache, MySQL 같은 서비스도 보호할 수 있습니다. 구성 방법은 비슷하며 해당 jail을 생성하면 됩니다. 자세히 설명하면 길어지므로 여기서는 이 정도만 다루겠습니다.

5. 버전 차이 빠른 비교

Ubuntu 22.04와 24.04의 초기 설정 과정은 대체로 같지만 일부 세부 사항에 차이가 있습니다.

주요 차이 비교

항목Ubuntu 22.04 LTSUbuntu 24.04 LTS
커널 버전5.156.8
OpenSSH 버전8.99.6
기본 Python3.103.12
systemd 버전249255
지원 기간2027년 4월까지2029년 4월까지

실제 영향

좋은 소식: 이 글의 초기 설정 과정은 두 버전에서 모두 그대로 사용할 수 있습니다. SSH 설정 경로, fail2ban 설치 방법, 사용자 관리 명령어는 모두 같습니다.

주의할 점:

  1. **OpenSSH 9.x(24.04)**는 기본 설정이 조금 더 엄격하고 일부 오래된 암호화 알고리즘이 비활성화돼 있습니다. 오래된 SSH 클라이언트로 24.04에 연결할 때 문제가 발생한다면 클라이언트를 업그레이드하면 됩니다.

  2. 클라우드 서비스 제공자 이미지: 일부 제공자의 22.04 이미지에는 감시 또는 관리 스크립트가 미리 설치돼 있어 사용자 설정과 충돌할 수 있습니다. 공식 순정 이미지를 사용하거나 초기 설정 전에 기존 서비스를 확인하는 것이 좋습니다.

  3. 업그레이드 문제: 이미 운영 중인 22.04 서버가 있다면 24.04로 업그레이드하기 전에 스냅샷을 만드는 것이 좋습니다. do-release-upgrade가 대부분 문제없이 완료되더라도 보안 설정에서는 신중한 편이 안전합니다.

어떤 버전을 선택할까요?

  • 새 프로젝트: 24.04를 바로 사용하세요. 지원 기간이 더 길고 소프트웨어 버전도 최신입니다.
  • 기존 프로젝트: Python 3.10처럼 특정 버전에 의존한다면 22.04를 사용하세요.
  • 안정성 우선: 22.04는 이미 충분히 성숙해 대부분의 문제가 해결돼 있습니다.
  • 최신 기능 우선: 24.04에는 향상된 하드웨어 지원과 성능 최적화 같은 새 기능이 있습니다.

마무리

지금까지 설명한 초기 설정 과정의 핵심을 다시 정리해 보겠습니다.

3가지 핵심 보안 조치:

  • 일반 사용자를 생성하고 root 로그인을 비활성화합니다.
  • SSH 포트를 변경하고 비밀번호를 비활성화해 키 로그인만 허용합니다.
  • fail2ban으로 의심스러운 IP를 자동 차단합니다.

작업 원칙:

  • 설정을 바꾸기 전에 기존 연결 하나를 유지합니다.
  • 서둘러 재시작하지 말고 단계마다 검증합니다.
  • 개인 키는 절대 유출하지 않습니다.

검증 체크리스트:

  • 새 포트로 deploy 계정에 SSH 로그인할 수 있습니다.
  • root 계정으로 로그인할 수 없습니다.
  • 비밀번호 로그인이 비활성화됐습니다.
  • fail2ban 서비스가 정상적으로 실행됩니다.

이 구성은 서버 보안의 첫걸음일 뿐입니다. 이후에는 방화벽(UFW)을 구성하고 Docker를 설치하며 애플리케이션을 배포해야 합니다. 이런 주제는 다음에 다시 다루겠습니다.

이 튜토리얼을 따라 하다 문제가 생기면 댓글로 이야기해 주세요. 3년 전 새벽 세 시에 겪었던 것처럼 자기 자신을 서버 문밖에 가두는 일이 여러분에게는 일어나지 않기를 진심으로 바랍니다.

Ubuntu 서버 초기 보안 설정

사용자 관리, SSH 보안 강화, fail2ban 차단을 포함해 안전한 Ubuntu 서버를 처음부터 구성합니다.

⏱️ Estimated time: 10 min

  1. 1

    Step 1: SSH 키 생성

    로컬 컴퓨터에서 Ed25519 키 쌍을 생성합니다:

    • 명령어: ssh-keygen -t ed25519 -C "[email protected]"
    • 개인 키는 ~/.ssh/id_ed25519에 저장됩니다(절대 유출하지 마세요).
    • 공개 키는 ~/.ssh/id_ed25519.pub에 저장됩니다(서버에 업로드할 파일입니다).
  2. 2

    Step 2: 일반 사용자 생성

    서버에 로그인한 뒤 배포용 사용자를 생성합니다:

    • 사용자 생성: adduser deploy
    • sudo 권한 부여: usermod -aG sudo deploy
    • 기억할 수 있는 비밀번호를 설정합니다.
  3. 3

    Step 3: 공개 키 업로드 및 로그인 테스트

    로컬 컴퓨터에서 실행합니다:

    • ssh-copy-id deploy@서버IP
    • 로그인 테스트: ssh deploy@서버IP
    • deploy 계정으로 정상 로그인되는지 확인한 뒤 이후 작업은 이 계정으로 진행합니다.
  4. 4

    Step 4: SSH 설정 변경

    /etc/ssh/sshd_config를 편집합니다:

    • Port 54321(높은 번호의 포트로 변경)
    • PermitRootLogin no(root 로그인 금지)
    • PasswordAuthentication no(비밀번호 로그인 비활성화)
    • MaxAuthTries 3
    • ClientAliveInterval 300

    주의: 변경하기 전에 기존 연결 하나를 반드시 유지하세요!
  5. 5

    Step 5: SSH 설정 검증 및 재시작

    3단계 검증 방법:

    • 문법 테스트: sudo sshd -t
    • 새 창에서 테스트: ssh -p 54321 deploy@서버IP
    • 이상이 없으면 재시작: sudo systemctl restart sshd
  6. 6

    Step 6: fail2ban 설치 및 구성

    무차별 대입 공격을 시도하는 IP를 자동 차단합니다:

    • 설치: sudo apt install fail2ban -y
    • /etc/fail2ban/jail.local 구성
    • maxretry=3, bantime=3600 설정
    • 서비스 재시작: sudo systemctl restart fail2ban

FAQ

SSH 포트는 몇 번으로 바꾸는 것이 좋나요?
1024~65535 사이의 높은 번호 포트(예: 22222, 54321)를 권장합니다. 자주 쓰는 포트(80, 443, 3306 등)를 피하면 스캔될 가능성을 줄일 수 있습니다. 변경 후에는 클라우드 서비스 제공자의 보안 그룹에서 새 포트를 반드시 허용하세요.
SSH 설정을 바꾼 뒤 접속할 수 없으면 어떻게 하나요?
당황하지 말고 클라우드 서비스 제공자 콘솔에서 VNC로 로그인한 뒤 설정을 되돌리고 sshd 서비스를 재시작하면 됩니다. 그래서 설정을 바꾸기 전 기존 연결을 유지하고 새 창에서 테스트하는 것이 중요합니다.
fail2ban이 내 IP도 차단할 수 있나요?
그럴 수 있습니다. 비밀번호를 여러 번 틀리면 자신의 IP도 차단됩니다. 차단 해제 명령어는 sudo fail2ban-client set sshd unbanip 내IP입니다. 설정할 때 자신의 IP를 허용 목록(ignoreip)에 추가하는 것이 좋습니다.
Ubuntu 22.04와 24.04의 초기 설정에는 어떤 차이가 있나요?
이 글의 과정은 두 버전에서 모두 그대로 사용할 수 있습니다. 주된 차이는 24.04의 OpenSSH 버전이 더 높고(9.6) 기본 설정이 더 엄격하며 일부 오래된 암호화 알고리즘이 비활성화됐다는 점입니다. 오래된 SSH 클라이언트를 사용한다면 업그레이드해야 할 수 있습니다.
키 로그인이 비밀번호 로그인보다 얼마나 안전한가요?
몇 자릿수 차이라고 표현할 만큼 큰 차이가 있습니다. 256비트 Ed25519 키를 무차별 대입으로 해독하는 데는 우주의 나이보다 긴 시간이 걸립니다. 반면 비밀번호 로그인은 사전 공격과 무차별 대입 공격에 노출되며, 특히 약한 비밀번호는 사실상 무방비 상태와 같습니다.
SSH 포트를 다시 22번으로 바꿔도 되나요?
기술적으로는 가능하지만 권장하지 않습니다. 22번 포트는 인터넷 전체를 대상으로 하는 스캔의 최우선 표적입니다. 높은 번호의 포트로 바꾸면 대부분의 자동 스캔 스크립트를 피할 수 있습니다. fail2ban과 키 로그인을 함께 사용하면 훨씬 안전합니다.

2분 읽기 · 게시일: 2026년 3월 27일 · 수정일: 2026년 9월 4일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog