본문 바로가기
Development Tools/DevOps

SSH 연결시 암호 없이 접속하기

by jjerryhan 2018. 5. 21.
반응형

자 이전 포스트에 이어 생성한 key 파일을 이용해서 ssh 접속을 암호입력 없이 해 보도록 하겠습니다.
ssh 연결시 암호 없이 접속하기 위한 key 파일 생성에 대해서는 http://dreamholic.tistory.com/111 포스트를 참조하기 바랍니다.

Screen Shot 2018-05-20 at 10.34.57 PM.png

실습에는 ubuntu 18.04 를 사용합니다. cloud 에 서버를 구성하는 데 제가 사용하는 서비스가 18.04 버전을 지원하길래 18.04 를 이용합니다.

생성한 암호키의 public 키를 서버에 복사하기

이전 포스트에서 간략히 설명한 것처럼 키를 생성하면 외부 배포(?)를 위한 public 키와 이에 matching 되는 private 키의 pair 가 만들어 집니다. public 키는 여기저기 배포를 해야 되고, 또 그렇게 하기 위한 키 이지만 private 키는 말 그대로 private 하게 나만이 보관을 하고 지정된 곳에 아주 잘 보관을 해야 합니다.

생성한 키를 이용해서 원격 서버에 암호 입력 없이 접속하려면 생성한 키 pair 중 public 키를 원격 접속 서버에 저장해 두면 됩니다.

생성한 public key 를 서버에 설정하는 가장 빠른 방법은 ssh 키 생성과 마찬가지로 linux 계열에서 제공하는 'ssh-copy-id' 명령어를 이용하는 방법입니다.

'ssh-copy-id' 명령어를 사용할 수 없는 장비에서 작업 중인 경우에는 ssh 암호 입력을 통한 복사나, 수 작업으로 키 파일을 복사해야 합니다.

그럼 하나씩 사용법을 구체적으로 알아보겠습니다.


ssh-copy-id 를 이용해서 서버에 복사하기

ssh-copy-id 명령어는 대부분의 OS 에 포함되어 있습니다. 이 명령어를 사용하기 위해서는 원격서버에 계정이 이미 있고, 원격 계정에 대한 암호도 이미 알고 있는 상태여야 합니다.

ssh-copy-id username@remote_host

위와 같이 원격장비에 대해 ssh-copy-id 명령어를 실행하면 해당 서버에 대한 최초 접속인 경우 아래와 같은 메세지가 출력되게 됩니다.

The authenticity of host 'x.x.x.x(x.x.x.x)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

위 메세지는 현재 작업중인 장비에서 해당 서버에 대한 최초 접속시에만 출력이 되는데, 원격장비에 대한 인식번호(fingerprint) 를 확인하고 기존에 접속해 본 적이 없는 장비라는 것을 저에게 알려주는 것입니다.

yes 를 입력하면 해당 일련번호가 제 로컬장비에 저장되어 이후 접속시에는 이 메세지를 출력하지 않게 됩니다.
당연히 no 를 입력하면 접속을 하지 않고 종료 됩니다.

yes 를 입력해서 접속하게 되면, 계정에 대한 암호 입력을 요구합니다. 계정에 대한 암호를 입력하면, 로컬장비상에 만들어진 키의 public 키, 즉 id_rsa.pub 파일에 있는 public 키 값이 서버 장비에 저장됩니다.

Screen Shot 2018-05-20 at 11.05.30 PM.png

완료된 후에 원격 서버에 접속해서 확인해 보면 원격 장비상의 사용자 홈 계정의 .ssh 경로 및에 authorized_keys 파일이 생성되고 해당 파일에 로컬 장비상의 .ssh 경로에 있는 id_rsa.pub 키 값이 복사되어 있는 것을 확인 할 수 있습니다.

Screen Shot 2018-05-20 at 11.14.00 PM.png

pub 키가 복사된 이후에는 간단히 "ssh 'username@server_ip'" 하면 암호 입력 없이 접속이 됩니다.

Screen Shot 2018-05-20 at 11.15.57 PM.png

쉽죠?


SSH 를 이용해서 pub key 복사하기

ssh-copy-id 명령어를 사용할 수 없는 경우 ssh 접속을 통해 public key 를 원격 서버에 직접 복사할 수 있습니다.

로컬 장비에 public 키 파일을 읽어서 원격 장비의 authorized_keys 파일에 더하는 방식입니다.

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh 
&& touch ~/.ssh/authorized_keys 
&& chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

복잡해 보이지만

  1. 로컬 파일을 cat 해서,
  2. 원격 경로 .ssh 를 생성하고,
  3. 원격 파일 authorized_key 파일을 생성하고,
  4. 생성한 파일에 로컬 파일 내용을 더한다
    입니다.

ssh-copy-id 명령어가 해주는 역할을 순서대로 직접 수행한 셈이네요.
이후 접속하는 방법은 동일합니다.

수작업으로 Public Key 복사하기

