원격 서버에 SSH로 접속할 때마다 비밀번호 입력하는게 너무 귀찮다. ssh는 GSSAPI, host-based등등 다양한 인증방식을 지원하지만 나는 주로 비밀번호(대칭키 암호화) 또는 공개키 방식 인증을 사용한다.
(ssh의 인증방식에 대해 궁금하다면 man ssh
의 AUTHENTICATION
Section을 확인)
요즘은 비밀번호 치는 것도 번거로워서 내가 갖고 있는 모든 서버의 ssh접속 인증을 모두 공개키 방식으로 바꾸는 중이다. 이때 쓸수 있는게 ssh-copy-id
명령인데 오늘은 이 친구에 대해 알아볼 예정이다.
그 전에 공개키 암호 방식에 대해 간략하게 알아보자.
공개키 암호 방식
개인키(Private Key)와 공개키(Public Key)를 이용한 인증방식이다. 비밀번호와 달리 암호화와 복호화에 이용하는 키가 다른 방식이다.
공개키 방식은 출제하는 측과 문제를 푸는 측이 존재한다. 출제자는 개인키 없이는 풀기 어려운 수학적 문제를 공개키를 기반으로 만든다. 문제를 푸는 측은 개인키가 없다면 이 문제를 풀기 어려우며 개인키를 가진 사람만이 문제를 풀어 인증을 할 수 있다. 심지어 공개키를 갖고 있는 사람이 문제를 만들어도 개인키를 갖고 있지 않다면 문제를 풀 수 없다. 이런 특징 때문에 비대칭 암호라고 부르기도 한다.
이런 특징을 이용해 ssh에서도 공개키 인증 방식을 이용한다.
ssh에서 공개키 암호
인증 과정은 총 4단계이다.
준비 -> 접속 요청 및 정보 교환 -> 디지털 서명 생성 (클라이언트) -> 서명 검증 (서버)
준비
준비 과정에서는 client가 ssh-keygen
명령어로 개인키와 공개키를 만든다. 이때 -t
옵션으로 사용하고 싶은 key의 type을 지정할 수 있다.
그리고 client는 접속하려는 원격 서버에 자신의 공개키를 미리 복사해서 .ssh/authorized_keys
파일에 등록해 둔다.
이때 사용할 수 있는게
ssh-copy-id
이다.
접속 요청 및 정보 교환
- 클라이언트가 서버에 SSH접속 요청
- 서버와 사용자는 암호화 통신을 시작, 이번 통신에만 사용될 고유한 세션 ID(Session ID) 와 같은 임시 정보를 공유한다. 이 세션 ID는 매번 접속할 때마다 바뀌는 고유한 값이다.
디지털 서명 생성 (클라이언트)
- 클라이언트는 방금 서버와 공유한 세션 ID를 기반으로 메시지를 만든다.
- 그리고 개인키를 활용해 메시지에 암호화를 진행한다. 이렇게 생성된 결과물이 디지털 서명이다.
서명 검증 (서버)
- 클라이언트는 생성한 디지털 서명을 서버로 전송한다.
- 서버는
authrized_keys
에 있는 공개키를 가져온다. - 이 공개키를 이용히 클라이언트가 보낸 디지털 서명이 유효한지 검증한다.검증 과정은 다음 두 가지를 수학적으로 확인한다.
- 이 서명이 정말 해당 공개키와 쌍을 이루는 개인키로 만들어졌는가?
- 서명이 처음 공유했던 세션 ID와 일치하는가?
ssh-copy-id
위에서 잠깐 언급했듯이 준비 과정에서 사용되는 것이 ssh-copy-id
이다. 공개키 인증 방식에서 원격지 서버의 ~/.ssh/authrized_keys
에 클라이언트가 생성한 공개키(public key)를 추가하는 과정이 필요한데 이 번거로운 작업을 간편하게 수행하는 것이 이 커맨드이다.
기본 사용 방식은 아래와 같다.
ssh-copy-id [사용자명]@[서버주소]
또는 ~/.ssh/config
에 설정된 Host
의 이름을 사용해도 된다.
ssh-copy-id [호스트명]
아래는 ssh-copy-id
로 원격 proxmox
호스트에게 public key설정을 하는 이미지이다.
-i
옵션으로 특정 공개키 파일을 지정하여 복사할 수 있다.
실행 과정
- 명령 실행:
ssh-key-2025-07-31.key.pub
라는 특정 공개키 파일을proxmox
서버로 복사하라는 명령을 실행. - 원격 서버 접속: 공개키를 서버에 등록하기 위해, 해당 서버(
root@192.168.1.107
)에 접속한다. - 자동 복사 및 설정: 사용자가 비밀번호를 정확히 입력하면,
ssh-copy-id
가 알아서 공개키를 원격 서버의authorized_keys
파일에 추가하고 필요한 권한 설정까지 완료. - 성공: “1개의 키가 추가되었다”는 메시지와 함께 모든 과정이 성공적으로 끝났음을 알려준다. 이제부터는 비밀번호 없이 지정된 키를 사용해 바로 접속할 수 있다.
만약 ssh-copy-id
가 없다면 수동으로 넣어주어야 한다 .
cat ~/.ssh/id_rsa.pub | ssh [사용자명]@[서버주소] \
"mkdir -p ~/.ssh && \
touch ~/.ssh/authorized_keys && \
chmod 700 ~/.ssh && \
chmod 600 ~/.ssh/authorized_keys && \
cat >> ~/.ssh/authorized_keys"
이런 방식으로.
ssh-copy-id
는 이 과정을 자동으로 처리해주는 커맨드이다. 구현부를 살펴보면 쉘 스크립트로 이루어져 있다.
MACOS기준 416줄 정도 되는 쉘스크립트이니 궁금하면 which ssh-copy-id
로 나온 경로의 파일을 열어서 확인해보길 바란다.
서버측 sshd 데몬 설정
ssh-copy-id
를 사용해 공개키를 성공적으로 복사했더라도, 서버의 SSH 설정이 공개키 인증을 허용하지 않으면 접속할 수 없다.
원격 서버의 /etc/ssh/sshd_config
파일을 열어서 아래 항목을 보고 변경하자.
# 공개키 인증을 허용하는지 여부 (필수)
PubkeyAuthentication yes
# 허용된 공개키 목록 파일의 위치
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
# Systemd를 사용하는 대부분의 최신 리눅스 (Ubuntu, CentOS 7+ 등)
sudo systemctl restart sshd
# 또는
sudo systemctl restart ssh
# init.d를 사용하는 구형 시스템
sudo service ssh restart
정리
원격 서버에 접속할 때마다 비밀번호를 입력하는 번거로움은 공개키 인증 방식으로 해결할 수 있다. 하지만 서버에 공개키를 등록하는 과정은 생각보다 귀찮은 수작업을 요구한다. mkdir
, touch
, chmod
, cat
같은 여러 명령어를 실수 없이 조합해야 하기 때문이다.
ssh-copy-id
는 바로 이런 실수하기 쉬운 과정을 단 한 줄의 명령어로 끝내주는 고마운 친구다. 이 명령어 하나면 원격 서버에 접속해 authorized_keys
파일을 찾아 권한을 맞추고 키를 복사하는 모든 과정이 자동으로 처리된다.
이제 ssh-copy-id
로 귀찮음을 덜어보자.