sshdのハードニング
한국어 원문으로 표시합니다.
목표
drop-in 설정 파일로 sshd 를 하드닝하고, sshd -t 와 sshd -T 로 검증한 뒤, 키 접속은 유지되고 비밀번호 인증은 거부되는지 실제로 확인합니다.
왜 중요한가
원격 서버의 sshd 를 고치는 것은 타고 있는 나뭇가지를 자르는 일입니다. 그래서 순서가 정해져 있습니다: 세션 유지 → 수정 → sshd -t → 재적재 → 새 세션으로 확인 → 그다음에 기존 세션 종료. 그리고 요즘 배포판은 Include /etc/ssh/sshd_config.d/*.conf 로 설정을 조각냅니다. 같은 키가 여러 번 나오면 첫 번째 값이 이기므로 "고쳤는데 안 먹는다" 가 흔합니다. sshd -T 로 최종 적용 값을 확인하는 습관이 이 문제를 원천 차단합니다.\n\n## 이 실습은 가상머신에서 돕니다\n\nsshd 가 실제 systemd 서비스로 돌기 때문에 systemctl reload ssh 로 설정을 다시 읽히고, 새 세션으로 붙어서 확인할 수 있습니다. 예전에는 파드에서 돌아 systemctl 이 없었고 pkill sshd 로 프로세스를 직접 다뤄야 했습니다.\n\n환경을 세울 때 하나를 미리 처리해 두었습니다. 우분투 24.04 는 ssh.socket 이 켜져 있고, 그 상태에서는 듣는 포트를 systemd 가 정합니다 — sshd_config 의 Port 는 무시됩니다. 설정을 고치고 재시작해도 22번으로만 듣고 오류도 경고도 나오지 않습니다. 실습용 2222 포트를 열기 위해 소켓 활성화를 끄고 ssh.service 를 켜 두었습니다. 실제 서버에서 "포트를 바꿨는데 안 열린다" 를 만나면 여기를 먼저 보세요.\n\n22번 포트는 그대로 둡니다. 설정을 잘못 써도 되돌아갈 길을 남겨 두기 위해서입니다 — 실제 서버에서도 같은 이유로 새 포트를 먼저 열어 확인한 뒤 옛 포트를 닫습니다.
단계
/root/harden디렉터리를 만들고, 현재 유효 설정 전체를/root/harden/baseline.txt로 저장하세요./etc/ssh/sshd_config.d/90-labhub.conf를 만들고 다음 값을 넣으세요.PasswordAuthentication no,KbdInteractiveAuthentication no,PubkeyAuthentication yes,MaxAuthTries 3,LoginGraceTime 30,X11Forwarding no,PermitEmptyPasswords no,LogLevel VERBOSE- 문법 검사를 실행해 통과하는 것을 확인하고, 종료 코드를
/root/harden/syntax.txt에rc=0형식으로 적으세요. - 최종 적용 값 중
passwordauthentication,kbdinteractiveauthentication,maxauthtries,logingracetime네 줄만 골라/root/harden/effective.txt로 저장하세요. - 같은 파일 끝에
Match User backup블록을 추가해ForceCommand internal-sftp와AllowTcpForwarding no를 넣으세요. 그리고 그 조건에서의 유효 설정을/root/harden/match.txt로 저장하세요. 파일에forcecommand internal-sftp가 보여야 합니다. /root/.ssh/authorized_keys에서id_labhub키가 들어 있는 줄 맨 앞에restrict,pty,from="127.0.0.0/8"옵션을 붙이세요. (pty 를 다시 켜야 셸 접속이 유지됩니다.)- sshd 를 다시 띄운 뒤 두 가지를 확인하세요.
- 키 접속이 여전히 성공한다 → 결과를
/root/harden/still-works.txt로 저장 - 비밀번호 인증만 요청하면 거부된다 → 그 오류 출력을
/root/harden/password-denied.txt로 저장
- 키 접속이 여전히 성공한다 → 결과를
/root/harden/checklist.txt를 다음 5줄로 만드세요. 값은sshd -T출력 기준입니다.passwordauthentication=no/kbdinteractiveauthentication=no/pubkeyauthentication=yes/maxauthtries=3/logingracetime=30
참고
sshd -t는 문법 검사,sshd -T는 유효 설정 출력,sshd -T -C user=backup,host=x,addr=127.0.0.1은 조건부 유효 설정입니다.- sshd 재기동은
pkill -x sshd; sleep 1; /usr/sbin/sshd형태로 합니다. 실습 환경의 sshd 는 2222 포트 설정을 이미 갖고 있습니다. - 비밀번호 인증 거부 확인은
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no -p 2222 root@127.0.0.1 true로 합니다. 실패 메시지를 저장하세요. - 흔한 실수 1: 6번에서
restrict만 붙이고pty를 다시 켜지 않아 셸 접속이 깨지는 경우. - 흔한 실수 2: 7번에서 sshd 를 죽이기만 하고 다시 띄우지 않아 이후 단계가 전부 실패하는 경우.
현재 유효 설정 기록
/root/harden 디렉터리를 만들고, 현재 유효 설정 전체를 /root/harden/baseline.txt 로 저장하세요.
sshd 에는 최종 적용 값을 전부 출력하는 확장 테스트 모드가 있습니다. 문법 검사와는 다른 옵션입니다.
drop-in 설정 작성
/etc/ssh/sshd_config.d/90-labhub.conf 를 만들고 다음 값을 넣으세요.
PasswordAuthentication no, KbdInteractiveAuthentication no, PubkeyAuthentication yes, MaxAuthTries 3, LoginGraceTime 30, X11Forwarding no, PermitEmptyPasswords no, LogLevel VERBOSE
sshd_config.d 아래 .conf 파일로 만듭니다. 파일 이름 앞 숫자가 읽는 순서를 정합니다.
문법 검사 통과
문법 검사를 실행해 통과하는 것을 확인하고, 종료 코드를 /root/harden/syntax.txt 에 rc=0 형식으로 적으세요.
문법만 검사하는 옵션은 성공하면 아무것도 출력하지 않습니다. 종료 코드로 판단하세요.
적용 값 확인
최종 적용 값 중 passwordauthentication, kbdinteractiveauthentication, maxauthtries, logingracetime 네 줄만 골라 /root/harden/effective.txt 로 저장하세요.
확장 테스트 모드의 출력은 전부 소문자 키입니다. 필요한 네 개만 골라내세요.
Match 블록 조건부 적용
같은 파일 끝에 Match User backup 블록을 추가해 ForceCommand internal-sftp 와 AllowTcpForwarding no 를 넣으세요. 그리고 그 조건에서의 유효 설정을 /root/harden/match.txt 로 저장하세요. 파일에 forcecommand internal-sftp 가 보여야 합니다.
확장 테스트 모드에 접속 조건을 주는 옵션이 있습니다. user, host, addr 세 값을 쉼표로 이어 씁니다.
authorized_keys 옵션 강화
/root/.ssh/authorized_keys 에서 id_labhub 키가 들어 있는 줄 맨 앞에 restrict,pty,from="127.0.0.0/8" 옵션을 붙이세요. (pty 를 다시 켜야 셸 접속이 유지됩니다.)
출발지를 제한하는 옵션과 전체 기능을 끄는 옵션을 함께 씁니다. 루프백 대역을 허용해야 접속이 유지됩니다.
먼저 확인할 것: 이 단계는 ~/.ssh/id_labhub 키를 손봅니다. 그 키는 앞 실습(SSH 키 인증)에서 만든 것인데, 실습마다 새 상자가 뜨므로 여기에는 없습니다. ls ~/.ssh 로 확인하고 없으면 먼저 만드세요.
ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_labhub
cat ~/.ssh/id_labhub.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
재기동 후 실제 검증
sshd 를 다시 띄운 뒤 두 가지를 확인하세요.
- 키 접속이 여전히 성공한다 → 결과를
/root/harden/still-works.txt로 저장 - 비밀번호 인증만 요청하면 거부된다 → 그 오류 출력을
/root/harden/password-denied.txt로 저장
설정을 반영하려면 sshd 를 다시 띄워야 합니다. 이 환경에는 systemctl 이 없으니 프로세스를 직접 다루세요.
하드닝 체크리스트
/root/harden/checklist.txt 를 다음 5줄로 만드세요. 값은 sshd -T 출력 기준입니다.
passwordauthentication=no / kbdinteractiveauthentication=no / pubkeyauthentication=yes / maxauthtries=3 / logingracetime=30
값은 sshd -T 출력에서 그대로 가져오면 됩니다. 소문자로 통일하세요.