이것도 복잡하고 저것도 잘 안되면 그냥 직접 수동으로 pub key 값을 원격 장비에 복사하면 됩니다.
로컬 장비의 .ssh/id_rsa.pub 파일의 내용을.
원격 장비의 .ssh/authorized_key 파일에 복사 하면 되는 거죠.

항상 이런 작업시에 유의해야 할 점은 절대 덮어쓰기를 하면 않되고, 끝에 추가해 주어야 한다는 것이고, 작업전에 되도록이면, 아니 반드시 작업전 파일을 백업해 두어야 한다는 점입니다.

개인 계정이야 상관이 없지만, 공용서버 공용계정을 작업할 경우, 한 번의 실수로 모든 사람들의 접속 설정을 날려서 낭패를 볼 수 있기 때문에 주의하기 바랍니다.

로컬 id_rsa.pub 에 저장되어 있는 공용키 정보를 확인합니다.

cat ~/.ssh/id_rsa.pub

원격 서버에 접속한 후 .ssh 경로가 없을 경우에는 생성해 줍니다.

mkdir -p ~/.ssh

해당 경로에 authorized_keys 파일을 생성해 주고, id_rsa.pub 파일의 내용을 추가해 줍니다.
이미 authorized_keys 파일이 있는 경우에는 내용만 추가해 줍니다.

echo [공용키 문자열] >> ~/.ssh/authorized_keys

이렇게 하여도 되고, nano 나 vi 를 통해 직접 편집해도 됩니다.

마지막으로 .ssh 경로와 authorized_keys 파일에 적절한 권한을 부여합니다.

chmod -R go= ~/.ssh

위 명령은 .ssh 경로에 대해 소유자 이외의 모든 그룹과 사용자로 부터 모든 권한을 제거하는 내용(= 뒤에 공백 문자열 있음을 주목!)입니다.
나만 볼 수 있으면 되니까요. 보안 강화의 방법 입니다.

모든 설정이 완료되면, 아래와 같이 ssh 접속시 암호 입력 없이 접속하면 됩니다.

pub 키가 복사된 이후에는 간단히 "ssh 'username@server_ip'" 하면 암호 입력 없이 접속이 됩니다.

Screen Shot 2018-05-20 at 11.15.57 PM.png


암호 입력을 통한 사용자 접속기능 차단하기

사실 key 파일을 통한 ssh 접속을 사용하는 가장 큰 이유는 보안입니다.
암호 입력을 하지 않고 접속하는 사용자 편의를 제공하기 보다는 사용자가 ssh 접속시 키 파일을 통한 접속만을 허용하고 암호 입력을 통한 접속 방식 자체를 제거하여 애초에 암호를 뚤어서 보안을 무력화 시키고자 하는 시도 자체를 제거하는 것이지요.

당연히 위의 모든 과정을 거쳐 모든 사용자가 암호 입력없이 정상적으로 ssh 에 접속할 수 있는 상황이 완료된 후에 수행하여야 합니다.
필수 사항은 아니고 권장 사항이며, 간략히 다루 도록 하겠습니다.

암호 인증 기능 끄기

암호 입력 없이 정상적으로 접속이 가능하도록 설정이 완료되면, 암호입력을 통한 ssh 인증 기능을 꺼 버려도 되겠죠?

당연히 이 작업을 수행하기 전에 무엇보다 root 계정에 대해 ssh 키 파일을 통한 접속이 가능하도록 설정을 완료하고, 테스트도 완료한 후에 수행하여야 합니다.

암호 입력을 통한 인증 기능을 꺼 버리면, root 계정으로도 암호 입력을 통해서는 접속을 할 수 없기 때문에 반드시 확인, 또 확인하기 바랍니다.

sshd 설정을 변경하여 암호인증 기능 off

ssh 데몬 설정파일을 편집하여 암호 인증 기능을 off 합니다.

sudo nano /etc/ssh/sshd_config

해당 파일에서 아래와 같이 PasswordAuthentication 항목을 no 로 지정합니다.

PasswordAuthentication no

그리고 sshd 를 재기동 하면 즉시 암호인증을 통한 접속은 불가해 집니다.

반드시 ssh 재기동 전에 root 계정에 대해, 또는 sudo 실행 권한이 가능한 계정에 대해 key 파일을 통한 인증 설정을 완료하고, 접속이 가능한지 여부를 확인하여야 합니다.! 반!드!시!

sudo systemctl restart ssh

sshd 가 재기동 되기 때문에 현재 접속한 session 도 접속이 종료됩니다.
재 접속 부터는 키 파일을 통한 접속만이 가능하고 암호 인증을 통한 접속 자체가 불가합니다.


이번 포스트는 ssh 연결시 암호 없이 접속하기 위한 키 파일의 설정을 서버에 하는 방법과 ssh 에 대한 암호 인증 제거 방법을 정리해 보았습니다.

긴글 읽어 주셔셔 감사합니다.