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

By | Y2014Y2014-3M-D
  • Update(2016-05-29): CentOS 7 에서의 Non-password Input Authentication 를 위한

    Securing OpenSSH 문서의 [7. Use Public/Private Keys for Authentication] 항목 참고

    • ssh 접근 시, 패스워드를 자꾸 묻는다면 다음 두 가지 항목을 정확히 체크한다
    • finally set file permissions on the server:

      The above permissions are required if StrictModes is set to yes in /etc/ssh/sshd_config (the default).

      Ensure the correct SELinux contexts are set:

      Now when you login to the server you won’t be prompted for a password (unless you entered a passphrase when you created your key pair). By default, ssh will first try to authenticate using keys. If no keys are found or authentication fails, then ssh will fall back to conventional password authentication.


분산 시스템 간의 시스템 프로세스를 제어하기 위해서는 아무래도 각 시스템 간에 사용자의 권한을 획득하는 것이 필요하다. 이를 위해서 많이 사용되는 기법은 공개 키 기반으로 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 를 묻지 않아야 한다.

6,200 total views, 5 views today

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

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

댓글 남기기