SSH 와 파일 전송 · SSH 설정 강화 · 실습
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번 포트는 그대로 둡니다. 설정을 잘못 써도 되돌아갈 길을 남겨 두기 위해서입니다 — 실제 서버에서도 같은 이유로 새 포트를 먼저 열어 확인한 뒤 옛 포트를 닫습니다.
단계
1. /root/harden 디렉터리를 만들고, 현재 유효 설정 전체를 /root/harden/baseline.txt 로 저장하세요.
2. /etc/ssh/sshd_config.d/90-labhub.conf 를 만들고 다음 값을 넣으세요.PasswordAuthentication no, KbdInteractiveAuthentication no, PubkeyAuthentication yes, MaxAuthTries 3, LoginGraceTime 30, X11Forwarding no, PermitEmptyPasswords no, LogLevel VERBOSE
3. 문법 검사를 실행해 통과하는 것을 확인하고, 종료 코드를 /root/harden/syntax.txt 에 rc=0 형식으로 적으세요.
4. 최종 적용 값 중 passwordauthentication, kbdinteractiveauthentication, maxauthtries, logingracetime 네 줄만 골라 /root/harden/effective.txt 로 저장하세요.
5. 같은 파일 끝에 Match User backup 블록을 추가해 ForceCommand internal-sftp 와 AllowTcpForwarding no 를 넣으세요. 그리고 그 조건에서의 유효 설정을 /root/harden/match.txt 로 저장하세요. 파일에 forcecommand internal-sftp 가 보여야 합니다.
6. /root/.ssh/authorized_keys 에서 id_labhub 키가 들어 있는 줄 맨 앞에 restrict,pty,from="127.0.0.0/8" 옵션을 붙이세요. (pty 를 다시 켜야 셸 접속이 유지됩니다.)
7. sshd 를 다시 띄운 뒤 두 가지를 확인하세요.
- 키 접속이 여전히 성공한다 → 결과를
/root/harden/still-works.txt로 저장 - 비밀번호 인증만 요청하면 거부된다 → 그 오류 출력을
/root/harden/password-denied.txt로 저장
8. /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 를 죽이기만 하고 다시 띄우지 않아 이후 단계가 전부 실패하는 경우.
단계 8개
- 현재 유효 설정 기록
- drop-in 설정 작성
- 문법 검사 통과
- 적용 값 확인
- Match 블록 조건부 적용
- authorized_keys 옵션 강화
- 재기동 후 실제 검증
- 하드닝 체크리스트