원격제어

원격에 있는 컴퓨터를 제어 할 수 있는 기술들에 대한 수업입니다.

원격제어 원격에 있는 컴퓨터를 제어 할 수 있는 기술들에 대한 수업입니다.

SSH Key - 비밀번호 없이 로그인

SSH Key란?

서버에 접속 할 때 비밀번호 대신 key를 제출하는 방식이다. 

SSH Key는 언제 사용하는가?

  • 비밀번호 보다 높은 수준의 보안을 필요로 할 때
  • 로그인 없이 자동으로 서버에 접속 할 때

SSH Key가 동작하는 방식

SSH Key는 공개키(public key)와 비공개 키(private key)로 이루어지는데 이 두개의 관계를 이해하는 것이 SSH Key를 이해하는데 핵심이다. 키를 생성하면 공개키와 비공개키가 만들어진다. 이 중에 비공개키는 로컬 머신에 위치해야 하고, 공개키는 리모트 머신에 위치해야 한다. (로컬 머신은 SSH Client, 원격 머신은 SSH Server가 설치된 컴퓨터를 의미한다.)

SSH 접속을 시도하면 SSH Client가 로컬 머신의 비공개키와 원격 머신의 비공개키를 비교해서 둘이 일치하는지를 확인한다. 

SSH Key 만들기

SSH Key를 통해서 서버에 접속 할 때 Unix 계열(리눅스, 맥)에서는 ssh-keygen이라는 프로그램을 이용하면 된다. 윈도우 머신에서는 SSH Client 프로그램이 자체적으로 제공하는 키 생성 프로그램을 이용하면 된다. 각 프로그램의 메뉴얼을 참조하자. 이번 수업에서는 Unix 계열에서 key를 생성하는 방법을 알아본다. 

ssh-keygen 사용하기

아래와 같이 입력한다. -t  rsa는 rsa라는 암호화 방식으로 키를 생성한다는 의미다. 

[axl@asterisk1 axl]$ ssh-keygen -t rsa
Generating public/private rsa key pair.

SSH 키를 저장할 위치를 지정한다. 엔터를 누르면 기본 경로에 저장된다. 기본 경로는 로그인 한 사용자의 홈디렉토리 아래에 .ssh이다. ($HOME/.ssh) SSH Client는 기본적으로 이 디렉토리에 있는 키를 이용해서 인증을 시도한다. 

Enter file in which to save the key (/home/axl/.ssh/id_rsa): <return>

passphrase 를 입력한다. passphrase는 일종의 비밀번호로 비공개키를 입력한 값으로 암호화한다. 권장 값은 10~30 문자이고 생략 가능하다. 생략하면 이 부분이 보안 홀이 될 수 있기 때문에 주의한다. 자동 로그인을 원한다면 생략해야 한다. 

Enter passphrase (empty for no passphrase): <Type the passphrase>

비밀번호를 확인한다. 같은 값을 입력하면 된다. 아래와 같이 출력된다면 키가 생성된 것이다.

Enter same passphrase again: <Type the passphrase>
Your identification has been saved in /home/axl/.ssh/id_rsa.
Your public key has been saved in /home/axl/.ssh/id_rsa.pub.
The key fingerprint is:
0b:fa:3c:b8:73:71:bf:58:57:eb:2a:2b:8c:2f:4e:37 axl@myLocalHost

키를 확인한다. 

[axl@asterisk1 axl] ls -al ~/.ssh/

아래와 같이 출력되면 성공한 것이다. 

drwx------  2 egoing egoing 4096 Feb 18 18:54 .
drwxr-xr-x 16 egoing egoing 4096 Mar  1 06:02 ..
-rw-rw-r--  1 egoing egoing  790 Feb 19 06:04 authorized_keys
-rw-------  1 egoing egoing 1675 Feb 18 18:51 id_rsa
-rw-r--r--  1 egoing egoing  395 Feb 18 18:51 id_rsa.pub
-rw-r--r--  1 egoing egoing 2216 Feb 19 18:34 known_hosts

authorized_keys 파일은 없을수도 있다. 

각 파일에 대한 설명은 아래와 같다. 

id_rsa private key, 절대로 타인에게 노출되면 안된다.
id_rsa.pub public key, 접속하려는 리모트 머신의 authorized_keys에 입력한다.
authorized_keys 리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장한다. 자세한 내용은 다음 단락을 참조

