프로젝트에 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 인스턴스)

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 파일에 추가해주어야 하고,
이를 자동화하기 위한 별도의 스크립트를 추가하여 다음과 같이 작성해야 한다.

'DevOps > CI-CD' 카테고리의 다른 글
Nginx 무중단 배포 (0) | 2024.09.19 |
---|---|
Jenkins CI/CD 구축하기 2편 (with. Docker) (0) | 2024.09.05 |
Jenkins CI/CD 구축하기 1편 (with. Docker) (0) | 2024.09.03 |
Github Actions CI/CD 프로젝트 적용기 (1) | 2024.06.08 |