SSH와 공개키를 이용한 시스템간 사용자 인증 및 권한획득

분산 시스템 간의 시스템 프로세스를 제어하기 위해서는 아무래도 각 시스템 간에 사용자의 권한을 획득하는 것이 필요하다. 이를 위해서 많이 사용되는 기법은 공개 키 기반으로 SSH 접근을 하는 것인데…

구글 검색을 해보면 이게 잘 안되는 많은 사람들의 절규(?)를 들을 수 있다. (물론 나도 삽질했다. 삽질은 결코 배신하지 않는다고 했던가..)

일단, 몇몇 사이트를 둘러보자. 적용절차와 이에 대한 문제, 예상원인, 처리방법 등이 잘 정리되어 있다. 하지만, 내 시스템과는 먼(?) 이야기가 될 수 있다는 거~

RSA, DSA 인증키 생성과 공개키 분배는 다음 글들에 잘 나와 있으니 참고하자.

* SSH로 인증키 기반의 접속과 SSH Agent Forwarding 기능까지 잘 설명되어 있다. http://blog.pages.kr/423

* SSH 사용중 ssh-keygen -t rsa, ssh-keygen -t dsa 사용중 오류에 대한 증상
http://nabiro.tistory.com/trackback/40

* SSH 암호 없이 자동 로그인 종합 안내(KLDP Thread)
https://kldp.org/node/84757

* SSH 에 대한 단편 지식
http://o5o5o.dyndns.org/wp/?p=823

문제는 위의 링크된 글에서도 알수 있지만, 분명히 제대로 한 것 같은데 안되는 경우이다.

내 경우도 각 서버에 각각의 원격서버에서 생성된 public key 파일(.pub) 를 받아서 authorized_keys 에 등록하고 접근 테스트를 통해 host의 아이피에 대한 fingerprint 등록까지 마쳤는데도 되지 않는 문제가 발생했다.

KLDP 문서에는 퍼미션 문제를 언급하고 있는데 실제로 첫 링크의 날으는 물고기 님의 글을 읽어보아도 private key 는 해당 시스템의 고유 user account 가 사용해야 하므로, user에만 권한을 주는 것이 맞겠고, authorized key 는 공개되는 게 맞겠다고 생각되며, 성공하고 난 후에도 확인해보니 퍼미션에 손을 댄 것은 없었던 듯 하다.

결론부터 말하자면 세가지 정도를 체크해본다.(CentOS)

1. /etc/ssh/sshd-config 의
RSAAuthentication yes, PubkeyAuthenticatioin yes, AuthorizedKeysFile .ssh/authorized_keys
항목을 확인한다.

2. Authorized Keys, private key 파일의 권한을 확인 및 변경
– chmod 600 ~/.ssh/authorized_keys
– chmod 600 ~/.ssh/id_dsa

3. SSH-Agent 등록. ssh-add 명령으로 각 호스트 자신의 private key 를  Agent에게 등록 해준다.
– ssh-agent 명령으로 나오는 환경변수 내용을 profile 에 등록
(개인적으로는 /etc/profile.d/custom.ssh 파일을 만들어 여기에 등록하여 system-wide 하게 적용하는 것이 좋을 듯 하다)
– ssh-add ~./ssh/id_dsa

이 세가지 정도가 체크포인트였던 것 같다. 그 외에 키 생성등에서는 절차를 다르게 수행한 적이 없다.

깔끔한 해결이 되지 않은 듯 하지만 일단 해결은 되었다. Agent Forwarding은 다음으로..


내용 추가: ssh 설정을 위한 세부 절차
* 3대의 서버 Hostname이 각각 beethoven, mozart, bach 일 경우

  1. cd ~/.ssh
    (디렉토리가 없으면 cd ~/; .ssh 폴더가 없으면 키 생성한 적이 없는 것을 뜻함)
  2. ssh-keygen -t  dsa 명령으로 공개키 생성
    .ssh/id_dsa, .ssh/id_dsa.pub
  3. cd ~/.ssh(.ssh 키가 새로 만들어진 경우만)
  4. 각 서버에서 다음을 실행한다. cp ~/.ssh/id_dsa.pub  ~/.ssh/authorized_keys
  5. vim /etc/ssh/sshd_config 명령으로 sshd_config 파일의 주석을 해제
    1. RSAAuthentication yes
    2. PubkeyAuthentication  yes
    3. AuthorizedKeyFile .ssh/authorized_keys
  6. TEST 실시: ssh -l current_account hostname
    (여기에서 fingerprint를 묻는 Prompt에서 yes, 2번 과정에서 생성한 개인키 PassPhrase 를 한번 입력해준다.)
  7. 각 서버의 id_dsa 파일을 id_dsa_hostname (ex. id_dsa_beethoven) 로 복사하고 scp 등으로 각각의 서버에 모두 복사해둔다.
    (Ex. scp ~/.ssh/id_dsa_beethoven  hadoop@mozart:~/.ssh/)
  8. 각 서버의 id_dsa.pub 파일을 id_dsa_hostname 으로 복사하고 scp 등으로 각각의 서버에 모두 복사해둔다.
    (Ex. scp ~/.ssh/id_dsa_beethoven.pub  hadoop@mozart:~/.ssh/)
  9. (Option.) 각 서버에서 모든 서버의 공개키를 ~/.ssh/authorized_keys 에 추가한다.
    (Ex. cat ~/.ssh/id_dsa_hostname >> ~/.ssh/authorized_keys)
  10. ssh-agent 를 실행 후, 각 서버에서 복사한 개인키(id_dsa_hostname )를 등록한다.
    ssh-agent $SHELL
    ssh-add ~/.ssh/id_dsa_hostname 
  11. 각 서버에서 다른 서버로 ssh 접속테스트한다. PassPhrase 를 묻지 않아야 한다.

5,434 total views, 1 views today

One thought on “SSH와 공개키를 이용한 시스템간 사용자 인증 및 권한획득

  1. Pingback: Hadoop 2.2.0 (1) – Installation #1: Prerequisites | bluecore's...

Leave a Reply