서버 첫 보안: 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/tcp후systemctl restart ssh - 키 파일 권한 문제 → 서버에서
~/.ssh는 700,authorized_keys는 600 - 루트만 로그인되던 오래된 서버 → 루트로 1회 접속 후 새 계정/키를 먼저 설정하고 마지막에
PermitRootLogin no - 회사 고정 IP만 허용 (고급) →
UFW에from <OFFICE_IP> to any port 2222 proto tcp식으로 화이트리스트
10) 최종 체크리스트
- 관리자 일반 계정 +
sudo권한 부여 - 공개키 로그인 정상, 비밀번호 로그인 거절
- 루트 로그인 금지
- SSH 포트 변경 &
UFW allow반영 - 접속 테스트(새 터미널) 성공 후 22/tcp 제거
- fail2ban 동작 확인(선택)
여기까지면 자동 스캔·무차별 대입에 대한 1차 방어선이 완성됩니다. 다음 단계로는 2FA(SSH OTP), 접속 IP 화이트리스트, 로그 중앙화까지 더하면 한층 안전한 운영 환경을 만들 수 있습니다.
'서버 인프라 실무' 카테고리의 다른 글
| Nginx 서버 블록(server_name)로 도메인 연결: WWW/비WWW 선택과 301 리다이렉트, HTTP→HTTPS까지 (0) | 2025.10.20 |
|---|---|
| UFW 방화벽 실전: 웹(80/443)만 열고 나머지 닫기 + 포트스캔 방어(IPv4/IPv6, 로그, 테스트까지) (0) | 2025.10.19 |
| Ubuntu 24.04 설치 USB 만들기 & 서버 최소 설치 옵션(보안·파티션·네트워크까지) (0) | 2025.10.18 |
| CORS 에러 한 번에 끝내기: Spring Security 6 + 프록시(Nginx) 조합 (0) | 2025.10.17 |
| 리눅스 서버에 Resin WAS 올리기: 설치·보안·systemd·Nginx 연동(HTTPS)까지 (0) | 2025.10.17 |