난이도 : 초급 Daniel Robbins, President/CEO, Gentoo Technologies, Inc
2001 년 7 월 01 일 "OpenSSH 키 관리" 시리즈를 통해 RSA와 DSA 인증(authentication)이 어떻게 작동하는 지를 배워보자. 그리고 패스워드가 없는(passwordless) 인증을 올바르게 설정하는 방법도 설명한다. 첫 번째 글에서는 RSA와 DSA 인증 프로토콜을 소개하고 네트워크상에서 작동시키는 방법을 설명한다.
대부분의 사람들은 telnet 과 rsh 커맨드를 대신하여 OpenSSH를 사용하고 있다. (참고자료)
OpenSSH의 매력적인 기능 중 하나는 RSA 와 DSA 인증 프로토콜 (한 쌍의 숫자 키 기반)을 사용하는 사용자들에게 권한을
준다는 점이다. RSA 와 DSA 인증은 패스워드 없이 원격 시스템에 연결을 할 수 있다는 것이다. 이것은 상당히 매력적이지만
OpenSSH의 신참 사용자는 빠르지만 조잡한 방식으로 RSA/DSA를 설정하곤 한다. 결국 패스워드 없이 로그인 하여 프로세스상에
큰 보안 허점을 열어놓게 되는 결과를 낳는다.
RSA/DSA 인증 이란?
SSH (특히 OpenSSH)은 경이로운 툴이다. telnet 또는 rsh 처럼 ssh 클라이언트는 원격 머신에 로그인 하는데
사용 된다. 이를 위해서 원격 머신에서는 sshd (ssh 서버 프로세스)가 실행되어야 한다. 하지만 telnet 과는 다르게
ssh 프로토콜은 매우 안전하다. 특별한 알고리즘을 사용하여 데이터 스트림 (stream)을 암호화한다. 데이터 스트림을 확실히
통합하고 안전한 방식으로 인증과정을 수행한다.
ssh 가 좋은 것임에는 분명하지만 ssh의 특정 컴포넌트가 무시되거나 또는 잘못 사용되고 있다. 이 컴포넌트는 OpenSSH의
RSA/DSA 키 인증 시스템이다. OpenSSH가 기본적으로 사용하고 있는 표준 보안 패스워드 인증 시스템의 대안이다.
OpenSSH의 RSA와 DSA 인증 프로토콜은 특별히 생성된 비밀 키(private key) 와 공개 키(public key)
라는 한 쌍의 암호 키로 이루어져 있다. 키 기반의 인증 시스템을 사용할 때의 장점은 일일이 패스워드를 입력하지 않고도 보안
연결이 가능하다는 것이다.
키 기반 인증 프로토콜이 비교적 안전하지만 사용자들이 보안에 대해 완전히 이해하지 못한 상태에서 사용할 때 많은 문제가 발생한다.
이 글에서는 모든 보안 위험을 피해가면서 RSA와 DSA 인증 프로토콜을 올바르게 사용하는 방법에 대해 살펴볼 것이다. 다음
글에서는 해독된 비밀 키를 캐시하기위해 ssh-agent를 사용하는 방법을 설명하겠다. 그리고 보안상의 위험요소도 배제되고 편리성도
겸비한 ssh-agent 프론트 엔드(front-end)인 keychain 을 소개할 것이다. OpenSSH의 향상된 인증에
대해 배우고 싶다면 인내심을 갖고 계속 읽어주길 바란다.
RSA/DSA 키 작동 방법
RSA/DSA 키 작동 방법을 설명하겠다. 일단, 가상 시나리오를 설정해 보자. RSA 인증을 사용하여 로컬 리눅스 워크스테이션
(이하 localbox)에서 remotebox (ISP 에 있는 머신)상의 원격 쉘을 열려고 한다. ssh 클라이언트를 사용하여
remotebox에 연결을 시도할 때 다음과 같은 프롬프트가 나타난다:
% ssh drobbins@remotebox
drobbins@remotebox's password:
|
ssh의 인증 처리 방식을 볼 수 있다. 프롬프트를 살펴보면 remotebox에 있는 drobbins 계정의 패스워드를 묻고
있다. 패스워드 입력하면 ssh 는 보안 패스워드 인증 프로토콜을 사용하여 remotebox 로 패스워드를 전송한다. 하지만
telnet 방식과는 다르게 패스워드는 암호와 되어있어서 도중에 차단 되지 않는다. remotebox 가 일단 패스워드 데이터베이스와
전송된 패스워드를 비교하여 인증이 성공적으로 처리되면 remotebox 쉘 프롬프트에 로그인 할 수 있게 되는 것이다. ssh의
인증 방식이 매우 안전한 반면 RSA 와 DSA 인증은 몇 가지 새로운 가능성을 열어놓고 있다고 볼 수 있다.
하지만 ssh 의 보안 패스워드 인증 과는 다르게 RSA 인증에는 몇 가지 초기 설정을 필요하다. 이러한 초기 설정 과정을
단 한번에 수행해야 한다. 그런 다음에는 localbox 와 remotebox 사이의 RSA 인증은 쉽게 이루어진다. RSA
인증을 설정하기 위해서는 우선 한 쌍의 키를 만들어야 한다. 그 하나가 비밀 키이고 다른 하나가 공개 키이다. 공개 키는 암호(encryption)용으로만
사용된다. 그리고 비밀 키는 인코딩 된 메시지의 해독에 사용된다. RSA (그리고 DSA) 인증 프로토콜은 어떤 기밀의 정보를
네트워크를 통해 전송하지 않고 키 쌍이 보안 인증을 수행하도록 하는 방식을 취한다.
RSA 또는 DSA 인증이 작용하기 위해서는 동시 설정 단계를 수행해야 한다. 공개 키를 remotebox 에 복사한다. 메시지를
암호화하는 데만 사용될 수 있기 때문에 잘못될 염려는 하지 않아도 된다. 공개 키가 remotebox 에 복사되어 remotebox의
sshd 가 위치를 지정할 수 있도록 특별한 파일 (~/.ssh/authorized_keys)에 저장되면 RSA 인증을 사용하여
remotebox 에 로그인 할 수 있는 것이다.
이번에도 단순히 localbox의 콘솔에서 ssh drobbins@remotebox 를 입력하면 된다. 하지만 이번에는 ssh
가 remotebox 의 sshd 로 하여금 이것이 RSA 인증 프로토콜을 사용하고 싶다는 것을 인식할 수 있도록 해 보자.
그 다음에 무슨 일이 일어날지는 다분히 흥미롭다. remotebox의 sshd 는 무작위 숫자를 만들어내고 먼저 복사했던 공개
키를 사용하여 이것을 암호화한다. 그리고 나서 암호화된 무작위 숫자를 다시 localbox 에서 실행중인 ssh 로 보낸다.
그런 다음 ssh 는 비밀 키를 사용하여 무작위 숫자를 해독한다. 그런 다음 이것을 다시 remotebox 로 보내면 "See,
I really do hold the matching private key; I was able to successfully
decrypt your message!" 라는 문장을 보게 될 것이다. 마지막으로, 맞는 비밀 키를 가지고 있으면 sshd는
로그인 할 수 있다라는 결론을 내린다. 사실은 일치하는 비밀 키가 remotebox 에 액세스 할 수 있도록 허용한 것이다.
두 가지 관찰
RSA 와 DSA 인증을 살펴보면 중요한 것이 발견된다. 첫째는 한 쌍의 키만 만들면 된다는 것이다. 그리고 나서 액세스 하고자
하는 원격 머신에 공개 키를 복사하면 그것은 비밀 키와 비교하여 기꺼이 권한을 줄 것이다. 다시 말해서 액세스 하고자 하는 모든
시스템 마다 키 쌍이 필요하지 않다는 것이다. 한 쌍으로 충분하다.
또 다른 하나는 비밀 키는 오용 되지 않는다는 것이다. 비밀 키는 원격 시스템에 액세스 할 수 있도록 해주는 것이기 때문에
우리의 비밀 키를 가지고 있는 누구나 같은 특권으로 허용 받는다. 낯선 사람이 우리집의 열쇠를 갖게 되길 원치 않는 것과 마찬가지로
우리의 비밀 키를 권한 받지 않은 사용으로부터 보호해야 한다. 컴퓨터 세계에서 이것이 의미하는 것은 어떤 누구도 우리의 비밀
키를 읽거나 복사할 수 없도록 해야 한다는 것을 뜻한다.
물론 ssh 개발자는 비밀 키의 중요성을 인식하고 있고 몇 가지의 안전 장치를 ssh 와 ssh-keygen 에 만들어서 비밀
키가 오용되지 않도록 한다. 우선 ssh 는 우리의 키를 다른 사람이 읽을 수 있도록 허용하는 파일 권한을 가졌다면 중대한 경고
메시지를 출력하도록 설정된다. 두 번째 ssh-keygen 을 사용하여 공개/비밀 키 쌍을 만들 때, ssh-keygen 은
우리에게 passphrase 를 입력하라고 요청할 것이다. 입력하면 비밀 키는 이 passphrase 를 사용하여 암호화 될
것이다. 그래서 도난 당하더라도 passphrase 를 모르는 다른 사람에게 이것은 소용이 없게 될 것이다. 이러한 지식을 바탕으로
ssh를 설정하여 RSA 와 DSA 인증 프로토콜을 사용 하는 방법을 살펴보자.
ssh-keygen 분석
RSA 인증 설정의 첫번째 단계는 공개/비밀 키 쌍을 만드는 것으로 시작한다. RSA 인증은 ssh 키 인증의 기본 형태이다.
그래서 RSA 는 OpenSSH 의 모든 버전에서 작동한다. 여러분이 가장 최신 버전을 설치하도록 권하고 싶다. 한 쌍의 RSA
키를 생성하는 방법을 보자:
% ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/drobbins/.ssh/identity): (hit enter)
Enter passphrase (empty for no passphrase): (enter a passphrase)
Enter same passphrase again: (enter it again)
Your identification has been saved in /home/drobbins/.ssh/identity.
Your public key has been saved in /home/drobbins/.ssh/identity.pub.
The key fingerprint is:
a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox
|
ssh-keygen 이 키의 디폴트 위치를 요청하면 엔터 키를 쳐서/home/drobbins/.ssh/identity 의 디폴트를
받아들인다. ssh-keygen은 위와 같은 경로로 비밀 키를 저장하고 공개 키는 그것의 바로 옆인 identity.pub 에
저장된다.
ssh-keygen이 passphrase를 입력하라는 부분을 주목하자. 프롬프트 되면 우리는 적당한 passphrase (7
이상의 숫자나 예견이 불가능한 문자)를 입력한다. 그런 다음 ssh-keygen 은 우리의 비밀 키 (~/.ssh/identity)를
이러한 passphrase를 사용하여 암호화 한다. 다른 사용자로 부터 우리의 비밀 키가 보안 되는 것이다.
빠른 타협
우리가 passphrase 를 지정하면 ssh-keygen은 우리의 비밀 키가 오용되지 않도록 보호한다. 하지만 이것은 또한
약간의 불편함도 유발한다. ssh를 사용하여 drobbins@remotebox 계정에 연결하려고 할 때마다, 이것이 우리의 비밀
키를 해독하여 RSA 인증이 필요할 때마다 ssh 는 passphrase를 입력하라고 프롬프트 한다. 그러면 remotebox
상의 drobbins 계정에 로그인 하기 위해 패스워드를 입력할 필요가 없다. 우리는 비밀 키를 해독하는데 필요한 passphrase를
입력하면 된다.일단 우리의 비밀 키가 해독되면 ssh 클라이언트는 나머지 부분을 살핀다. 원격 패스워드를 사용하는 방식과 RSA
passphrase는 완전히 다르다. 실제로 ssh에 "secret phrase"를 입력하도록 프롬프트 될 것이다.
# ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity': (enter passphrase)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
%
|
사람들은 패스워드를 입력하지 않으려고 암호화 되지 않은 비밀 키를 만들 것이다. 그러한 방식으로 그들은 단순히 ssh 커맨드를
입력 할 것이고 즉시 RSA(또는 DSA)를 통해 권한을 받아 로그인 하게 될 것이다.
# ssh drobbins@remotebox
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
%
|
이것은 편리한 방법이다. 하지만 보안에 미치는 영향을 완벽히 이해하지 않은 상태에서 이러한 접근 방식을 택하면 안된다. 암호화
되지 않은 비밀 키를 이용하여 누군가가 localbox 를 해킹 한다면 그들은 또한 remotebox와 공개 키로 설정된 다른
시스템으로 자동적으로 접근 할 것이다.
여러분이 무엇을 생각하고 있는지 알고 있다. 패스워드가 없는 권한은 상당히 위험스러운 것이기도 하지만 상당히 매력적이다.
전적으로 동감한다. 하지만 더 나은 방법이 있다! 비밀 키 보안 문제를 타협하지 않고도 패스워드 없는 인증의 유용함을 충분히
살리는 방법을 설명하겠다. 다음 글에서는 ssh-agent 를 능수능란하게 사용하는 방법도 설명하겠다. 지금 RSA 와 DSA
인증을 설정하여 ssh-agent를 사용해 보자. 다음은 단계별 지침이다.
RSA 키 쌍 만들기
RSA 인증을 설정하기 위해서 공개/비밀 키 쌍을 만들어야 한다. 다음과 같이 입력한다:
프롬프트가 되면 (일반적으로 공개 키에는 ~/.ssh/identity 와 ~/.ssh/identity.pub) 초기 키 위치를
받아들여서 ssh-keygen 에 보안 passphrase를 입력하라. ssh-keygen 이 완성되면 passphrase가
암호화 된 비밀 키는 물론 공개 키도 갖게 될 것이다.
RSA 공개 키 설치
다음에는 공개 RSA 키를 사용하는 sshd 를 실행하는 원격 시스템을 설정해야 한다. 일반적으로, 공개 키를 원격 시스템에
복사 하면 된다. 다음 예제를 보자:
% scp ~/.ssh/identity.pub drobbins@remotebox:
|
RSA 인증이 완전하게 설정된 것은 아니기 때문에 remotebox 에 패스워드를 입력하라고 프롬프트 될 것이다. 입력한 다음
remotebox 에 로그인 하여 공개 키를 ~/.ssh/suthorized_keys 파일에 첨부하도록 한다. 다음 예제를 보자:
% ssh drobbins@remotebox
drobbins@remotebox's password: (enter password)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org
Welcome to remotebox!
% cat identity.pub >> ~/.ssh/authorized_keys
% exit
|
RSA 인증이 설정되고, ssh를 이용하여 remotebox에 연결하려고 할 때 RSA passphrase 를 입력하라고 프롬프트
될 것이다.(패스워드가 아니다!)
% ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':
|
RSA 인증 설정이 완성되었다. Passphrase를 입력하라고 프롬프트 되지 않았다면 몇 가지를 더 시도해 보라. 우선 ssh
-1 drobbins@remotebox 를 입력하여 로그인을 시도하라. ssh에 ssh 프로토콜의 version 1 만을 사용하라고
프롬프트 될 것이다. 원격 시스템이 DSA 인증을 수행하지 않았을 경우 필요하다. 작동하지 않는다면 /etc/ssh/ssh_config
에서 RSAAuthentication no 라는 라인이 없는지를 확인하라. 그렇게 했다면 거기에 "#"를 붙여 주석처리 하라.
또는 remotebox 시스템 관리자와 연결을 시도하여 RSA 인증을 할 수 있도록 하고 /etc/ssh/sshd_config
에 적절한 세팅이 되었는지를 확인하라.
DSA 키 만들기
RSA 키가 version 1의 ssh 프로토콜을 사용했다면, DSA 키는 프로토콜 level 2 (ssh 프로토콜의 업데이트
버전)에 사용 된다. OpenSSH의 최신 버전은 RSA 와 DSA 키 모두를 사용 할 수 있어야 한다. OpenSSH의 ssh-keygen
으로 DSA 키를 만드는 것은 다음과 같은 방식으로 RSA 와 비슷하게 수행된다:
다시 passphrase를 입력하라고 프롬프트 될 것이다. 보안 passphrase 를 입력하라. DSA 키를 저장할 위치에
대해 프롬프트 될 것이다. 디폴트는 대게 ~/.ssh/id_DSA 와 ~/.ssh/id_DSA.pub 이다. DSA 키 생성이
완성된 후에 DSA 공개 키를 원격 시스템에 설치한다.
DSA 공개 키 설치
DSA 공개 키 설치는 RSA 와 거의 같다. DSA의 경우 ~/.ssh/id_DSA.pub 파일을 remotebox에 복사하게
될 것이다. 그리고 나서 이것을 remotebox의 ~/.ssh/authorized_keys2 에 붙인다. 이 파일은 RSA
authorized_keys 파일과 이름이 달라야 함에 주목하라. 일단 설정이 되면 실제 remotebox 패스워드를 입력하지
말고 DSA 비밀 키 passphrase를 입력하여 remotebox 로 로그인 할 수 있도록 한다.
다음 시간에는..
지금까지 RSA 또는 DSA 인증을 해보았다. 하지만 여전히 새롭게 연결을 할 때에는 passphrase를 입력해야 한다. 다음
글에서는 ssh-agent를 사용하는 방법을 설명하겠다. ssh-agent 는 패스워드를 입력하지 않고 연결이 가능하도록 도와주는
훌륭한 시스템이다. 하지만 디스크상에서 비밀 키를 암호화 해야 한다. keychain 도 소개하겠다. 이것은 매우 손쉬운 ssh-agent
프런트엔드로서 ssh-agent를 좀 더 안전하고 편리하게 해준다.
참고자료
필자소개  | 
| Daniel Robbins는 Gentoo Technologies, inc.의 사장/CEO이다. 또 PC용 고급 Linux인 Gentoo Linux의
창설자이자 , 차세대 Linux 포트 시스템인 Portage 시스템의 창시자이다. 또한 Macmillan사에서 출판하는
Caldera OpenLinux Unleashed, SuSE Linux Unleashed, Samba Unleashed에
집필활동을 하고 있다. |
기사에 대한 평가
|