본문 바로가기

IT

[Ubuntu/Linux] ssh 공개키의 모든 것

비공개 서버에 접속하기 위해서는 인증절차를 거쳐야 합니다.

그리고 그 인증절차 중에 가장 널리 사용된 것이 ID/비번 입력방식이지요.

하지만, 네트워크 상에서 ID/비번이 그대로 노출되는 문제가 발생하였습니다.

21세기를 살아가는 우리는 좀 더 발전된 방식으로 인증절차를 밟아야겠지요?


오늘은 비교적 최근(?)인 1995년에 나온 ssh를 살펴보고자 합니다.

ssh는 핀란드 헬싱키 대학 연구원이 1995년 7월에 첫 릴리스를 하였습니다.

지금이 2015년 7월이니 태어난지 만 20년이나 되었네요.

대학 네트워크에서 ID/암호를 낚아채는 일이 발생하자 작정하고 ssh 개발을 시작했다고 합니다.



ssh는 public key 암호방식을 사용합니다.

public key 암호방식은 비대칭 암호방식으로 public key와 private key를 사용하지요.

암호를 걸 때와 풀 때 사용하는 키가 다르기 때문에 비대칭 암호방식이라고 불립니다.

public key는 평문을 암호화한다면, private key는 암호문을 다시 평문으로 변환하지요.


여기서 사용된 수학공식을 이산수학에서 배웠던 기억이 나는데요,

지금은 전혀 기억나지 않아서 설명해드릴 수가 없습니다.

이에 대해 격렬히 궁금하신 분은 구글링을 해보세요.

언제나 모르는 것에 대한 학구적 욕망이 일어나지만 오늘은 그냥 생략하겠습니다.

(사실 언제나 생략하고 있습니다...)


public key는 네트워크 환경에서 전달하게 됩니다.

온갖 위험이 도사리고 있는 네트워크를 통해 전달되지요.


이에 반해, private key는 private한 영역에서만 간직합니다.

private key가 외부에 노출될 위험이 없기에 public키를 맘놓고 노출시키는 겁니다.

두 키가 온전히 있어야 암호/복호가 가능하니까요.

하나는 공개해버리는 것이지요.


예를 들어 집에 있는 데스크탑 클라이언트를 통해 회사 서버에 접속한다고 가정해보죠.

클라이언트에서 private & public 키를 생성해둡니다.

그리고 public 키를 서버에 보냅니다.

이 때 해커그룹이 public 키를 낚아챕니다.


서버에 public 키를 보낸 이후 클라이언트는 private 키로 암호화하여 서버에 정보를 전달합니다.

해커그룹이 아까 낚아챈 public 키를 사용하여 클라이언트가 보낸 명령을 복호화합니다.

클라이언트가 보낸 정보를 강탈하는데 성공하죠.

어떤 정보를 클라이언트가 서버에 요청했는지 알게 됩니다.


서버에서 클라이언트의 요청을 받아 정보를 가공하여 클라이언트에 전달합니다.

클라이언트는 private 키로 서버단의 정보를 해석합니다.

역시 해커그룹이 서버쪽에서 보낸 정보를 낚아챕니다.

하지만, private 키가 없기 때문에 복호화할 수 없습니다.

해커그룹은 클라이언트가 보낸 정보를 해석할 수는 있지만,

서버가 보낸 정보를 해석할 수는 없습니다.


보통은 서버에 주요 정보가 있고,

클라이언트는 서버에 정보를 요청하므로 보안을 유지해야할 정보를 지킬 수 있습니다.

그렇다면, 어떻게 private / public 키를 만들면 될까요?


우선 key가 놓이는 장소를 살펴봅니다.

$ ls ~/.ssh
known_hosts

위의 위치에 키가 놓이게 됩니다.

제 환경에는 private / public 키가 없기 때문에 known_hosts 파일만 있습니다.

아예 디렉토리가 없는 경우도 있겠지요.


자, 그럼 이제 private / public 키를 만들어볼까요?

ssh-keygen 명령어를 사용하면 됩니다.

usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-f input_keyfile] [-g]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
                  [-O option] [-V validity_interval] [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...


위처럼 다양한 옵션이 있지만,

아무 옵션을 주지 않아도 private / public 키를 만들 수 있습니다.

하지만 여기서는 몇 가지 옵션을 주어 key를 생성해보겠습니다.


$ ssh-keygen -t rsa -b 4096 -C "storycompiler@hanmail.net"

-t 옵션으로 암호화 타입을 정할 수 있습니다.

ssh는 public 키 방식으로 동작할 수 있는 다수의 암호화 알고리즘을 차용하고 있습니다.

여기서는 흔히 사용하는 rsa 타입을 설정하도록 하겠습니다.


-b로 생성할 키의 비트수를 지정할 수 있습니다.

각 암호화 타입마다 필요한 비트수가 다릅니다.

rsa 타입은 최소 768 비트가 필요하고 default로 2048 비트로 설정되어 있습니다.

하지만 여기서는 그 보다 두 배 큰 4096으로 더 견고한 키를 만들겠습니다.


-C는 주석을 입력할 수 있습니다.

주석은 서버에 따라 특별한 용도로 사용할 수 있습니다.

git hub에서는 사용자의 로그인 ID를 적어놓으라고 가이드합니다.


$ ssh-keygen -t rsa -b 4096 -C "storycompiler@hanmail.net"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/storycompiler/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/storycompiler/.ssh/id_rsa.
Your public key has been saved in /home/storycompiler/.ssh/id_rsa.pub.

위처럼 입력하면 키가 생성이 됩니다.

private 키는 디폴트로 ~/.ssh/id_rsa 파일에 저장합니다.

public 키는 같은 위치에 id_rsa.pub이란 이름으로 생성이 됩니다.

passphrase는 키에 접근할 때마다 추가로 암호를 요구하게 할 수 있습니다.


데스크탑을 여러명에서 공유한다면,

반드시 passphrase를 설정하여야 합니다.

하지만, 키를 사용할 때마다 암호를 입력하는게 상당히 번거롭습니다.

그래서 새로운 기능이 추가되었습니다.

로그인할 때, passphrase를 설정하는 것이지요.

이 부분은 차후에 ssh-agent와 함께 다시 설명하겠습니다.


여기서는 passphrase를 설정하지 않겠습니다.

암호를 입력하라는 항목에서 그냥 엔터를 칩니다.

재입력하라는 항목에서도 그냥 엔터를 칩니다.

자, 이제 끝났습니다.

~/.ssh에 키가 생성되었습니다.

이제 ssh public키를 서버에 공유하면 됩니다.

끝_


* References

https://en.wikipedia.org/wiki/Secure_Shell

https://en.wikipedia.org/wiki/Public-key_cryptography

https://help.github.com/articles/generating-ssh-keys/