E-LEARNING

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

토픽 E-LEARNING > 원격제어

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. annhobor
    아 그리고 public key는 '
    ''''원시인처럼' """"" 복붙으로 생성한후 authorized_keys에다 append 했습니다.
    대화보기
    • annhobor
      aws cloudshell에서 instance로 연결 시도하고 있는데, aws가 제공하는 방식 중 virtual network만 제외하고 다 해봤는데, 안되네요. 요즘 aws 서비스에서 안되는 것이 많은 건, 코로나 때문일까요? 아니면 코로나로 인한 재택근무의 타격일까요? 얼른 다 타격되고 정상화되기를 기대해 볼까요?
    • 커펜바인
      이고잉님, 언제나 잘 보고 있습니다.

      한가지 팁을 드리자면, rsa 키교환시 직접 키 파일을 복사해서 cat으로 authorized_keys 파일에 안넣고,
      한번에 적용할 수 있는 명령어가 있습니다.

      [로컬]#ssh-copy-id [리눅스계정명]@[원격IP주소]
      >[암호입력]

      이후 ssh key교환이 완료되고, 접속 가능합니다

      또한 SSH Key 만들기 부분을 먼저 적어주셨는데요, 기존에 Key가 있는지 체크하는 부분이 먼저 나와야 할 것 같습니다.
      기존에 Key가 있고, 타 서버로 키교환이 된 상태에서 새로 만들면 기존 Key교환된 내용이 깨지게 됩니다.
    • 나그네
      죄송하지만 위 설명에 오류가많습니다. SSH 클라이언트와 서버가 인증을 위해 진행하는 절차와 관련해서요

      아래 링크에 정확한 설명이있으니 참고해서 수정부탁드려요

      https://arsviator.blogspot.com......tml
    • 사랑해이고잉
      아... 이렇게 간단한 것을... 역시 이고잉님의 설명은 최고입니다. 너무 감사드립니다.
    • 오레가노
      오 상세한 설명에 이해가 한 방에 됐습니다.
      감사합니다.
    • craw
      감사합니다~~ 난해했던 거였는데 풀렸네요 ^^;;
    • 김민수
      감사합니다
    • chlrbtlr30
      egoing.net이란 것은 naver.com과 같이 도메인 주소를 의미합니다. 각 서버에는 할당된 ip주소(ex 194.124.124.124)가 할당되는데, 이것을 사람이 외우기 쉽게 문자열로 바꿔 놓은 것이죠.

      여기에 계정을 추가하여 계정 + @ + 도메인 의 형식으로 적으면, 그 도메인에 해당하는 서버에 앞쪽에 적어놓은 계정으로 접속한다는 의미입니다. 한 서버를 사용하는 계정이 여러개 있을 수 있기 때문에, 내가 사용하는 계정으로 접속한다는 의미이지요. naver.com이란 도메인에 egoing이라는 계정으로 로그인하면 egoing@naver.com이 되는 원리와 같습니다.

      '서버에 접속한다.'라는 의미를 잘 이해하지 못할 수 도 있는데, 간단하게 본인 노트북의 윈도우에도 접속할때 본인 계정 인증을 하고 들어가잖아요? 그거랑 같은것이라고 생각하면 됩니다. 한 OS에도 여러 계정을 생성하여 접속할 수 있듯이, 한 서버에도 여러개의 계정을 생성하여 사용할 수 있습니다.
      대화보기
      • Git 자동 로그인
        Mac에서 Git 사용시 많은 도움이 되었습니다. 좋은글 감사합니다.
      • 도움받은자
        ssh egoing.net 과 ssh 계정@egoing.net 차이는 뭔가요? 궁금합니다.
      • 버튼
        Hyungkyu Ryu님 너무 감사 드려요~
        엄청 헤매다가 알려주신 권한설정으로 해결 했네요...
        대화보기
        • Yu TaeKyeong
          이 예제는 egoing.net의 루트 계정에 하신건가요?
          접속하기 잘 되는데 저는 예제처럼 [ssh 내주소]는 [Permission denied]가 뜨고 [ssh 계정@내주소]으로 하니까 접속이 되네요

          위 내용과 별개로 [cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys] 이 작업 할 때에 서버에 $HOME/.ssh 폴더 및 authorized_keys 파일이 없다면 그냥 직접 생성하기만 하면 되네요!
        • 이진구
          정말 감사합니다 !!
          큰 도움이 될 것 같습니다
        • 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로그인은 자동으로 막히게 되는건가요? 아니라면 막는 방법도 알려주세요~