프로젝트에 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' 카테고리의 다른 글
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 |