SSH Keys 인증 (EdDSA 사용)

RSA 를 처음 들은게 벌써 10년이 훌쩍 넘었다. 당시엔 그 정도면 훌륭한 암호체계라고 했는데, 이젠 또 다른 걸 권장하고들 있나보다. 그게 바로 EdDSA. RSA 와 비교했을 때 어떤 차이가 있는 지는 문외한인 내가 알 수는 없다. 사실, 저 차이를 정말 ‘암호학’에 입각하여 해석할 수 있는 이가 얼마나 되려나.
Archlinux 문서에는 이렇게 쓰여있다.

Archlinux Wiki:

Its main strengths are its speed, its constant-time run time (and resistance against side-channel attacks), and its lack of nebulous hard-coded constants.

위 글에서 내가 ‘이해’할 수 있는 부분은, ‘speed’ 정도. 나머지는 모르겠다. ^^
확실하게 눈에 보이는 부분은, rsa 비해 EdDSA 가 파일크기가 작다는 점이다. 개인키/공개키 모두 크기가 작다. 공개키의 경우 400 Bytes 대 100 Bytes.

간단한 결론은 이렇다.
시스템에서 지원을 한다면 EdDSA(Ed25519) 를, 그렇지 않다면 RSA 를 사용하라.


정리 전에, 예전에 쓴 글들과, EdDSA 를 알려준 글의 자취를 먼저 남긴다.


그럼, 이제 본격 정리 시작. 이 작업은 rsa 로 키를 만든 상태에서도, 아예 처음으로 ed25519 키를 만드는 상황에서도 동일하다.

시작 하기 전에, 한가지 확실히 해야할 게 있다.
접속할 ‘서버’에 저장할 키는 공개키일까 개인키일까?
다른 이들에겐 이게 헷갈리지 않는 문제일지는 모르겠지만, 내겐 자주 혼동되는 문제다. 공개키/개인키 생성을 자주 한다면 모르겠으나, 사실 한번 만들어놓으면 굳이 바꿀 일이 없기에, 가끔은 기본을 잊게 된다.

당연히, 개인키는 나만 갖고 있어야 한다. 그러기에 개인키이며, 공개키는 말 그대로 공개하기 위한 목적으로 만들어졌고, 따라서 여기저기 뿌리고 다녀도 된다. 그러라고 만든게 공개키이다.
따라서, 서버에 저장되는, 정확하게 말해서 서버의 내 계정 홈디렉토리의 .ssh/authorized_keys 에 삽입되는 키는 공개키(id_rsa.pub, id_ed25519.pub)이지, ‘개인키'(id_rsa, id_ed25519)가 아니다.

엄밀하게 말해서, 내 PC(또는 서버에 접속할 내 모든 기기)의 ~/.ssh 디렉토리에는 개인키만 있어도 된다. 보통, 여기에 개인키와 공개키가 같이 들어있는데, 공개키가  일단 서버에 보내졌다면, 굳이 이 디렉토리에 있을 필요는 없다.

서버의 내 계정 홈디렉토리에는 authorized_keys 만 있으면 되고, 개인키/공개키는 굳이 있을 필요가 없다. 서버에 접속한 후, 그 서버에서 다른 서버로 다시 접속할 일이 있다면 얘기는 달라지지만.

헷갈리는 내용은 여기까지.


ssh 키쌍 생성

먼저, ssh 키(쌍/Pair)를 내 PC 에서 만들어야 한다. 이렇게 한 기기에서 키쌍을 만들었으면, 이후엔 다시 키를 만들 필요없이, 이 키를 가지고 여러 기기에서 사용할 수 있다.
예를 들어, 데스크탑에서 키를 만들고, 이 키(개인키)를 복사하여 랩탑에서도, 안드로이드 기기에서도, iOS 기기에서도, MacOS 에서도, FreeBSD 에서도, Windows 에서도 모두 쓸 수 있다.
공인인증서를 한번 만들고, 복사하여 여러 기기에서 쓸 수 있는 것과 같은 이치다.

rsa 로 만드는 방법은 전에 했으므로, 이번엔 EdDSA 로만 해보기로 한다.
이 키는, ssh-keygen 이 실행되는 어떤 환경에서 만들어도 된다. 우분투에서든, Fedora 에서든, Archlinux 에서든, MacOS 에서든, FreeBSD 에서든. Windows 에서도 키를 생성하는 프로그램이 있다면(당연히 있겠지?) 그걸 써도 된다.

$ ssh-keygen -t ed25519 -C "우분투 서버용 ssh 키"

따옴표에 들어갈 문구는 맘대로 택하면 된다.
이 작업을 마치면, ~/.ssh 디렉토리에 id_ed25519 와 id_ed25519.pub 파일이 생성된다. 각각 개인키와 공개키이다.

키쌍을 생성했으므로, 이제 ‘공개’키를 ‘서버’에 저장해야 한다. 서버에 저장한다는 의미는, 서버의 내 계정의 .ssh 디렉토리에 있는 authorized_keys 파일에 내 공개키를 추가한다는 뜻이 된다. .ssh 디렉토리에 id_ed25519.pub 파일을 복사한다는 의미가 아니다.

