SSH 접속 시 암호를 쓰지 않는 방법

By | 2010/11/11

  일반적으로 한 컴퓨터에서 다른 컴퓨터로 SSH 상에서 접속을 할 때 아이디와 비밀번호를 넣습니다. 그렇지만 리눅스 쉘 환경에서 다른 서버에 접속 시 아이디가 같을 경우 아이디를 적지 않아도 자동으로 해당 아이디로 접속이 됩니다. 하지만 비밀번호는 여전히 입력을 해야 접속이 가능합니다.

c0001

   즉, 이처럼 한 컴퓨터에서 다른 컴퓨터로 SSH로 접속할 때 비밀번호를 물어봅니다.

 

  그렇지만 비밀번호도 넣을 필요 없이 한 방에 바로 접속을 할 수 있는 방법이 있더군요.

c0002

  이처럼 다른 컴퓨터로 접속을 함에 있어 비밀번호를 물어보지 않고 바로 접속합니다.

 

  이러한 방법을 찾았기에 이를 소개하도록 하겠습니다.

  먼저 환경을 얘기하겠습니다. 현재 상황은 A 컴퓨터에서 B 컴퓨터로 SSH을 이용하여 접속하려고 합니다. A 컴퓨터에서는 Linux의 Shell 환경입니다. 그리고 여기서는 A 컴퓨터에 로그인한 아이디와 B 컴퓨터에 로그인할 아이디가 같다는 가정을 하고 있습니다.

 

  1. A 컴퓨터의 사용자 홈 디렉토리에서 .ssh 폴더를 찾아갑니다.

cd ~/.ssh

  라는 명령어를 통해 찾아갈 수 있습니다.

 

  2. key pair 파일을 생성합니다.

ssh-keygen –t dsa

  ssh-keygen이 무엇인지 살펴보니 ssh 인증을 위해 authentication keys를 생성/관리/변경하는 프로그램이네요.

c0003

  2번까지 진행을 한 것입니다. ssh-keygen을 할 때 아무 것도 입력하지 않고 enter키만 누르세요.

 

  3. id_dsa.pub 파일의 permission을 600으로 바꿉니다.

chmod 600 id_dsa.pub

  즉, 해당 파일을 생성한 유저 자신만이 쓰고 읽을 수 있도록 권한을 설정하는 것입니다. 위의 스크린샷을 보시면 id_dsa.pub의 permission은 644로 다른 이가 읽을 수 있습니다.

 

  4. 공개키 파일인 id_dsa.pub를 B 컴퓨터에 저장합니다. 이 때 파일명을 authorized_keys로 합니다.

scp id_dsa.pub [email protected]:~/.ssh/authorized_keys

  위의 명령어에서 ‘user’는 B 컴퓨터에서 로그인할 아이디를, ‘server’에는 B 컴퓨터의 주소를 넣습니다. scp 명령어는 첫 번째 인자의 파일을 두 번째 인자의 파일로 전송하는 명령어입니다.

  만약 B 컴퓨터의 ~/.ssh/authorized_keys 파일이 이미 존재하고 있을 경우 덮어쓰기를 하지 마시고 기존의 파일에 해당 파일의 내용을 추가하셔야 합니다. 방법은 다음과 같이 수행하면 되겠습니다.

scp id_dsa.pub [email protected]:~/.ssh/foo

B 컴퓨터에 로그인 후 ~/.ssh/foo 폴더로 이동한 후

cat foo >> authorized_keys

  이렇게 하면 추가가 됩니다.

c0004

  4번을 수행한 결과입니다.

 

  이제 A 컴퓨터에서 B 컴퓨터로 ssh 로그인을 시도하면 비밀번호를 넣을 필요가 없이 자동으로 진행이 될 것입니다.

c0005

  제일 첫 스크린샷과 달리 암호를 넣는 부분이 사라진 것입니다.

 

  SSH에 대해 잘 모르기에 왜 이렇게 되는지 문득 궁금해졌습니다. 그래서 한 번 찾아보았습니다.

  Secure Shell(SSH)는 사용자 인증(authenticate)를 공개키 암호 방식을 이용한다고 합니다. 공개키 암호 방식을 이용한 사용자 인증은 예전에 정보보호개요 시간에 배운 적이 있습니다.

c0006

