Xshell에서 OpenSSH CA(Certificate Authority) 사용하기
이 문서의 위치: https://docs.google.com/document/d/1XuzFoewcI-qq8VtJJcvqcUYghnUEIPN39-zLfC4Px5U/edit#
허두진 2019.05.30.
개요
(빠른 안내를 위해서는 이 문서 마지막의 '단계별 간단 안내'를 참고하세요)
공개 키 인증을 위해서는 사용자 키에 대한 공개 키를 접속하고자 하는 서버와 사용자 모두에 복사해 놓아야 합니다. 이러한 방식은 비효율적일 뿐만 아니라 관리자의 부담이 될 수 있습니다. 인증 기관(Certificate Authority, CA)의 인증을 통한 공개 키를 사용한다면 이런 문제가 해결될 수 있습니다. OpenSSH는 간단한 인증서의 생성 그리고 이와 관련된 CA 인프라를 제공합니다. Xshell은 OpenSSH의 CA를 통해서 원격 유닉스/리눅스 서버에 접속할 수 있습니다.
다음은 Xshell에서 OpenSSH의 CA 기능을 사용하기 위한 안내입니다.
인증된 키를 사용할 경우 SSH 서버의 호스트 키가 변경되어도 해당 호스트 키가 서명되었다면 SSH 클라이언트에서는 동일한 서버의 호스트 키로 인식됩니다. 정책적으로 호스트 키를 자주 변경해야 하는 경우 유용합니다. 또한 서버 관리자가 개인 키에 대한 유효 기간을 설정하여 관리할 수 있고 각각의 사용자들이 사용하는 개인 키를 즉각적으로 무효화할 수 있습니다. 사용자는 인증 서버에서 인증된 공개 키만으로 해당 서버에 접속할 수 있습니다.
호스트 키 인증
개념도
서명용 키 생성①
- 인증서 생성 서버에서 다음 명령 실행합니다. 암호를 묻게 되면 입력합니다. 이후 키를 인증할 때 이 암호를
입력해야 합니다.
$ ssh-keygen -f server_ca
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in server_ca.
Your public key has been saved in server_ca.pub.
The key fingerprint is:
SHA256:wkoynUi5rXkMQXcNrpFmOWh+JbONIOCxeWv8WOxUbm4 root@uby
The key's randomart image is:
+---[RSA 2048]----+
|... . oo |
|o.++ = . |
|.+B.X o. |
| =oXo&o |
| B+X++oS |
| .X*.o. |
| o.+o E |
| . . |
| |
+----[SHA256]-----+
인증에 사용할 키로 rsa 형식의 server_ca 키를 생성하였습니다. rsa 형식이 아닌 다른 형식을 사용할 경우 -t 옵션을 사용하여 원하는 키 형식을 지정할 수 있습니다.
인증을 위한 키 쌍이 생성된 것을 확인합니다.
$ ls
server_ca server_ca.pub
호스트 키 서명
서명할 호스트 키가 인증 서버의 것이 아니라면 scp 명령 등을 사용하여 해당 서버의 호스트 키를 가져와야 합니다. SSH 서버의 호스트 키 읽기 권한은 root에게만 있습니다.
서명할 원격 장비의 호스트 키 가져오기②:
# scp root@host.netsarang.com:/etc/ssh/ssh_host_rsa_key.pub .
서명용 키를 사용하여 가져온 호스트 키를 서명합니다:
# ssh-keygen -s server_ca -I key_id -h -n host.netsarang.com -V +52w ssh_host_rsa_key.pub
Signed host key ssh_host_rsa_key-cert.pub: id "key_id" serial 0 for host.netsarang.com...옵션 설명.
- s: 서명용 키 이름.
- I: 로깅 목적으로 사용하기 위한 이름입니다.
- h: 서명하고자 하는 것이 호스트 키임을 나타냅니다.
- n: 서명용 호스트 키를 사용할 SSH 서버의 이름입니다. ,(comma)로 여러 개 나열할 수 있습니다. SSH 클라이언트는 이 이름 중 하나를 사용해야 합니다. 이 값을 생략하면 모든 SSH 서버에 사용할 수 있습니다.
- V: 인증서 유효 기간입니다. 예시는 52주(1년)입니다.
서명한 원격 서버의 호스트 키를 해당 원격 서버에 복사합니다③. 저장 위치를 sshd_config에서 지정해야 합니다:
# scp ssh_host_rsa_key-cert.pub root@host.netsarang.com:/etc/ssh/
위의 과정을 마친 후 복사해 온 호스트 키와 인증된 호스트 키는 필요 없으므로 삭제합니다:
# rm ssh_host_rsa_key.pub ssh_host_rsa_key-cert.pub
서명된 호스트 키를 위한 설정
SSH 서버에서 해야 하는 설정
SSH 서버에서 다음 파일 수정합니다. root의 권한이 필요합니다:
# vi /etc/ssh/sshd_config
HostCertificate 줄을 찾아(없으면 생성) 위에서 생성한 서명된 호스트 키 이름 입력합니다④. 인증된 호스트 키 파일은 인증 서버에서 인증 후 복사해 온 파일입니다.
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
저장 후 다음 명령으로 SSH 데몬 재시작합니다.
# service ssh restart
Xshell에서 해야 하는 설정
- 호스트 키 정보를 저장하는 곳에서 메모장 등을 이용하여 'ca_keys'라는 이름의 텍스트 파일을 생성합니다. 호스트 키에 대한 정보는 기본값으로 '문서 폴더 내의 \Netsarang Computer\6\SECSH\HostKeys\' 폴더에 저장됩니다
인증 서버에서 서명용 인증서 파일의 공개 키(server_ca.pub) 내용을 복사합니다.
# cat ~/server_ca.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3am
bJfKhX/G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcT
R5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc+8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oiv
ZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth위에서 복사한 내용을 ca_keys 파일에 추가합니다⑤. 이 때 이 공개 키 내용 앞에 @cert-authority 와 도메인 제한 내용을 다음과 같이 첨가한 후 저장합니다.
@cert-authority *.netsarang.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJ
fKhX/G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9
tsVPraaMOsKc+8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlh
Wb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth- 확인⑥.
호스트 키가 인증되지 않고 해당 호스트에 대한 정보가 없을 때:
호스트 키가 인증된 경우:
위 대화 창이 나타나지 않고 바로 사용자 인증 과정으로 진행합니다.
사용자 키 인증
개념도
서명용 키 생성①
인증 서버에서 사용자 키를 서명하기 위한 서명용 키 세트를 생성합니다:
# ssh-keygen -f users_ca |
암호를 묻게 되면 입력합니다. 이 키로 다른 키들을 서명할 때 사용하게 될 암호입니다. 인증에 사용할 키로 rsa 형식의 server_ca 키를 생성하였습니다. rsa 형식이 아닌 다른 형식을 사용할 경우 -t 옵션을 사용하여 원하는 키 형식을 지정할 수 있습니다.
SSH 서버 설정
인증 서버에서 위에서 생성한 서명용 인증서 세트 중 공개 키를 SSH 서버에 복사합니다②. SSH 서버의 root 권한이 필요합니다:
# scp users_ca.pub root@host.netsarang.com:/etc/ssh/
SSH 서버에서 SSH 서버의 데몬 설정 파일인 sshd_config 파일을 수정합니다. root 권한이 필요합니다:
# vi /etc/ssh/sshd_config
호스트 인증 시 적용하였던 HostCertificate 줄 아래에 다음 내용을 추가합니다③. users_ca.pub는 위 1.에서 복사해 온 파일입니다:
TrustedUserCAKeys /etc/ssh/users_ca.pub
SSH 서비스 데몬을 재구동합니다:
# service ssh restart
사용자 키 서명
- Xshell에서 서명에 사용할 키 쌍을 만듭니다④.
사용자 키 생성 과정 중에 해당 키의 공개 키를 따로 파일로 저장해 놓습니다. 해당 사용자 키의 공개 키는 Xshell의 사용자 키 관리자에서 언제든지 다시 확인할 수 있습니다. - 사용자 키 생성 과정에서 저장해 놓은 사용자 키의 공개 키를 서명 서버에 복사해 옵니다⑤. 대상은 개인 키(private key)인 id_rsa_2048 파일이 아닌 공개 키(Public key) 파일 id_rsa_2048.pub입니다:
users_ca 키 파일을 이용하여 서명합니다. 호스트 키 서명할 때와 비슷하지만 사용자 키에 대한 것이므로 -h 파라미터는 사용하지 않습니다. 아래 명령에서 -n 파라미터 뒤의 "username1,username2"는 ssh 서버의 사용자 이름들입니다. 서명된 키로 접속하고자 하는 사용자 이름을 나열할 수 있습니다. 이 값을 생략하면 호스트 키 서명 때와 달리 SSH 서버의 어떠한 사용자에게도 위의 사용자 키로 로그인할 수 없습니다. 반드시 지정해야 합니다.
$ ssh-keygen -s users_ca -I key_id -n username1,username2,... -V +52w id_rsa_2048.pub
Enter passphrase:
Signed user key id_rsa_2048-cert.pub: id "key_id" serial 0 for username1,username2,... valid from 2019-01-31T09:23:00 to 2020-01-30T09:24:30
$ ls id_rsa*
id_rsa_2048-cert.pub id_rsa_2048.pub암호 입력 화면에서 users_ca 를 생성할 때 입력한 암호를 입력합니다. id_rsa_2048-cert.pub라는 서명된 파일이 생성된 것을 확인할 수 있습니다.
- 서명된 id_rsa_2048-cert.pub 파일을 Xshell의 사용자 키 폴더에 복사합니다⑥:
확인
SSH 서버에 로그인하고자 하는 사용자에 공개 키 정보가 없는 것을 확인합니다:$ hostname
host
$ id
uid=1001(username1) gid=1001(username1) groups=1001(username1)
$ cat ~/.ssh/authorized_keys => 비어 있음.
$Xshell에서 SSH 서버로 SSH 접속을 시도합니다.
Xshell에서 사용자 키가 인증되지 않은 경우:
Xshell에서 사용자 키가 인증된 경우:
SSH 서버에 공개 키를 등록하지 않았어도 SSH 클라이언트의 개인 키인 id_rsa_2048의 키 암호를 입력하면 로그인이 가능합니다. 공개 키 서명 시 -n 옵션과 함께 나열한 username1,username2,...에 해당하는 사용자로 하는 접속은 공개 키를 등록하지 않아도 로그인이 가능합니다.
단계별 간단 안내
호스트 키 인증
CA 서버에서 서명용 키 생성①
$ ssh-keygen -f server_ca
CA 서버에 서명할 SSH 서버의 호스트 키 가져오기②:
# scp root@host.netsarang.com:/etc/ssh/ssh_host_rsa_key.pub .
CA 서버에서 서명용 키를 사용하여 가져온 호스트 키를 서명합니다:
# ssh-keygen -s server_ca -I key_id -h -n host.netsarang.com -V +52w ssh_host_rsa_key.pub
서명한 원격 서버의 호스트 키를 해당 원격 서버에 복사합니다③:
# scp ssh_host_rsa_key-cert.pub root@host.netsarang.com:/etc/ssh/
SSH 서버에서 해야 하는 설정
- sshd_config의 HostCertificate에 서명된 호스트 키
지정④:
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
저장 후 다음 명령으로 SSH 데몬 재시작합니다.
# service ssh restart
Xshell에서 해야 하는 설정
- 호스트 키 정보를 저장하는 곳에서 메모장 등을 이용하여 ca_keys 파일을 생성합니다.
인증 서버에서 서명용 인증서 파일의 공개 키(server_ca.pub) 내용을 복사하여 ca_keys에 붙여 넣습니다⑤. 이 때 이 공개 키 내용 앞에 @cert-authority 와 도메인 제한 내용을 다음과 같이 첨가한 후 저장합니다.
@cert-authority *.netsarang.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc+8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth
사용자 키 인증
서명용 키 생성①
# ssh-keygen -f users_ca
인증 서버에서 위에서 생성한 서명용 인증서 세트 중 공개 키를 SSH 서버에 복사합니다②.
# scp users_ca.pub root@host.netsarang.com:/etc/ssh/
SSH 서버에서 SSH 서버의 데몬 설정 파일인 sshd_config 파일의 TrustedUserCAKeys에 users_ca.pub를 지정합니다
TrustedUserCAKeys /etc/ssh/users_ca.pub
SSH 서비스 데몬을 재구동합니다:
# service ssh restart
사용자 키 서명
- Xshell에서 서명에 사용할 키를 생성합니다④.
- 위 사용자 키에 대한 공개 키를 생성하여 CA 서버 복사합니다⑤.
- users_ca 키 파일을 이용하여
서명합니다.
$ ssh-keygen -s users_ca -I key_id -n username1,username2,... -V +52w id_rsa_2048.pub
- 서명된 id_rsa_2048-cert.pub 파일을 id_rsa_2048.pub 파일이 있던 Xshell의 사용자 키 폴더에 복사합니다⑥:
- id_rsa_2048 키를 사용하여 공개 키 인증으로 SSH 서버에 접속을 시도합니다.