이를 위해 특별히 고안된 프로그램이 있으니, 그게 바로 ssh-copy-id 이다. (이전 글에서는 GUI 프로그램도 사용했었지만, 그냥 CLI 가 간편하다.)

ssh-copy-id -i $HOME/.ssh/id_ed25519.pub user@xxx.xxx.xxx.xxx

형식은 위와 같다. -i 를 붙이지 않으면 기본값/default_ID_file 이 선택된다. 만약 pub 파일이 2개 이상이라면, 확실히 하기 위해 파일명을 명시해야 한다.
이 작업을 마치면, 해당 파일이 서버의 ~/.ssh/authorized_keys 에 추가되고, 앞으로는 이 키쌍으로 서버에 로그인할 수 있게 된다.


이제 다음과 같이 접속을 하면, 서버에 공개키/개인키 암호화를 사용해서 로그인할 수 있게 된다.

ssh user@xxx.xxx.xxx.xxx

Passphrase 를 물어오는데, 이걸 더 이상 물어보게 하지 않으려면, KDE 환경과 MacOS 환경이라면 다음 글을 참고한다. (Gnome 계열에서는 한번만 입력하면 그 다음부터는 묻지 않았던 듯 한데..)


추가 #1: ~/.ssh/config 파일로 ssh 설정.

이 파일을 편집하여, 좀 더 편리하게 ssh 접속을 사용할 수 있다.
자세한 설명은 생략. 예제로서 대신한다.

ForwardX11 yes
PreferredAuthentications publickey
#PreferredAuthentications password
IdentityFile ~/.ssh/id_ed25519

Host userv
    HostName 192.168.0.55
    Port 3333
    User iamuser

Host dserv
    HostName 192.168.0.60
    Port 3434
    User jason
    IdentityFile ~/.ssh/id_rsa

설정 항목은, 위와 같이 전역(들여쓰기 하지 않은 영역)으로 해줄 수도 있고, 각각 항목 별로 해줄 수도 있다.
예를 들어, IdentityFile 의 경우 dserv 호스트에만 id_rsa 를 사용하고, 다른 서버들에는 모두 id_ed25519 를 사용하게 설정할 수 있다.
접속은 이런 식으로 한다.

$ ssh userv
$ ssh dserv

추가 #2: 서버에서 Password 로그인을 불가능하게 설정.

서버로 접속 한 후, /etc/ssh/sshd_config 을 열고, 아래와 같이 수정한다.

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

추가 #3: ssh 로그인 시 motd 가능하게 설정.

이 부분이 좀 애매하긴 한데..
보안을 위해선 UsePAM 을 No 로 하는 편이 좋다고 한다. 그러나, 어차피 위에서 PasswordAuthentication 을 No 로 했으므로, 별 관계없다고도 보여진다.

이유는 알 수 없지만, UsePAM 을 No 로 하면, motd(message of the day)가 표시되지 않는다. 이에 대한 설명은 찾았지만, 이해는 못했다.

아무튼, motd 를 위해선 다음과 같이 설정해줘야 한다.

UsePAM yes
PrintMotd no

이렇게 끝?
이론만으로보면, 여기서 끝이다. 문제가 있을 거리가 없다.


authorized_keys 수동 편집

ssh-copy-id 를 사용할 수 없는 상황이라든가, 아무튼 애매한 상황일 때가 있다.
이럴 땐 공개키를 직접 authorized_keys 파일에 추가해주면 된다.
vim 등으로 authorized_keys 파일을 열고, 공개키 파일 텍스트를 그대로 붙여넣는다. 공개키간 개행문자는 없다. 이전에 사용 중인 공개키가 있다면 그냥 바로 붙여넣어도 된다.

같은 이치로, 만약 더 이상 사용하지 않는 공개기카 있다면, 직접 삭제해도 된다. 공개키를 지워주는 프로그램(스크립트)는 없는 듯 하다.

Android, iOS

이 OS 들에서도 위에서 생성한 개인키를 사용할 수 있다. 어떤 방식을 써서든 개인키를 이 기기로 옮긴다. 파일 째로 옮겨도 되고, 파일 내용을 붙여넣기로 해도 된다.
안드로이드는 키를 옮기는게 별로 어렵지 않다. KDE Connect 로 기기에 전달해도 되고, 정 안되면 기기를 직접 케이블로 연결해도 된다.

iOS 기기는.. 이게 까다롭다. 이메일에 첨부하거나, 구글 킵등을 이용할 수도 있지만, ‘인터넷’을 통해야 한다는게 어쩐지 좀 꺼려진다.
이를 위해서 Termius 는 iTunes 를 요구한다. iTunes 를 사용해서 키를 전달할 수 있다. (이래 저래 iOS 는 귀찮은게 많다.)

Android 의 JuiceSSH 프로그램에서는 2018년 10월 현재 EdDSA 를 지원하지 않는다.
양쪽 모두를 지원하는 Termius 에서는 EdDSA 를 사용할 수 있다.

2 Comments

안녕하세요. 글 남겨주셔서 고맙습니다.