새소식

⇥ DevOps Tech 🙋🏻‍♀️/✏️ CICD

SSH , 리눅스 서버 비밀번호 없이 접속하기

  • -
반응형

1. SSH 란?

SSH는 Secure Shell의 약자, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜 입니다.
기존 원격 접속은 텔넷(Telnet)이라는 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 존재하여, 암호화하는 SSH 기술이 등장했습니다.
시점에서 SSH 원격 접속을 위한 필수적인 프로토콜로 사용되고 있습니다.

Jenkins ansible 그리고 클라우드 서비스에서 제공하는 서버 등은 모두 원격 접속으로 접근하여 사용하기 때문에, 서버 생성시 필수적으로 SSH 보안 과정을 거쳐야 합니다.

2. SSH 의 작동 원리

KEY 가지고 보안을 구성하는 방식입니다. 사용자와 서버는 각각의 키를 보유하고 있습니다. 키를 이용하여 연결 상대를 인증하고 인증 절차가 끝나면 데이터를 주고 받을 있게 됩니다.

 

비대칭키 방식

비대칭키 방식은 사용자와 서버가 서로의 정체를 증명하는 과정입니다. 사용자는 Key Pair 를 생성합니다.
키 페어는 공개 키와 개인 키 두가지로 이루어져 있으며 한 쌍을 이룹니다.
공개 키의 경우는 .pub 개인 키의 경우는 .pem 파일 형식을 가지고 있습니다.

공개 키는 유출되어도 문제가 되지 않는 말 그대로 공개 키 입니다.
이 공개 키(.pub) 를 서버에 전송하여 저장합니다.
이후에 개인 키(.pem)를 가진 사용자가 공개 키를 저장한 서버에 연결을 시도하면 키 페어는 인증되어 서버는 사용자를 식별할 수 있게 됩니다.
, 개인 (.pem) 사용자를 식별할 수단이기 때문에 유출되지 않도록 주의해야 합니다.

대칭키 방식

비대칭키 방식에서 사용자를 식별하였으니 데이터를 전송할 수 있습니다.이 과정에서 데이터가 유출되지 않도록 암호화를 통해 주고 받는데 대칭키 방식이 사용됩니다.
하나의 키를 사용자와 서버가 공유하게 되고, 이 키를 통해 전송자는 데이터를 암호화, 수신자는 데이터를 복호화 하여 정보를 주고 받게 됩니다.
대칭키는 접속 새로운 대칭키가 생성됩니다.

 

실습

ssh-keygen 명령어를 통해 페어를 생성합니다.

최초 명령어를 입력하면 key를 저장할 경로를 설정합니다. 
기본 경로는 ~/.ssh 에 저장되게 됩니다. 기본 경로를 사용하기 위해 엔터를 입력합니다.

다음으로 passphrase 를 입력하게 됩니다. 이는 개인키에 한번더 비밀번호를 설정할지 묻는 것입니다.
비밀번호 없이 생성하도록 엔터를 입력하겠습니다.

해당처럼 알 수 없는 문양과 함께 ssh-key 생성이 완료되었습니다.

~/.ssh 디렉토리로 이동해보면 아래처럼 파일이 생성되었습니다.

$ ls
id_rsa          id_rsa.pub

id_rsa 는 개인 키 파일입니다.
해당 파일은 유출되지 않도록 유의 해야 합니다.

id_rsa.pub 는 공개 키 파일입니다.
이 공개 키를 접속하고자 하는 서버에 저장하면 해당 서버에 접속할 수 있게 됩니다.

known_hosts 나 authorized_keys 등의 파일은 다른 서버에 접속했거나 혹은 내 서버에 다른 사용자가 접속했을 때 생길 수 있습니다.

이제 해당 공개 키를 가지고 다른 서버에 접속하려면 해당 서버에 접속해서 .ssh 디렉토리로 이동합니다.
만약 다른 서버의 jenkins 계정을 통해 접속하고 싶다면

1. jenkins 계정의 홈디렉토리에 .ssh 디렉토리로 이동
2. auauthorized_keys 파일을 열어줍니다. (없다면 새로 생성해줍니다.)
3. 사용자의 id_rsa.pub의 파일 내용을 복사해서 해당 파일에 입력 후 저장해주면 됩니다.

이렇게하면 jenkins 계정으로 접속 시 비밀번호를 대체하여 해당 키 파일 인증을 통해 접속할 수 있게 됩니다.

접속이 안될 때

접속이 안된다면 방화벽의 문제가 있을 수 있습니다. 
해당 서버 간에 통신이 원할한지 확인합니다.

만약 192.168.0.1 IP를 가진 서버에 접속하고 싶다면 접속하려는 서버에서 아래의 명령어를 입력해줍니다.
SSH 는 22번 포트를 사용하기 때문에 192.168.0.1:22 포트에 접속하려한다고 가정하겠습니다.

echo > /dev/tcp/192.168.0.1/22

만약 위와 같이 명령어를 입력했는데 바로 종료되고 아무 출력이 나타나지 않는다면 통신이 가능한 상태, 즉 방화벽이 막혀있지 않다는 뜻입니다.
하지만 오랜 시간 응답하지 않다가 time out 이 발생한다면 방화벽을 점검해보면 되겠습니다.

만약 방화벽 문제도 아니라면, 접속하려는 서버의 /etc/security/access.conf 에 권한을 부여해야 합니다.

+ : jenkins    : ALL

위 처럼 jenkins 부분에 접속을 허용할 계정의 이름, 모든 ip 에서 접근을 허용하기 위해선 ALL, 특정 ip 만 허용하려면 해당 ip나 대역을 입력해주면 됩니다.

 

썸네일정보
작가 vectorjuice 출처 Freepik

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.