이 글에서 소개하는 단순한 3단계만 거치면, ssh-keygen과 ssh-copy-id 명령어를 사용해 원격 리눅스 서버에 비밀번호를 입력하지 않고도 로그인할 수 있습니다.
핵심 명령어 미리 보기
ssh-keygen은 공개 키와 개인 키 쌍을 생성하는 도구입니다. ssh-copy-id는 로컬 호스트의 공개 키를 원격 호스트의 authorized_keys 파일에 복사하며, 원격 호스트의 홈 디렉터리, ~/.ssh, ~/.ssh/authorized_keys에 적절한 권한까지 자동으로 설정해 줍니다.
또한 이 글에서는 ssh-copy-id 사용 시 겪을 수 있는 세 가지 불편함과, ssh-agent와 함께 ssh-copy-id를 활용하는 방법까지 함께 다룹니다.
1단계: 로컬 호스트에서 ssh-keygen으로 공개 키·개인 키 생성
jsmith@local-host$ [참고: 현재 로컬 호스트에 있습니다] jsmith@local-host$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/jsmith/.ssh/id_rsa): [Enter 키 입력] Enter passphrase (empty for no passphrase): [Enter 키 입력] Enter same passphrase again: [Enter 키 입력] Your identification has been saved in /home/jsmith/.ssh/id_rsa. Your public key has been saved in /home/jsmith/.ssh/id_rsa.pub. The key fingerprint is: 33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9 jsmith@local-host
키 저장 경로는 기본값(/home/jsmith/.ssh/id_rsa)을 그대로 사용하고, 패스프레이즈는 비워 두면(Enter 키만 누르면) 비밀번호 없는 로그인이 가능합니다. 보안을 한층 강화하고 싶다면 패스프레이즈를 설정한 뒤 아래에서 소개하는 ssh-agent 연동 방식을 함께 사용하는 것을 권장합니다.
2단계: ssh-copy-id로 공개 키를 원격 호스트에 복사
jsmith@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host jsmith@remote-host's password: Now try logging into the machine, with "ssh 'remote-host'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
참고: ssh-copy-id는 원격 호스트의 .ssh/authorized_keys 파일에 키를 덮어쓰지 않고 추가(append)합니다. 따라서 이미 등록된 다른 키들은 그대로 유지됩니다.
3단계: 비밀번호 없이 원격 호스트에 로그인
jsmith@local-host$ ssh remote-host Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2 [참고: 비밀번호를 묻지 않습니다] jsmith@remote-host$ [참고: 이제 원격 호스트에 접속한 상태입니다]
대부분의 환경에서는 위의 3단계만으로 비밀번호 없는 SSH 로그인 설정이 완료됩니다. 앞서 openSSH에서 openSSH로 비밀번호 없이 SSH와 SCP를 수행하는 방법을 상세히 소개한 바 있으니 함께 참고하시기 바랍니다. SSH2를 사용하는 환경이라면 SSH2에서 SSH2로, OpenSSH에서 SSH2로, SSH2에서 OpenSSH로 비밀번호 없이 SSH와 SCP를 구성하는 방법도 이전 글에서 다루었으니 확인해 보세요.
ssh-add/ssh-agent와 함께 ssh-copy-id 사용하기
-i 옵션에 값을 전달하지 않았는데 ~/.ssh/identity.pub 파일이 존재하지 않으면, ssh-copy-id는 다음과 같은 오류 메시지를 출력합니다.
jsmith@local-host$ ssh-copy-id -i remote-host /usr/bin/ssh-copy-id: ERROR: No identities found
ssh-add로 ssh-agent에 키를 미리 등록해 두었다면, -i 옵션 없이 ssh-copy-id를 실행했을 때 ssh-agent에 저장된 키를 가져와 원격 호스트에 복사합니다. 즉, ssh-add -L 명령이 출력하는 키가 원격 호스트로 전송됩니다.
jsmith@local-host$ ssh-agent $SHELL jsmith@local-host$ ssh-add -L The agent has no identities. jsmith@local-host$ ssh-add Identity added: /home/jsmith/.ssh/id_rsa (/home/jsmith/.ssh/id_rsa) jsmith@local-host$ ssh-add -L ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsJIEILxftj8aSxMa3d8t6JvM79DyBV aHrtPhTYpq7kIEMUNzApnyxsHpH1tQ/Ow== /home/jsmith/.ssh/id_rsa jsmith@local-host$ ssh-copy-id -i remote-host jsmith@remote-host's password: Now try logging into the machine, with "ssh 'remote-host'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [참고: ssh-add -L이 출력한 키가 추가되었습니다]
ssh-copy-id의 세 가지 아쉬운 점
ssh-copy-id는 매우 편리한 도구이지만, 실무에서 다음과 같은 사소한 불편함이 있습니다.
- 기본 공개 키 파일 고정: ssh-copy-id는
-i옵션에 값이 전달되지 않으면~/.ssh/identity.pub를 기본 공개 키 파일로 사용합니다. id_dsa.pub, id_rsa.pub, identity.pub 중 하나라도 존재하면 그것을 기본 키로 삼고, 여러 개가 모두 존재할 때만 identity.pub를 우선한다면 더 합리적일 것입니다. - 'The agent has no identities' 오류 무시: ssh-agent가 실행 중인데
ssh-add -L결과가 'The agent has no identities'(에이전트에 등록된 키 없음)일 때, ssh-copy-id는 오류를 걸러내지 않고 이 메시지 문자열을 그대로 원격 호스트의 authorized_keys에 추가해 버립니다. - authorized_keys 중복 항목: ssh-copy-id가 원격 호스트의 authorized_keys에서 중복 항목을 검증해 주면 좋겠습니다. 로컬 호스트에서 ssh-copy-id를 여러 번 실행하면 중복 검사 없이 동일한 키가 계속 추가됩니다. 다행히 중복 항목이 있어도 동작에는 문제가 없지만, 관리 관점에서는 깔끔한 authorized_keys 파일을 유지하고 싶어집니다.
이 글이 도움이 되셨다면 북마크하거나 주변에 공유해 주세요.