SSH 설정 파손 복구
sshd_config 편집 실수로 SSH 접속이 차단됐을 때 sshd -t 문법 검사, 호스트 키 권한 복구, 직렬 콘솔 접근으로 원격 서버를 복구하는 방법을 설명합니다. 잠금 방지 워크플로도 함께 다룹니다.
지난 글에서 파일 시스템 읽기 전용 상태를 복구했다. 이번에는 시리즈 마지막 편으로, SSH 설정을 잘못 편집해서 접속 자체가 차단되는 최악의 상황을 다룬다. /etc/ssh/sshd_config에 오타 한 줄이 있으면 sshd가 시작을 거부하고, 그 순간부터 원격 서버에 접근할 수 없다. 이 상황을 빠져나오는 방법을 단계별로 살펴본다.
사고 발생 전 방지 워크플로
설정 변경 전 반드시 아래 순서를 따른다.
# 1. 설정 파일 백업
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 2. 설정 수정
sudo vim /etc/ssh/sshd_config
# 3. 문법 검사 (재시작 전 반드시 실행)
sudo sshd -t
# 오류 없으면 아무것도 출력하지 않음
# 오류 시: /etc/ssh/sshd_config line 42: Bad configuration option: PermitRoootLogin
# 4. 기존 세션을 유지한 채로 재시작
sudo systemctl restart sshd
# 5. 별도 터미널에서 접속 테스트 후 기존 세션 닫기
절대 금지: 기존 SSH 세션을 닫은 상태에서 설정을 변경하고 재시작하는 것. 접속이 차단되면 콘솔 접근이 필요하다.
1단계 — 서비스 상태 확인
이미 잠긴 상황이라면 콘솔(또는 클라우드 직렬 콘솔)에서:
sudo systemctl status sshd
# ● sshd.service - OpenBSD Secure Shell server
# Loaded: loaded
# Active: failed (Result: exit-code)
실패 메시지에서 에러 원인을 확인한다.
journalctl -u sshd --since "5 min ago"
# error: /etc/ssh/sshd_config line 42: Bad configuration option: PermitRoootLogin
2단계 — 문법 검사로 오류 위치 파악
sudo sshd -t
# /etc/ssh/sshd_config: line 42: Bad configuration option: PermitRoootLogin
sshd -t는 설정 파일을 로드하고 문법 오류만 검사한 후 종료한다. 실제로 데몬을 시작하지 않으므로 안전하게 사용할 수 있다.
에러 줄 번호를 확인하고 수정한다:
sudo sed -n '40,44p' /etc/ssh/sshd_config
sudo vim +42 /etc/ssh/sshd_config
3단계 — 백업에서 복원
오류가 많거나 원래 설정이 필요하면 백업에서 복원한다.
# 백업에서 복원
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
# 패키지 기본 설정으로 초기화 (Debian/Ubuntu)
sudo dpkg-reconfigure openssh-server
# 패키지 재설치 (기본값 복원)
sudo apt reinstall openssh-server # Debian/Ubuntu
sudo dnf reinstall openssh-server # RHEL/Rocky
4단계 — 호스트 키 문제 처리
sshd가 시작되지만 클라이언트에서 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!” 메시지가 나오면 서버의 호스트 키가 바뀐 것이다.
# 호스트 키 확인
ls -la /etc/ssh/ssh_host_*
# 권한이 600 (소유자 root만 읽기)이어야 함
# 호스트 키 권한 복구
sudo chmod 600 /etc/ssh/ssh_host_*_key
sudo chmod 644 /etc/ssh/ssh_host_*_key.pub
sudo chown root:root /etc/ssh/ssh_host_*
# 호스트 키 전체 재생성 (기존 키 모두 삭제 후 재생성)
sudo ssh-keygen -A
클라이언트에서 known_hosts 초기화:
ssh-keygen -R server_ip
ssh-keygen -R server_hostname
5단계 — sshd 재시작 및 포트 확인
sudo systemctl restart sshd
sudo systemctl status sshd
# sshd가 포트를 리슨하는지 확인
ss -tlnp | grep :22
# 출력: LISTEN 0 128 0.0.0.0:22 *:* users:(("sshd",pid=...))
클라우드 VM — 직렬 콘솔 접근
SSH가 완전히 차단됐을 때 클라우드 직렬 콘솔로 접근한다:
- AWS: EC2 Instance Connect (브라우저 기반 SSH) 또는 Systems Manager Session Manager
- GCP: gcloud compute ssh —tunnel-through-iap 또는 직렬 콘솔
- Azure: Azure Bastion 또는 직렬 콘솔
자주 발생하는 설정 오류 패턴
# 자주 틀리는 설정 예
PermitRootLogin prohibit-password # 올바른 값
PermitRootLogin prohibit_password # 언더스코어 오류 → 거부
# 허용 목록 형식 오류
AllowUsers alice bob # 올바름 (공백 구분)
AllowUsers alice,bob # 콤마 구분 불가 → 거부
# 포트 설정 오류
Port 22222 # 방화벽 허용 없으면 차단됨
사고 후 재발 방지
# systemd의 조건부 재시작 활용
# sshd_config 변경 후 테스트가 실패하면 자동으로 이전 설정 복원
sudo sshd -t && sudo systemctl reload sshd || sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
또는 ExecStartPre=-/usr/sbin/sshd -t를 서비스 파일에 추가하면 문법 오류 시 sshd가 시작을 거부해 명시적 에러를 남긴다.
SSH 설정 파손 복구의 핵심은 편집 전 백업 + sshd -t 검사 + 기존 세션 유지 세 가지 습관이다. 이미 잠긴 후라면 콘솔 접근이 유일한 탈출구이므로, 중요 서버는 항상 콘솔 접근 수단을 미리 확인해 두어야 한다.
지난 글: 파일 시스템 읽기 전용 복구
읽어주셔서 감사합니다. 😊