2009년 1학기 정보보호개요 – 필기 자료

  이 방법이 ssh에서 쓰이는 방법인지는 확실하지 않으나 일단 수업 시간에 배운 것은 다음과 같습니다.

  사용자 A가 공개키(public key)와 개인키(private key)를 생성합니다. 그리고 생성된 공개키를 다른 사람이 가져갈 수 있게 공개합니다. 그리고 사용자 A는 자신이 사용자 A라는 얘기를 하면서 컴퓨터에 접속을 하려고 합니다. 그렇다면 컴퓨터는 들어오려는 사람이 자신은 사용자 A라고 하는데 정말로 맞는지 확인을 해야 합니다.

  따라서 컴퓨터는 난수 r을 생성하여 이를 접속하려는 유저에게 보냅니다. 그럼 유저는 해당 난수 r을 받아 그것을 자신의 개인키로 암호화 시킨 값 R을 생성하여 이를 컴퓨터에게 보냅니다. 그럼 컴퓨터는 R을 받아 이를 사용자 A의 공개키로 복호화 하여 자신이 보낸 난수 r이 맞는지 확인합니다. 만약 자신이 생성한 r과 복호화 하여 나온 r이 동일하다면 접속하려는 유저는 사용자 A의 공개키에 대응하는 비밀키를 가지고 있는 것이기에 사용자 A라고 판단할 수 있는 것입니다.

  이것이 제가 수업 시간에 배운 공개키를 이용한 사용자 인증 방법입니다. 그럼 이것이 SSH에서는 어떻게 쓰이는지 살펴보았습니다.

 

  아쉽게도 명확한 답변은 얻지 못했지만 이러한 구문을 찾았습니다.

Public-private keys are typically created using a key generation utility. Both keys in the pair are generated at the same time and, while the two are related, a private key cannot be computed from a corresponding public key. In addition to authentication, keys can also be used to sign data. To access an account on a Secure Shell server, a copy of the client’s public key must be uploaded to the server. When the client connects to the server it proves that it has the secret, or private counterpart to the public key on that server, and access is granted.

Security Benefits (continued)

  위의 과정을 보면 A 컴퓨터에서 공개키와 비밀키를 만든 후 공개키를 B 컴퓨터에 저장합니다. 그럼 A 컴퓨터에서 B 컴퓨터로 로그인을 할 때 인증용으로 사용될 공개키가 B 컴퓨터에 저장이 되어 있기에 위의 수업 자료에 나온 PK_A를 B 컴퓨터가 알고 있는 것입니다. 그렇다면 비밀번호를 묻는 것이 아니라 난수 r을 보내고 이를 확인하는 작업을 자동으로 하는 것이 아닐까 추측합니다.

  실제로 B 컴퓨터에 넣었던 공개키를 보니 이렇게 적혀 있습니다.

c0007

  공개키이기는 하지만 혹시나 하는 생각에 일부분을 지웠습니다.

  여하튼 마지막을 보면 [email protected] 이라고 나와있습니다. 즉, 예제에서 A 컴퓨터에 로그인한 사용자 정보입니다. 이처럼 B 컴퓨터에 저러한 정보가 들어있기에 skkulug.skku.ac.kr에 NoSyu라는 사용자가 nosyu.iptime.org의 NoSyu라는 사용자로 로그인을 하려고 한다면 자동으로 이를 확인하고 공개키 암호 방식으로 사용자를 인증하는 것이 아닐까 추측하고 있습니다.

 

  RFC를 읽어보면 Public Key Authentication Method는 컴퓨터 A에서 비밀키로 signature를 만들어 B 컴퓨터에게 전송하면 B 컴퓨터는 공개키를 이용하여 signature가 올바른지를 확인하는 방법으로 인증을 수행하는 듯싶습니다.

Public Key Authentication Method: "publickey"

 

  어떻든 이렇게 비밀번호만이 아닌 공개키 방식을 이용한 사용자 인증을 명시적으로 확인할 수 있었습니다. 덕분에 교과서에서만 배우던 것을 실제로 구현하는 것을 보았습니다.^^

  아쉬운 점은 명확하게 자료를 찾아내고 이를 설명하지 못했다는 점입니다. 분명 찾을 수 있을 것임에도 ‘듯싶습니다.’로 끝나버렸으니까요. 그 점이 매우 아쉽기는 하지만 그래도 정리하고 찾아본 것에 일단 만족하며 이 글을 마칩니다.

 

참조

Leave a Reply