LabHub
배우기 러닝패스 코스

SSH and File Transfer

Hardening sshd

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

drop-in 설정 파일로 sshd 를 하드닝하고, sshd -tsshd -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_configPort 는 무시됩니다. 설정을 고치고 재시작해도 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.txtrc=0 형식으로 적으세요.
  4. 최종 적용 값 중 passwordauthentication, kbdinteractiveauthentication, maxauthtries, logingracetime 네 줄만 골라 /root/harden/effective.txt 로 저장하세요.
  5. 같은 파일 끝에 Match User backup 블록을 추가해 ForceCommand internal-sftpAllowTcpForwarding 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

참고

현재 유효 설정 기록

/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.txtrc=0 형식으로 적으세요.

문법만 검사하는 옵션은 성공하면 아무것도 출력하지 않습니다. 종료 코드로 판단하세요.

적용 값 확인

최종 적용 값 중 passwordauthentication, kbdinteractiveauthentication, maxauthtries, logingracetime 네 줄만 골라 /root/harden/effective.txt 로 저장하세요.

확장 테스트 모드의 출력은 전부 소문자 키입니다. 필요한 네 개만 골라내세요.

Match 블록 조건부 적용

같은 파일 끝에 Match User backup 블록을 추가해 ForceCommand internal-sftpAllowTcpForwarding 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 를 다시 띄운 뒤 두 가지를 확인하세요.

설정을 반영하려면 sshd 를 다시 띄워야 합니다. 이 환경에는 systemctl 이 없으니 프로세스를 직접 다루세요.

하드닝 체크리스트

/root/harden/checklist.txt 를 다음 5줄로 만드세요. 값은 sshd -T 출력 기준입니다. passwordauthentication=no / kbdinteractiveauthentication=no / pubkeyauthentication=yes / maxauthtries=3 / logingracetime=30

값은 sshd -T 출력에서 그대로 가져오면 됩니다. 소문자로 통일하세요.