들어가는 글
필자는 게을러서 패스워드를 입력하는 것을 싫어 합니다만 암호화된 로그인 세션을 좋아합니다. 이 글에서는 SSH를 설정하여 패스워드 없이 다른 호스트에 연결하는 방법에 대해 설명합니다. 이 글에서는 ksh를 기본 로그인 쉘로 사용하지만 다른 쉘로 수정하여 사용할 수도 있습니다. 이 글은 SSH Tectia 서버를 기반으로 쓰여 졌습니다. 몇가지 수정을 통해 OpenSSH 서버에서도 동작이 가능합니다.
SSH 키 설정하기
아래와 같이 입력합니다.
ssh-keygen -P
약간의 시간이 필요 합니다. 이 작업은 널 패스구문을 통해 SSH 키를 생성하고 이를 ${HOME}/.ssh2 디렉토리에 위치 시킬 것입니다. 다음으로 identification 파일에 키를 추가 시킵니다:
echo "Key id_dsa_2048_a" > ${HOME}/.ssh2/identification
또한 authorization 파일을 원격에 설정해야 합니다. 그러므로 퍼블릭 키를 사용하여 이를 생성합니다
echo "Key id_dsa_2048_a.pub" > ${HOME}/.ssh2/authorization
이제 사용자는 엑세스 하고자 하는 모든 원격 서버에 똑같은 작업을 수행 합니다. 간편하게 하기 위해 필자는 관련된 SSH 파일들을 모두 복사하였습니다. 이 방법을 통해 필자가 접속 하는 모든 서버를 패스워드 없이 SSH 로그인 할 수 있습니다. 필자는 오직 하나의 키를 생성하여 여러 곳에 사용합니다.
cd ${HOME}/.ssh2
scp id_dsa* identification authorization remotehost:.ssh2
SSH 에이젼트 시작하기
이것은 두 단계의 과정으로 이루어 집니다. 일단 ssh-agent 를 시작한 다음 개인 키를 읽어들입니다. 보통 아래와 같은 방법을 사용합니다.
eval `ssh-agent`
ssh-add
기본적으로 ssh-add 는 identification 파일에 목록화되어있는 모든 키들을 읽어들이려고 할 것입니다. 우리는 키를 위해 널 패스구문을 생성했었기 때문에 키를 읽어 들일 때 패스워드를 입력하도록하는 프롬프트가 나오진 않을 것입니다. 이제 사용자는 패스워드 입력을 요구 받지 않고 원격 서버에 SSH로 접속 할 수 있어야 합니다. 오직 하나의 문제는 SSH 에이젼트는 사용자가 로컬 호스트에 로그인 되어 있는 시간 동안에만 유효 하다는 것입니다. 만약 로컬 호스트에서 로그아웃하였다면 사용자는 반드시 SSH 에이젼트를 재시작해서 키들을 다시 읽어들이도록 해야합니다.
SSH 에이젼트를 자동으로 시작하기
ksh에서 ENV 변수는 ksh 실행을 위한 소스 파일 이름이 저장되는 곳입니다. 보통 사용자는 이 변수를 ${HOME}/.profile,에 지정하고 반드시 사용자가 이 변수를 불러 들여 와야 다른 서브쉘에서도 보여 지게 됩니다. 보통 필자는 다음과 같은 구문을 ${HOME}/.profile 에 가지고 있습니다.
ENV=${HOME}/.kshrc
export ENV
이 변수 세트를 가지고 있는 것은 매우 중요 합니다. 왜냐하면 우리는 ksh가 자동으로 이 파일을 읽어 들이기를 원하기 때문입니다. 사용자의 ${ENV} 파일의 위에 다음과 같은 라인을 추가 시킵니다.
if ! ssh-add; then
exec ssh-agent ${SHELL}
fi
** 이 글의 마지막 섹션에 위와는 다른 자동 시작 방법이 설명되어 있습니다.
이제 매번 ksh 프로세스가 시작될때 마다 제일 첫번째로 읽어드린 SSH 키 를 검사 하게 됩니다. 만약 ssh-add 가 키를 읽어 들이지 못한다면 ssh-agent 는 실행되지 않을 것입니다. 만약 키가 이미 읽어 들여 졌다면, ssh-add 를 재시작하면 키를 다시 읽어 들이기만할 것입니다.
이것은 재귀적인 절차 입니다. exec 커맨드는 현재의 프로세스를 ssh-agent 커맨드로 교체하게 됩니다. ssh-agent 커맨드는 새로운 ${SHELL} (i.e., ksh) 프로세스를 시작시킵니다. 새로운 ${SHELL} 프로세스는 ${ENV} 파일을 다시 읽어 들이게 됩니다. 그러나 이번에 ssh-add 커맨드는 키를 추가 하는것이 가능해 지고 ${ENV} 파일의 나머지 부분을 읽어 들이게 됩니다. 결과적으로 로그인 시에 다음과 같은 메세지를 보게 될 것입니다.
Last login: Tue Feb 14 2006 10:28:03 -0500 from ...
Sun Microsystems Inc. SunOS 5.9 Generic May 2002
No mail.
Sun Microsystems Inc. SunOS 5.9 Generic May 2002
Failed to connect to authentication agent - agent not running?
Adding identity: /home/wseppele/.ssh2/id_dsa_2048_a.pub
$
굵은 글씨로 씌여진 라인 중 첫번째 라인은 ${ENV} 파일을 처리하는 첫번째 과정임을 나타 냅니다. ssh-add 커맨드는 실행되지 않았습니다. 왜냐하면 SSH 에이젼트를 찾을 수 없기 때문 입니다. 그래서 쉘은 에이젼트를 실행한 다음 새로운 쉘을 시작하게 됩니다. 새로운 쉘은 ${ENV} 파일을 다시 읽어 들입니다. 이번에는 키를 읽어들이고 모든것이 완료 되었습니다. 사용자는 반드시 호스트에 패스워드 없이 SSH 로그인이 가능해야 합니다. 주의: 만약 원격 호스트에서 또 다른 머신으로 로그인 하길 원한다면 ${HOME}/.profile 과 ${HOME}/.kshrc 을 원격 서버에 반드시 설정해 줘야 합니다.
정리 하기
이 방법은 SSH 에이젼트를 시작시키는 것에 조금 복잡한 과정으로 보일 지도 모르겠지만 주목할만한 효과가 있습니다. SSH 에이젼트를 실행한 상태에서 시스템에서 로그아웃 할때 SSH 에이젼트는 자동적으로 ssh-agent 프로세스를 종료 시키고 사용하는 모든 소켓을 정리 합니다. 이 방법을 사용하기 위해서는 다음과 같이 ssh-agent 를 수동으로 실행시킵니다.
eval $(ssh-agent)
ssh-add
그 다음에 사용자는 반드시 사용 후에 수동으로 ssh-agent 를 종료 시켜야 하고 /tmp/ssh-${LOGNAME} 소켓을 종료 시켜서 완전히 작업을 완료해야 합니다.
자동시작 프로세스 간략화 하기 (ksh 유저만 해당)
위에서 주어진 설정 예제는 아주 간단한 것이고 잘 동작됩니다. 그러나 에러를 위한 공간을 남겨두지 않았습니다. SSH 에이젼트를 재시작하는데는 많은 것들이 잘못 될 수 있습니다. 예를 들어 커맨드를 입력되지 않았거나 파일이 잘못됐거나 키를 읽어 들이는데 문제가 발생하는 등의 경우가 생길 수 있습니다. 여기 자동시작 프로세스에서 잘못될 수 있는 모든 것들을 회피할 수 있도록 한 예제를 제공합니다. 다음의 내용을${HOME}/.kshrc 파일에 입력하시기 바랍니다.
[[ -x "$(whence ssh-agent)" ]] \
&& [[ -z "${SSH2_AGENT_PID}" ]] \
&& exec ssh-agent ${SHELL}
[[ -x "$(whence ssh-add)" ]] \
&& [[ "$(ssh-add -l 2>/dev/null)" == *"no keys"* ]] \
&& ssh-add
댓글을 달아 주세요
좋은 정보 감사해요~
2007/09/19 04:18