안수찬의 개발이야기

authorized_keys와 SSH Config를 이용한 비밀번호 없이 SSH 로그인하기

Introduction

안수찬 @dobestan

안수찬 @dobestan

소프트웨어 생태계에 기여할 수 있는 실용주의 프로그래머가 되고자 합니다. 나는 안수찬이다. 그러므로 나는 할 수 있다.


authorized_keys와 SSH Config를 이용한 비밀번호 없이 SSH 로그인하기

Posted by 안수찬 @dobestan on .
Featured

authorized_keys와 SSH Config를 이용한 비밀번호 없이 SSH 로그인하기

Posted by 안수찬 @dobestan on .

다양한 개발 프로젝트를 진행하면서 문제가 발생했다. 각각의 프로젝트에 대해서 각각의 서버를 사용해야 한다. AWS EC2 같은 경우에는 *.pem 확장자를 가진 개인키를 이용해서 접속한다. 일반 서버의 경우에는 비밀번호를 기억해서 접속한다. 서버가 많지 않을 경우에는 큰 상관이 없지만, 20개가 넘어가면서 관리할 방안을 마련할 필요가 있었다. ~/.ssh/config/ 파일과 authorized_keys를 이용해서 이 문제를 해결했다. 그 과정과 내가 ssh private keys 를 보관하는 방법을 공유하고자 한다.

Generate Private Key

1. Check for SSH Keys

일단 먼저 생성되어 있는 SSH Keys가 있는지 확인해보자 :

user$ ls -al ~/.ssh  
# Lists the files in your .ssh directory, if they exist

위의 명령어에 대한 결과를 확인해보자. 만약 id_rsa.pubid~dsa.pub라는 키파일이 있다면 아래의 SSH Keys 생성하기 단계는 건너뛰면 된다.

2. Generate a new SSH Keys

user$ ssh-keygen -t rsa -C "YOUR_EMAIL@DOMAIN.COM"  
# Creates a new ssh key, using the provided email as a label

Generating public/private rsa key pair.  
# Enter file in which to save the key (/Users/YOUR_NAME/.ssh/id_rsa): [Press enter]

다음으로, passphrase를 설정해주자. 설정해주지 않아도 상관없지만, 만약 Private Key가 유출되었을 경우 의도하지 않은 사용자가 접속하지 못하게 하려면 최소한의 passphrase를 설정해주는게 좋다. ( 다른 서비스와 연동해서 사용하는 경우 passphrase를 지원하지 않는 경우가 있으므로 주의하자. )

Enter passphrase (empty for no passphrase): [Type a passphrase]  
Enter same passphrase again: [Type passphrase again]  

위의 과정까지 완료했다면 우리는 Private Key ( id_rsa )와 Public Key( id_rsa.pub )가 생성되었음을 확인할 수 있다.

Your identification has been saved in /Users/YOUR_NAME/.ssh/id_rsa.  
Your public key has been saved in /Users/YOUR_NAME/.ssh/id_rsa.pub.  
The key fingerprint is: 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db YOUR_EMAIL@DOMAIN.com  

3. Add new key to ssh-agent

# start the ssh-agent in the background
user$ eval "$(ssh-agent -s)"  
Agent pid 59566  
user$ ssh-add ~/.ssh/id_rsa  

SSH Login without Password

1. Understand SSH Login

사실 비밀번호 없이 ssh 접속을 하는 방법은 굉장히 간단하다. 클라이언트 ( SSH 요청을 보내는 컴퓨터 )는 SSH Private Key 값을 전송하고, 서버 ( SSH 요청을 받는 컴퓨터 )는 서버 컴퓨터의 ~/.ssh/authorized_keys에 저장되어 있는 SSH Public Key 값들은 확인한다. 이 때, 클라이언트의 Private Key와 서버에 저장된 공개키가 일치한다면 서버에 정상적으로 접속된다.

2. Manual Copy

즉, 생성한 공개키, id_rsa.pub를 서버 컴퓨터의 ~/.ssh/로 복사하고 그 값을 authorized_keys에 추가하자.

server-user$ cat id_rsa.pub >> authorized_keys  

서버의 authorized_keys에 클라이언트 공개키가 추가되었으므로 별도의 인증절차 ( 비밀번호 묻기 )가 없이 SSH 접속이 성공적으로 수행된다.

client-user$ ssh USERNAME@DOMAIN.COM  

3. using ssh-copy-id

사실 2번의 직접 수동으로 복사하는 과정이 약간 귀찮다. 이 작업을 대신해주는 ssh-copy-id를 사용하면 굉장히 쉽게 해결된다.

client-user$ ssh-copy-id USERNAME@DOMAIN.COM  
USERNAME@DOMAIN.COM's password: [Type password]  

How I manage my ~/.ssh ?

1. using ~/.ssh/config

사실 수 많은 서버에 대한 username을 기억하는 것도 굉장히 귀찮은 일이다. 이걸 ~/.ssh/config 내에 저장해두고 쉽게 접속하는 방법을 공유한다. ~/.ssh/config에 아래의 내용을 추가해보자.

# 위에서 설정한 방식대로 사용하는 경우
Host DOMAIN.COM  
  HostName DOMAIN.COM
  Port YOUR_PORT # default = 22
  User USERNAME
# 직접 SSH Private Key를 명시하는 경우 ( EC2 같은 경우 )
Host DOMAIN.COM  
  HostName DOMAIN.COM
  Port YOUR_PORT # default = 22
  User USERNAME
  IdentityFile YOUR_PRIVATE_KEY_PATH

위와 같이 ~/.ssh/config를 설정하면 다음과 같이 쉽게 비밀번호 없이 서버에 접속할 수 있다.

user$ ssh DOMAIN.COM  

2. using Github as Private Key Repo

나는 이 Private Key 값들을 저장해두기 위해서 Github을 적극적으로 사용한다. 물론 passphrase가 걸려 있어 조금은 안전하기는 하지만 완전히 Public Repo를 이용해서 저장해두기에는 약간 위험할 것 같다는 생각이 들어서 Private Repo를 사용해서 관리하고 있다.

지금까지 간단하게 SSH Private Key를 생성하고, ssh-copy-id를 이용하여 서버 컴퓨터의 authorized_keys에 쉽게 등록하고, ~/.ssh/config를 이용해서 "비밀번호 없이 SSH 로그인하기"에 대해서 살펴보았습니다. 혹시나 이 방법보다 SSH 키 값들을 관리하기 더 편하고 쉬운 방법이 있다면 공유해주세요. 감사합니다.

References

안수찬 @dobestan

안수찬 @dobestan

https://dobest.io/

소프트웨어 생태계에 기여할 수 있는 실용주의 프로그래머가 되고자 합니다. 나는 안수찬이다. 그러므로 나는 할 수 있다.

View Comments...