Study/Study

SSH-keygen을 이용한 인증키 생성의 방법과 원리

TTOII 2022. 4. 6. 11:06
728x90

SSH가 뭐야 ?

https://soft.plusblog.co.kr/36

SSH 키 생성을 위해 사용하는 ssh-keygen 명령은 비밀키를 먼저 만들고 그 값과 passphase를 활용해 공개키를 만든다.
따라서 같은 페어가 아닌 키들은 동시에 사용될 수 없다.

ssh-keygen은 SSH의 대표적 구현체인 OpenSSH 라이브러리에 포함되어 있다.
만들어진 키 페어는 시스템 자동 로그인, SSO(Single Sign-On) 또는 서버 호스트 사설 인증 등에 사용할 수 있다.

ssh-keygen이 어떤 알고리즘과 방식으로 한쌍의 키를 만드는지 보자

% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/brandon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/brandon/.ssh/id_rsa.
Your public key has been saved in /Users/brandon/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hjbXN0Bbx6t+RWKf/u6fFrupg3gyk3BsXKqKLfHAV1g brandon@mac1
The key's randomart image is:
+---[RSA 2048]----+
|          . ...  |
|       E . o ..  |
|      o   o    . |
|     . o . o  + .|
|  .   = S + oo +.|
|   + o = * ... oo|
|    =   = o.. ..o|
|   .o. . * o...+o|
|   ..o.   =  o+*O|
+----[SHA256]-----+

① ssh-keygen 명령을 별도의 매개 변수 없이 실행한다.
② 비밀키가 저장될 위치를 묻는다. 별도의 파일 위치 없이 Enter를 하면 기본값은 사용자의 /.ssh/id_rsa에 생성된다.
별도의 알고리즘 지정이 없으므로 RSA 알고리즘을 사용하겠다는 의미도 포함되어 있다.
(SSH는 RSA 외에도 DSA, ECDSA, ED25519 등의 알고리즘을 지원한다.)
키 생성 시의 알고리즘은 -t(type) 옵션을 사용하여 알고리즘과 키의 크기(bit)를 지정할 수 있다.

ssh-keygen -t rsa -b 4096
ssh-keygen -t dsa
ssh-keygen -t ecdsa -b 521
ssh-keygen -t ed25519



③ passphrase를 묻는다.
여기에 입력한 값은 개인키를 암호화하는데 사용된다. 아무것도 입력하지 않으면 개인키를 암호화하지 않으며 자동 로그인에서는 아무것도 입력하지 않아야 한다. (개인키를 암호화하지 않으면 보안문제가 발생할 수 있다. 개인키 파일을 가지고 있는 사람이라면 누구든 바로 접속이 가능하기 때문이다.)
passphrase는 키를 암호화할 때 salt처럼 사용하는 값이다.
비밀키가 노출되는 만약의 사태를 대비하려면 충실한 passphrase를 사용하는 것이 암호화 강도를 높일 수 있는 방법이다.

④ /.ssh/id_rsa.pub 파일도 생성된다.
이 파일은 공개키(public key)다.
비밀키(id_rsa)가 먼저 만들어지고 passphrase를 조합하여 public 키가 만들어졌다.
따라서 공개키와 비밀키는 한 쌍(pair)으로 만들어졌고 같이 작동한다는 것이 이제 이해될 것이다.

id_rsa private key, 절대로 타인에게 노출되면 안된다.
id_rsa.pub public key, 접속하려는 리모트 머신의 authorized_keys에 입력한다.
authorized_keys 리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장한다.

.ssh 디렉토리는 매우 중요한 보안 정보가 담긴 디렉토리다.
특히 id_rsa 파일은 개인키 파일로 다른 유저에게 노출되어서는 안되는 파일이다.
비밀번호가 노출되는 것과 같은 효과이므로 퍼미션 관리를 확실하게 해줘야한다.
일반적으로 .ssh 디렉터리는 700, id_rsa 파일은 600, id_rsa.pub 파일과 기타 공개되어도 되는 파일들은 644로 설정해놓는다.
아래의 명령을 순차적으로 실행한다.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts


⑤ Key Fingerprint 정보는 아래의 조합이다.
SHA256:hjbXN0Bbx6t+RWKf/u6fFrupg3gyk3BsXKqKLfHAV1g brandon@mac1
SHA256 → Base64 인코딩 된 SHA256 해시 알고리즘을 사용하는 것을 의미한다.
hjbXN0Bbx6t+RWKf/u6fFrupg3gyk3BsXKqKLfHAV1g → 키의 Fingerprint 정보
brandon@mac1 → 키의 위치

⑥ randomart 이미지 → Fingerprint의 시각화(visualize)
~/.ssh 폴더를 보면, 비밀키와 공개키가 생성되어 있음을 확인할 수 있다.

% ls -al ~/.ssh
total 40
drwx------   7 brandon  600   224 Dec 14 10:32 .
drwxr-xr-x+ 92 brandon  600  2944 Dec 10 12:36 ..
-rw-r--r--   1 root    600   157 Jul 11  2018 config
-rw-------   1 brandon  600  1823 Dec 14 10:32 id_rsa
-rw-r--r--   1 brandon  600   398 Dec 14 10:32 id_rsa.pub
-rw-r--r--   1 brandon  600   558 Nov 12 11:53 known_hosts
-rw-r--r--   1 brandon  600   352 Nov 20  2018 out

이제 두 개의 키의 내용을 각각 확인해보자

% cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA9MC5YSbfk0iY5ZJQzJoK2E3bhV30i8D2TJMsgIuRd68gm0pRrbEs
H6QWcsN/IyRVgRQr0QJFzoEG6kNjQM4e+PWr413cYruQIqO+t+rMRJziAxB8m088Qu2Ezm
eb5xZBNLFQzESlWufEi3ACWXSbO7ld/WfkstuAA/WjTj8ImmNsw9lKMsEhnuF2Hl6mnCaa
..........
TWks9MqwpAvstduxUeXw5N+lQZyHTiNXzxigqJuv0AFcZd3SUAAACBAPgV/E3K7fBwxeOT
qAXmwgjjWdUFR0iipl3A9i2PFBsfyrQRKUeXEAbkVBpUZZMQlSH/Gk+9RqAOzKftG5ULOt
EnNDkgSq0isD1IX02Neb/w+6aD6vHY4RVPCs8Iw/6AHn4RrIoqEGHewUbE7HbQOEkY+Y8A
IabwMHcOjPG0CPTrAAAAEHNha2FuZ0BzZWwtbXBuYWIBAg==
-----END OPENSSH PRIVATE KEY-----

% cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0wLlhJt+....+qCjPc1B8GUT3 brandon@mac1

이제 공개키, 비밀키 한 쌍이 생성되었고 사용할 수 있는 준비가 되었다.



참고

728x90