본문 바로가기
DevOps/CI-CD

SSH (Secure SHell) 이란?

by wch_t 2024. 6. 4.

프로젝트에 CI/CD를 구축하는 과정에서 SSH와 관련된 개념이 부족하여, 며칠동안 꽤 애를 먹었다.

 

관련하여 여러 오류를 만나면서, 공부한 내용들을 정리하였다.

- 비대칭키(공개키, 비밀키)를 이용한 SSH 통신의 동작 흐름

- 클라이언트에서 신뢰할 수 있는 서버인지 확인하는 과정

- Github Actions에서 원격 SSH 통신을 할 때 known_host를 등록하기 위한 코드 작성

 

 


 

1. 개념

SSH(Secure SHell)

: 원격 호스트에 접속 및 원격 명령을 실행하기 위해 사용되는 보안 프로토콜

 


SSH를 사용하여 네트워크 상의 다른 컴퓨터에 원격 로그인하여 (ex. AWS EC2 원격 접속) 원격 시스템에서 명령을 실행하고,

다른 시스템으로 파일을 복사 (ex. SCP 명령어) 할 수 있다.

 

 


 

2. SSH 통신 동작 흐름

 

SSH Client(github actions workflow가 실행되는 컴퓨터) - SSH Server(ec2 인스턴스)

https://hstory0208.tistory.com/entry/SSH-Secure-SHell-%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90

 

 

1) SSH Client가 SSH 접속을 시도하면, SSH Server는 서로의 공개키와 비밀키가 일치하는 한 쌍인지 확인하기 위해 서버의 공개키로 암호화 된 메시지를 보낸다.

2) SSH Client는 가지고 있는 비밀키를 이용해, 공개키로 암호화된 메시지를 복호화하여 SSH Server에게 보낸다.

3) SSH Server는 SSH Client가 가지고 있는 비밀키가 자신의 공개키와 한 쌍인 것을 확인한다.

4) 서로 한 쌍의 키라는 것이 확인이 되면 서버와 클라이언트는 통신을 위한 대칭 키를 생성한다.
     이 키는 세션 동안 서버와 클라이언트 간의 모든 통신을 암호화하는 데 사용된다.

 

 


 

3. CI/CD에서 SSH 통신을 위한 설정 과정 (feat. Github Actions)

 

위의 그림을 보면 SSH Client가 SSH Sever와 통신하기 위해서 비밀키를 가지고 있어야 한다.

이를 위해서 github actions workflow가 실행되는 컴퓨터에 비밀키(EC2_KEY)를 생성하고 ssh 통신을 가능하게끔 하였다.

 

 

 

*SSH 통신 시 주의할 점 ( known_host )

SSH Client는 기본적으로 SSH Server가 신뢰할 수 있는 서버인지 잘 모른다.

 

따라서 SSH Sever가 신뢰할 수 있는 서버인지 확인하는절차를 거쳐야 하는데,

이는 SSH Client 내의 `~/.ssh/known_host` 파일을 통해 관리된다.

 

SSH 통신을 처음 시도할 때, 서버의 public key가 SSH Client에 알려지지 않은 상태라면,

SSH Server의 호스트 키를 수락할지 여부를 묻는 메시지가 나타나고, 사용자가 수락하면 서버의 host key가 `~/.ssh/known_host` 파일에 자동으로 추가된다.

 

Github Actions에서 EC2 인스턴스에 SSH로 연결할 때도 마찬가지이다.

처음 연결 시 EC2 인스턴스의 host key를 SSH_Client known_host 파일에 추가해주어야 하고,

이를 자동화하기 위한 별도의 스크립트를 추가하여 다음과 같이 작성해야 한다.