SSH Key 활용

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
16/28

SSH Key

SSH Key란?

원래 SSH를 통해 Server에 접속하는 과정에서 Username과 Password를 입력하는 것이 일반적이다.

하지만 이 경우 Server에 접속할 때마다 매번 Username과 password를 입력해야 하는 귀찮은 작업이 수행되어야 하며 Username과 Password를 분실할 위험성도 존재한다.

이러한 위험성을 해결하면서도 간편함을 챙길 수 있는 방법이 바로 SSH Key이다.

SSH Key는 서버에 접속할 때 비밀번호 대신 미리 생성되어 있는 Key를 제출하는 방식이다.

Username-Password 방식이 번호 도어락이라면 SSH Key 방식은 열쇠문이라고 할 수 있겠다.

SSH Key는 비밀번호보다 높은 수준의 보안을 필요로 하는 상황이나 로그인 없이 자동으로 서버에 접속하고 싶을 때 많이 활용한다. 이 때문에 CI/CD 과정에서도 많이 활용한다.

CI/CD의 가장 큰 특징은 "자동화"에 있다. 그런데 다른 서버에 접속할 때 마다 매번 Usenrame과 Password를 입력하는 것은 자동화에 있어 매우 큰 걸림돌이 된다.

따라서 CI/CD에서 활용되는 Server들을 SSH Key를 통해 이동할 수 있게 함으로써 자동화를 조금 더 쉽게 구현하는 것이다.

SSH Key가 동작하는 방식

SSH Key는 "비대칭 암호화" 방식을 활용한다.

먼저 Local Host(SSH Server) 측에서 Public Key와 Private Key를 생성한다.

이후 원격 호스트(SSH Client), 즉 Host가 인증 없이 접근 할 Client에게 Public Key를 복사하여 전달한다. 비대칭 암호화 방식과 마찬가지로 Public Key는 모든 User가 볼 수 있는 Key로써 원격 호스트가 몇 개가 있든 여러 개의 원격 호스트에 동일한 Public Key를 복사하여 전달해준다.

원격 호스트 측에서는 Host에게 받은 Public Key와 SSH Client의 Private Key(Password)를 활용해 암호화를 수행한다.

Host에서 SSH Client에 접속을 하는 상황을 생각해보자.

SSH Client는 Public Key와 SSH Client의 Password로 암호화한 파일을 SSH Server(Host)에 전달한다. Host는 받은 파일을 자신의 Private Key로 복호화한다. 올바른 SSH Server에서 복호화를 수행했다면 복호화한 결괏값은 Remote Host의 Password가 될 것이며, 이를 통해 원격 호스트 측에서는 접속을 허가하는 알고리즘을 가진다.


SSH Server Keygen 설정

  • 출처 : Jenkins를 이용한 CI/CD Pipeline 구축(인프런)

우리가 만든 SSH Server들은 위 사진과 같은 구조를 가지고 있다.

우리는 Ansible Server에서 Docker Server, Java Server, 그리고 Ansible Server(자기 자신)에 접근할 때 Usenrname-Password 없이 바로 접근하게 만들고 싶다.

결국 Ansible을 활용해서 Docker Image를 생성 및 관리할 것이고, Jenkins는 Ansible Server에 접근해 빌드 결과물을 처리할 것이기 때문이다.

즉, Ansible Server가 Local Host(SSH Server), Docker Server와 Java Server, Ansible Server가 Remote Host(SSH Client)가 될 것이다.

Java Server는 나중에 생성할 것이므로 일단 Docker Server와 Ansible Server에 대한 SSH Key 설정만 수행해보자.

1. Ansible-Server 접속

docker exec -it ansible-server bash

2. SSH Key(Public Key, Private Key) 생성

ssh-keygen
  • Enter file ~ : 생성되는 SSH Key를 저장할 Directory
    • 아무 값도 입력하지 않고 엔터를 누르면 /root/.ssh Directory 아래에다 저장함
    • 개인적으로는 /root/.ssh Directory에 저장하는 것을 추천
  • Passphrase : 비밀번호
  • Passphrase again : 비밀번호 재입력

3. 생성한 Public Key를 원하는 서버에 복사

cat /etc/ansible/hosts

Ansible Server에서 접근하고 싶은 Node IP Address는 /etc/ansible/hosts 파일에 미리 입력해두었다.

따라서 이 파일에 저장되어 있는 IP Address에 Public Key를 복사해주면 된다.

Public Key를 복사하는 명령어는 아래와 같다.

ssh-copy-id root@[SSH Client IP Address]

필자는 IP Address 위치에 172.17.0.3, 172.17.0.4를 입력했다.

먼저 연결을 계속해서 진행할지 물어보는데 "yes"를 입력한다.

이후 Password 입력을 요청하는데 이 때는 SSH Client Password를 입력하면 된다.

이렇게 설정을 완료했다면 이후 ssh root@[SSH Client IP Address]로 접속한다면 Password 입력 과정이 생략되고 바로 Server에 접근할 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글