把密钥认证立起来
한국어 원문으로 표시합니다.
목표
SSH 키를 만들어 권한을 맞추고, authorized_keys 에 등록해 실제로 접속합니다. 그리고 command= 제약이 붙은 키가 정말 그 명령만 실행하는지 확인합니다.
왜 중요한가
공개키 인증 실패의 대부분은 암호학이 아니라 파일 권한 문제입니다. ~/.ssh 가 group-writable 이면 sshd 는 키를 조용히 거부하고 비밀번호를 묻습니다 — 다른 사용자가 authorized_keys 에 자기 키를 넣을 수 있기 때문입니다. 즉 권한이 곧 인증 정책입니다. 그리고 command= 제약은 배포 자동화에서 사실상 필수입니다. CI 서버의 키가 유출돼도 그 키로는 지정된 명령 하나밖에 못 돌게 만들 수 있습니다.
이 실습 환경에는 127.0.0.1:2222 에 진짜 sshd 가 떠 있습니다. 같은 파드 안이지만 SSH 관점에서는 완전한 두 번째 서버입니다.
단계
/root/.ssh/id_labhub에 ed25519 키 쌍을 패스프레이즈 없이 만드세요./root/.ssh는 700,/root/.ssh/id_labhub는 600,/root/.ssh/id_labhub.pub는 644 로 권한을 맞추세요.- 방금 만든 공개키를
/root/.ssh/authorized_keys에 추가하세요. 파일 권한은 600 이어야 합니다. ssh-keyscan으로127.0.0.1의 2222 포트 호스트 키를 가져와/root/.ssh/known_hosts에 등록하세요.- 그 키로
root@127.0.0.1:2222에 접속해 원격에서hostname을 실행하고, 결과를/root/ssh/connect.txt로 저장하세요. /root/.ssh/config에Host lab2블록을 만드세요.HostName 127.0.0.1,Port 2222,User root,IdentityFile /root/.ssh/id_labhub,IdentitiesOnly yes다섯 줄이 들어가야 합니다. 그리고ssh lab2 hostname이 성공하는 것을 확인해/root/ssh/alias.txt로 저장하세요./root/.ssh/id_restricted에 두 번째 ed25519 키를 만들고, 그 공개키를authorized_keys에 추가하되 줄 맨 앞에restrict,command="/bin/hostname"옵션을 붙이세요. 그 키로ssh -i /root/.ssh/id_restricted -p 2222 root@127.0.0.1 id를 실행하면id가 아니라hostname결과가 나와야 합니다. 그 출력을/root/ssh/restricted.txt로 저장하세요./root/ssh/keys.txt를 만드세요.authorized_keys에 등록된 모든 키의 지문 목록을 담아야 하고, 최소 2줄이어야 합니다.
참고
ssh-keygen -t ed25519 -N '' -f <경로>로 패스프레이즈 없는 키를 만듭니다.ssh-keyscan -p 2222 127.0.0.1 >> /root/.ssh/known_hosts형태로 호스트 키를 등록합니다.ssh-keygen -lf /root/.ssh/authorized_keys로 파일 안의 모든 키 지문을 볼 수 있습니다.- 흔한 실수 1: 3번에서
>로 덮어써서 기존 키가 사라지는 경우. 반드시>>를 쓰세요. - 흔한 실수 2: 7번에서 옵션과 키 사이에 쉼표를 넣는 경우. 옵션 목록과 키 타입 사이는 공백입니다.
키 쌍 만들기
/root/.ssh/id_labhub 에 ed25519 키 쌍을 패스프레이즈 없이 만드세요.
ssh-keygen 의 -t 로 종류를, -f 로 출력 경로를, -N 으로 패스프레이즈를 지정합니다. 자동 채점을 위해 패스프레이즈는 비워 두세요.
권한 맞추기
/root/.ssh 는 700, /root/.ssh/id_labhub 는 600, /root/.ssh/id_labhub.pub 는 644 로 권한을 맞추세요.
디렉터리와 파일의 권장 권한이 다릅니다. 공개키만 다른 사람이 읽어도 괜찮습니다.
공개키 등록
방금 만든 공개키를 /root/.ssh/authorized_keys 에 추가하세요. 파일 권한은 600 이어야 합니다.
authorized_keys 는 공개키를 한 줄씩 담은 텍스트 파일입니다. 기존 줄을 지우지 말고 덧붙이세요.
호스트 키 등록
ssh-keyscan 으로 127.0.0.1 의 2222 포트 호스트 키를 가져와 /root/.ssh/known_hosts 에 등록하세요.
ssh-keyscan 은 포트를 지정하는 옵션이 있고, 비표준 포트는 known_hosts 에 대괄호 표기로 들어갑니다.
키로 접속하기
그 키로 root@127.0.0.1:2222 에 접속해 원격에서 hostname 을 실행하고, 결과를 /root/ssh/connect.txt 로 저장하세요.
-i 로 키를, -p 로 포트를 지정합니다. 원격에서 실행할 명령을 인자로 붙이면 접속 후 바로 그 명령이 돕니다.
클라이언트 설정으로 별칭 만들기
/root/.ssh/config 에 Host lab2 블록을 만드세요. HostName 127.0.0.1, Port 2222, User root, IdentityFile /root/.ssh/id_labhub, IdentitiesOnly yes 다섯 줄이 들어가야 합니다. 그리고 ssh lab2 hostname 이 성공하는 것을 확인해 /root/ssh/alias.txt 로 저장하세요.
Host 블록 안에 HostName, Port, User, IdentityFile, IdentitiesOnly 를 넣습니다. 그러면 옵션 없이 별칭만으로 접속됩니다.
명령 제한 키 만들기
/root/.ssh/id_restricted 에 두 번째 ed25519 키를 만들고, 그 공개키를 authorized_keys 에 추가하되 줄 맨 앞에 restrict,command="/bin/hostname" 옵션을 붙이세요. 그 키로 ssh -i /root/.ssh/id_restricted -p 2222 root@127.0.0.1 id 를 실행하면 id 가 아니라 hostname 결과가 나와야 합니다. 그 출력을 /root/ssh/restricted.txt 로 저장하세요.
authorized_keys 줄 맨 앞에 옵션을 쉼표로 나열합니다. restrict 로 전부 끄고 command 로 하나만 허용하세요.
등록된 키 감사
/root/ssh/keys.txt 를 만드세요. authorized_keys 에 등록된 모든 키의 지문 목록을 담아야 하고, 최소 2줄이어야 합니다.
ssh-keygen 에는 파일 안의 키 지문을 나열하는 옵션이 있습니다. 주석까지 함께 나옵니다.