ssh key 인증 - ssh-keygen, ssh-copy-id, ssh-add

원격 접속을 하기 위해 ssh 프로토콜을 사용해서, 특정 호스트에 사용자 계정으로 접속이 가능하다.

ssh 접속 시 사용자 계정의 비밀번호를 요구하는데, 매번 비밀번호를 입력해 접속하는 것이 귀찮다면 ssh key 라는 걸 사용할 수 있다.


ssh-keygen

ssh-keygen 명령어는 ssh key 를 생성한다.

옵션으로는 암호화 방식이나 경로 지정, passphrase 설정여부 등등을 넣어줄 수 있는데, 사실 옵션 없이 그냥 실행시켜도 터미널에서 확인하는 과정이 있기 때문에 상관 없다.

bconfiden2@bconfiden2:~$ ssh-keygen
Generating public/private rsa key pair.
# private key 가 저장될 경로와 이름 설정, 같은 위치에 public key 도 생성, 디폴트는 ~/.ssh/id_rsa
Enter file in which to save the key (/home/bconfiden2/.ssh/id_rsa): /home/bconfiden2/.ssh/test
# key 에 대한 비밀번호 입력, 입력하지 않고 엔터를 눌러 비밀번호를 없게 할 수 있음
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
# 비밀키와 공개키 저장된 경로 확인
Your identification has been saved in /home/bconfiden2/.ssh/test
Your public key has been saved in /home/bconfiden2/.ssh/test.pub
The key fingerprint is:
SHA256:gYEEukE26t36vFcMpn1mnfJxrmKp4zxIiaOz+uLYfGE bconfiden2@bconfiden2
The key's randomart image is:
+---[RSA 3072]----+
| +.o...          |
|+.. .  o         |
|+     . .        |
|.o. .  o .       |
|.. ...= S . .    |
|   oE+ . B + .   |
|  .oo.. = + +    |
|o=  +..+ + . .   |
|==*. +++= ...    |
+----[SHA256]-----+


id_rsa.pub 복사

ssh-keygen을 하면, 생성할 때 입력한 경로에 해당 파일이 만들어지고, 비밀키와 매칭되는 공개키가 name.pub의 이름으로 같이 생성된 것을 볼 수 있다.

디폴트 값으로는 ~/.ssh/id_rsa~/.ssh/id_rsa.pub이 된다.

이렇게 생성된 퍼블릭 키를 상대 호스트에 전달하게 되면, ssh 접속을 할 때 비밀번호를 입력받기 전에 등록된 키를 검사하기 때문에 이 단계에서 통신이 성립되어 비밀번호를 입력하지 않을 수 있다.

아래는 다른 호스트가 이 컴퓨터에 등록해놓은 자신의 퍼블릭 키이다.

이렇게 등록되어있기 때문에, 해당 호스트의 ssh-client 프로그램이 이 컴퓨터에 ssh 접속을 요청할 때, 이 컴퓨터의 ssh-server 프로그램은 authorized_keys를 먼저 확인해서 매칭되는 키가 있을 경우 비밀번호를 요청하지 않고 허가해주는 것이다.

bconfiden2@bconfiden2:~$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+8ODFHaJHWu7rUWxnZ/j7olZfl8mdcQO2zNj1kzWwrPbR8Nb+F/lDufTO2DmaMQj3RtOrHqIFhWrguT65n8V/482abdcxi8XUi8raZc6OV/Gbdr8uqPsRe3HYkhXrlvTbmJujXSn+IAQeKkYfmarIdjDf6BqdxN2UsgpGbhcAno4KIOH5/Gi+kVq63m3d0MXveIaSO9rvzDM7Obs1JYyGX/a7PAiRHMA3Cz2prquQAg7su089/Th5XHdEoErL0JBo3L2B551M5TjElyA4sgqTNbw1GAIhRqvxoW/R0s1B49SnK/BxydnjMAVDDjMMceTJMU07M5jizp6pd4U6Wiez KSH@bconfiden2-15Z980-GA5BK

마찬가지로 내 컴퓨터에서 생성해놓았던 퍼블릭 키(id_rsa.pub)를 자주 접속하는 서버의 authorized_keys에 등록해놓으면, 해당 서버로 ssh 접속할 때 비밀번호를 매번 입력할 필요도 없다.


먼저 해당 서버에 scp 를 통해 퍼블릭 키를 복사한다.

scp ~/.ssh/id_rsa.pub bconfiden2@gitserver -p 2222

ssh 접속 후에, 복사해놓은 퍼블릭 키를 cat 으로 연 뒤, >>을 통해 해당 서버의 authorized_keys의 끝에 추가한다. 꼭 cat » 을 사용하지 않아도 되고, vi 등의 편집기를 통해 파일에 직접 붙여넣어도 된다.

ssh bconfiden2@gitserver -p 2222
cat id_rsa.pub >> ~/.ssh/authorized_keys

여러 대의 서버가 있을 경우에도, 각 서버의 authorized_keys에 나의 퍼블릭 키를 똑같이 등록해놓으면, 비밀번호를 하나하나 외우고 있을 필요도 없어진다.

다만 나의 private key는 외부에 공개되지 않게 보안을 철저하게 지켜야 한다.


ssh-copy-id

퍼블릭 키를 직접 복사해서 서버의 authorized_keys를 열어 붙여넣는 과정들이 번거롭다면, ssh-copy-id 명령어 하나로 이를 한번에 수행할 수 있다.

ssh-copy-id [-i key.pub] username@host의 형식으로 사용할 수 있다.

만약 서버의 ssh-server가 22번 포트가 아닌 다른 포트를 공개해놨다면, -p 포트번호 옵션을 추가해야하며, -i 옵션으로 특정한 키를 지정하지 않았을 경우에는 디폴트로 id_rsa.pub 을 복사한다.

bconfiden2@bconfiden2:~$ ssh-copy-id bconfiden2@gitserver -p 2222
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
bconfiden2@gitserver's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '2222' 'bconfiden2@gitserver'"
and check to make sure that only the key(s) you wanted were added.

마찬가지로 gitserver에 들어가서 authorized_keys를 보면, 방금 추가했던 퍼블릭 키가 등록되어있는 것을 볼 수 있다.


ssh-add

ssh-keygen 과정에서 key에 대한 비밀번호를 입력해놨을 수도 있다.

키에 대한 비밀번호가 등록이 되어있다면, ssh key를 사용해서 통신을 한다고 할지라도 키에 대한 비밀번호를 입력해야하기 때문에 결국 똑같이 번거롭게 된다.

애초에 키를 생성할 때 비밀번호를 생략할 수도 있겠지만, ssh-add를 통해 미리 시스템에 개인키의 비밀번호를 암호화해서 등록해두고, 개인키를 사용할 때 비밀번호를 입력하지 않게 할 수 있다.

ssh-add privatekey처럼 프라이빗 키의 경로를 입력해주면 해당 키의 비밀번호를 입력하라는 창이 나올텐데, 이 때 비밀번호를 등록해둔다면 이후에 해당 키를 사용해 ssh 접속 등을 할 때 개인키에 대한 비밀번호를 요구하지 않는다.


이렇게 ssh key 를 생성해서 서버에 등록해두고, 개인키에 대한 비밀번호가 있다면 ssh-add 를 통해 등록해두면 인증에 대한 번거로운 과정이 사라진다.

만약 포트번호, 유저이름, 도메인, 터널링 등 각종 옵션들이 많이 필요할 경우에는 ssh config 까지 설정하여 ssh 접속을 아주 편하게 만들 수 있다.