본문 바로가기
서버 인프라 실무

서버 첫 보안: SSH 포트 변경 + 공개키 로그인 + 루트 접속 차단(Ubuntu 24.04 기준)

by yamoojin83 2025. 10. 19.

서버 첫 보안: SSH 포트 변경 + 공개키 로그인 + 루트 접속 차단(Ubuntu 24.04 기준)

퍼블릭 클라우드든 온프레미스든, 새 서버를 받으면 제일 먼저 SSH 보안부터 잡아야 합니다. 이 글은 Ubuntu 24.04 LTS 기준으로 공개키 인증을 기본으로 만들고, 비밀번호 로그인을 끄고, 루트 접속을 막고, SSH 포트를 변경하는 순서를 “잠김 사고 없이” 안전하게 따라갈 수 있도록 정리했습니다. 마지막엔 UFW 방화벽과 fail2ban까지 연결합니다.


0) 큰 그림(실수 방지 체크)

  • 1) 새 관리자 계정 생성 → 2) SSH 공개키 배포 → 3) 새 포트 오픈(UFW) → 4) sshd_config 수정 → 5) 서비스 재시작 → 6) 테스트 접속 OK 확인 → 7) 비밀번호/루트 로그인 차단
  • 항상 기존 세션을 열어둔 채 다른 터미널에서 새 설정을 테스트하세요. 실패 시 기존 세션으로 롤백 가능합니다.

1) 새 관리자 계정 만들기

루트 대신 일반 사용자 + sudo로 운영하는 것이 기본 원칙입니다.

# 서버에서 실행
sudo adduser adminuser
sudo usermod -aG sudo adminuser

2) 공개키 만들고 서버에 등록

2-1) 로컬 PC에서 키 생성

이미 키가 있으면 건너뛰세요. (Windows는 PowerShell, macOS/Linux는 터미널)

# 로컬에서 실행
ssh-keygen -t ed25519 -C "me@myhost"
# 기본 경로(~/.ssh/id_ed25519) 사용 권장, 패스프레이즈 설정 추천

2-2) 공개키를 서버로 복사

# 로컬에서 실행 (기존 SSH 포트가 22일 때)
ssh-copy-id adminuser@SERVER_IP

# 포트를 바꾼 뒤에는 -p 옵션 사용 예:
ssh-copy-id -p 2222 adminuser@SERVER_IP

수동으로 할 경우:

# 서버에서 실행 (adminuser로 로그인 후)
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
# 여기서 로컬의 ~/.ssh/id_ed25519.pub 내용을 붙여넣기
chmod 600 ~/.ssh/authorized_keys

3) SSH 새 포트 열기(UFW) — 재시작 전 선행!

SSH 포트를 바꾸면 방화벽에서 해당 포트를 먼저 열어야 잠김 사고를 피할 수 있습니다. 예시: 2222

sudo apt install -y ufw
sudo ufw allow 22/tcp         # 기존 22는 당장 끄지 말고 유지
sudo ufw allow 2222/tcp       # 새 포트 추가
sudo ufw enable               # 아직 활성화 안 되어 있다면
sudo ufw status numbered

4) sshd_config 수정(포트/루트/비밀번호/접속자 제어)

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

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak  # 백업
sudo nano /etc/ssh/sshd_config

아래와 같이 수정/추가합니다(필요 항목만 발췌).

# 포트 변경
Port 2222

# 프로토콜/호스트키(기본값 유지 권장)
Protocol 2

# 인증 방식: 공개키만 허용
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes

# 루트 로그인 금지
PermitRootLogin no

# 접속 허용 사용자(선택) - 운영팀 계정만 허용
AllowUsers adminuser deploy

# 보안/성능 관련 권장
LoginGraceTime 30
MaxAuthTries 3
ClientAliveInterval 60
ClientAliveCountMax 2

문법 검사 후 재시작:

sudo sshd -t && echo "OK syntax" || echo "Check your sshd_config"
sudo systemctl restart ssh

5) 새 포트로 접속 테스트(기존 세션 유지)

다른 터미널(또는 로컬)에서 새 포트로 접속이 되는지 확인합니다.

# 로컬에서
ssh -p 2222 adminuser@SERVER_IP

정상 접속되면 이제야 UFW에서 22를 닫아도 됩니다.

sudo ufw delete allow 22/tcp
sudo ufw status

6) 비밀번호 로그인 완전 차단 확인

비밀번호 로그인 시도 시 거절되는지, 공개키로만 접속 가능한지 확인합니다.

# 로컬에서 (의도적으로 -o PasswordAuthentication=yes로 강제)
ssh -p 2222 -o PasswordAuthentication=yes adminuser@SERVER_IP
# > Permission denied (publickey). 형태로 거절되어야 정상

7) fail2ban으로 무차별 대입 방어(선택)

로그인 실패를 모니터링해 공격 IP를 자동 차단합니다.

sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

아래처럼 최소한의 SSH jail을 활성화합니다(포트는 변경값으로).

[sshd]
enabled = true
port    = 2222
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime  = 1h
findtime = 10m

적용:

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

8) 운영 점검 루틴

  • ss -lntup | grep sshd : SSH 포트/바인딩 확인(0.0.0.0 또는 특정 IP)
  • sudo tail -f /var/log/auth.log : 접속/실패 로그 감시
  • sudo ufw status : 방화벽 규칙 재점검
  • sudo fail2ban-client status : 차단 현황 확인

9) 자주 겪는 문제 & 복구 팁

  • 포트만 바꾸고 UFW를 안 열었다 → 콘솔(클라우드 제공)로 접속해 ufw allow 2222/tcpsystemctl restart ssh
  • 키 파일 권한 문제 → 서버에서 ~/.ssh는 700, authorized_keys는 600
  • 루트만 로그인되던 오래된 서버 → 루트로 1회 접속 후 새 계정/키를 먼저 설정하고 마지막에 PermitRootLogin no
  • 회사 고정 IP만 허용 (고급) → UFWfrom <OFFICE_IP> to any port 2222 proto tcp 식으로 화이트리스트

10) 최종 체크리스트

  • 관리자 일반 계정 + sudo 권한 부여
  • 공개키 로그인 정상, 비밀번호 로그인 거절
  • 루트 로그인 금지
  • SSH 포트 변경 & UFW allow 반영
  • 접속 테스트(새 터미널) 성공 후 22/tcp 제거
  • fail2ban 동작 확인(선택)

여기까지면 자동 스캔·무차별 대입에 대한 1차 방어선이 완성됩니다. 다음 단계로는 2FA(SSH OTP), 접속 IP 화이트리스트, 로그 중앙화까지 더하면 한층 안전한 운영 환경을 만들 수 있습니다.