.ssh 디렉토리는 매우 중요한 보안 정보가 담긴 디렉토리다. 따라서 퍼미션 설정을 꼭해야 하는데 아래와 같은 설정을 권장한다. 아래의 명령을 순차적으로 실행한다. 퍼미션에 대한 자세한 정보는 생활코딩 리눅스 수업을 참조한다. (리눅스 수업 바로가기)

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub  
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts

이제 id_rsa.pub 파일을 리모트 서버의 $HOME/.ssh/authorized_keys 파일에 추가해줘야 한다. 아래의 그림을 보자. 

SSH Server의 authorized_keys 의 내용이 SSH Client의 id_rsa.pub 파일과 같아야 한다. 그래서 ssh 접속을 할 때 id_rsa 파일과 authorized_keys 파일의 내용을 비교 할 수 있다. 일반적으로 SCP를 사용한다. SCP는 파일을 전송하는 프로그램인데, 아래와 같은 형식을 갖는다.

scp $HOME/.ssh/id_rsa 리모트 머신의 아이디@리모트 머신의 호스트 주소:저장할 파일

위의 형식에 따라서 로컬 머신의 id_rsa.pub 파일을 리모트 머신의 홈디렉토리로 전송해보자. 아래는 SSH Client가 설치된 로컬 머신에서 실행하는 명령이다.

scp $HOME/.ssh/id_rsa.pub egoing@egoing.net:id_rsa.pub

아래와 같은 메시지가 뜬다면 전송에 성공한 것이다. 

id_rsa.pub                                                                                       100%  395     0.4KB/s   00:00 

이제 원격 머신에서 전송한 id_rsa.pub 파일을 authorized_keys 파일에 추가해보자. 아래의 명령에서 cat는 뒤에 따라오는 파일의 내용을 화면에 출력하는 것이고, >> 는 cat이 출력한 내용을 authorized_keys 파일에 추가하는 것이다. 내용을 교체하는 것이 아니라 추가하는 것이라는 점에 주의하자. 만약 리모트 머신으로 접속하는 여러개의 로컬 머신이 있다면 각각의 로컬 머신의 id_ras.pub 파일을 authorized_keys에 추가해주면 된다. 

cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys

SSH를 이용해서 접속하기

접속을 시도한다. egoing.net에 접속을 한다고 하면 아래와 같다. 접속 방법은 SSH 클라이언트를 참고한다. (Mac, 리눅스)

ssh egoing.net

비밀번호 없이 접속 되었다면 성공적으로 설정한 것이다. 

만약 id_rsa 파일을 $HOME/.ssh/id_rsa에 만들지 않고 다른 디렉토리에 만들었다면 -i 옵션을 사용한다. 

홈디렉토리에 auth라는 이름의 파일에 id_rsa의 내용이 담겨 있다면 아래와 같이 한다. 

ssh -i $HOME/auth egoing.net

접속하는 과정에서 많은 오류 상황이 있을 수 있다. 이럴 때는 ssh의 옵션 중에 -v를 이용하면 어디에서 문제가 발생했는지 추적하는데 도움이 된다. 더 자세한 정보는 -vv, -vvv를 통해서 열람 할 수 있다. 

ssh -v egoing.net 

댓글

댓글 본문
작성자
비밀번호
  1. 이진구
    정말 감사합니다 !!
    큰 도움이 될 것 같습니다
  2. invert
    좋은 정보 감사합니다.
    아무리 따라해도 안되서 고생하고 있었는데 한번에 해결됬어요!
    대화보기
    • 신창욱
      좋은 글 감사합니다.

      "authorized_keys 파일은 없을수도 있다. "와 함께 "knwon_hosts"도 마찬가지로 없을 수 있음에 대해서 언급하면 좋을 것 같아요.
    • Hyungkyu Ryu
      CentOS 에서는, .ssh directory를 700, authorized_keys 를 600 으로 권한 설정을 하지 않으면 동작하지 않습니다. 초보가 삽질했어요. 흑.
    • 서우찬
      scp 와 ssh-copy-id 시 /usr/bin/ssh-copy-id: ERROR: Host key verification failed가 뜹니다. 어떤것이 문제일까요?
    • 짐승남
      정말 감사합니다. 많은 도움이 되었습니다.
    • ㅈㅇㅅ
      감사합니다 정말로 !!!!!
    • 허근형
      잘 보고 갑니다요 ~~
    • hewon
      감사합니다
      많이 배우고 있어요
      늘 행복하세요
    • 감사해요
      하다가 막혀서 뭐가 문제였는지 몰랐는데 권한 문제였네요. 644로 바꾸고나니까 정말 잘 됩니다. 감사합니다.
    • kenu
      감사합니다. :)
    • 신종혁
      접속하려는 서버에 이미 키등록이 되어있는지 여부를 알수있는명령어가 있을까요? 그냥 접속시도했을때 passwd를 물어보는지 확인하면 가능하긴한데..이런방법말고 스크립트상에서 등록여부를 확인하고 싶어서요
    • 김동진
      감사합니다.
    • 김영진
      많은 도움이 됬습니다~ 감사합니다
    • 김성욱
      강좌 너무 잘봣씁니다. 감사합니다. ^^
    • egoing
      오!
      대화보기
      • 조중현
        윈도우에서 putty로 pageant로 접속하는것 정리했습니다.
        http://blog.naver.com......957
      • 개고생
        "감사합니다"님 저도 같은 증상으로 하루 정도 소비를 했는데...

        VMWare로 설치했더니 Default로 설치가 되어 비활성화 되었는지 감히 생각지도 못했네요.

        SELinux를 비활성화 했는지 확인해보세요..
      • 감사합니다
        비밀번호 안 넣었는데 자꾸 비밀번호를 물어봐요
        디버깅모드 출력해봤는데 무슨 문제인지 분석이 안되네요.
        죄송하지만 봐주실 수 있나요?

        C:\Users\Administrator\.ssh>ssh git@www.xxx.com -v
        OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007
        debug1: Connecting to http://www.xxx.com [1.2.3.4] port 22.
        debug1: Connection established.
        debug1: identity file /.ssh/identity type -1
        debug1: identity file /.ssh/id_rsa type -1
        debug1: identity file /.ssh/id_dsa type -1
        debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
        debug1: match: OpenSSH_5.3 pat OpenSSH*
        debug1: Enabling compatibility mode for protocol 2.0
        debug1: Local version string SSH-2.0-OpenSSH_4.6
        debug1: SSH2_MSG_KEXINIT sent
        debug1: SSH2_MSG_KEXINIT received
        debug1: kex: server->client aes128-cbc hmac-md5 none
        debug1: kex: client->server aes128-cbc hmac-md5 none
        debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
        debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
        debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
        debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
        debug1: Host 'www.xxx.com' is known and matches the RSA host key.
        debug1: Found key in /.ssh/known_hosts:1
        debug1: ssh_rsa_verify: signature correct
        debug1: SSH2_MSG_NEWKEYS sent
        debug1: expecting SSH2_MSG_NEWKEYS
        debug1: SSH2_MSG_NEWKEYS received
        debug1: SSH2_MSG_SERVICE_REQUEST sent
        debug1: SSH2_MSG_SERVICE_ACCEPT received
        debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi
        c,password
        debug1: Next authentication method: publickey
        debug1: Trying private key: /.ssh/identity
        debug1: Trying private key: /.ssh/id_rsa
        debug1: Trying private key: /.ssh/id_dsa
        debug1: Next authentication method: password
        git@www.xxx.com's password:
      • kirrie
        ssh-copy-id를 쓰면 공개키 복사를 한번에 할 수 있습니다.

        > ssh-copy-id userid@remote_host

        이렇게 하면 복사하려는 원격지 서버의 암호를 묻고 암호를 입력하면 키가 그냥 복사됩니다.
      • 퍼갑니다~ 좋은자료 감사합니다.
      • taelkim
        원격지에서 id_rsa.pub를 한번에 등록할 수 있는 명령입니다.

        cat ~/.ssh/id_rsa.pub | ssh root@192.168.0.xxx 'cat >> ~/.ssh/authorized_keys'
      • egoing
        http://lani78.wordpress.com/20...
        위의 링크를 보시면 /etc/ssh/sshd_config 파일을 아래와 같이 변경하시면 될 것 같습니다.
        ChallengeResponseAuthentication noPasswordAuthentication noUsePAM no
        대화보기
        • 애청자~
          강의 잘봤습니다^^ aws접속할 때 그냥 쓰기만 썼지 구체적인 내용은 몰랐는데 많은 도움이 됐습니다.그리고 질문이 있습니다. 이렇게 세팅하면 기존 id/pw로그인은 자동으로 막히게 되는건가요? 아니라면 막는 방법도 알려주세요~
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기