쿠버네티스 컨테이너로 배포된 자체 구축 GitLab에서의 SSH 사용

2022. 12. 6. 14:03[개발] 지식/Git

Git 레파지토리를 접근할 때는 2가지 인증 방식이 있다.

  • http 또는 https를 사용한 ID/PW 방식
  • SSH

보안 관점에서 봤을 때 ID/PW 노출 등의 이슈로 SSH가 권장된다. GitHub 등에서도 ID/PW 방식을 사용하는 것을 지양하고 있다. 그럼에도 불구하고 SSH는 키 생성 등 사전 세팅을 해야하기 때문에 귀찮아서 ID/PW를 사용하곤 했었는데, 도커 이미지 빌드를 통해 애플리케이션을 배포하는 과정에서 Dockerfile에 ID/PW를 넣는게 싫어 SSH를 적용하게 되었다.

일반적인 인터넷 환경에서 SSH 설정은 그리 어렵지 않다. 하지만 폐쇄망에서 작업을 해야하는 환경에서는 Git 레파지토리가 따로 구축되어 있는 경우가 많아 이런저런 귀찮은 상황이 생긴다. 본인의 경우 쿠버네티스 컨테이너로 배포된 GitLab을 사용하고 있으므로 이에 대한 작업을 기록하고자 한다.

GitLab SSH 접근 경로 설정

GitLab 서비스 플로우는 대략 위와 같다. NodePort로 서비스 중이기 때문에 어떤 노드로 접근하든 상관없지만, 여기서는 Master Node로 접근한다고 가정했다. 31000 포트를 열어두었기 때문에 Master Node의 31000으로 SSH 접속하면 GitLab의 Shell에 접근할 수 있다. Git 레파지토리에 SSH로 접근하기 위해서는 위와 같이 클라이언트에서 Git 레파지토리의 SSH접근 경로를 뚫는 작업이 선행되어야 한다. 설명의 편의상 GitLab 주소는 Mster Node IP가 123.123.123.123, 포트를 31001로 가정했을 때 아래와 같다.

  • GitLab 주소 : 123.123.123.123:31001
  • GitLab SSH 주소 : 123.123.123.123:31000

RSA Key 생성

$ ssh-keygen -t rsa -b 2048 -C "gitlab.projooni"

클라이언트 환경은 ubuntu 18.04LTS로 진행했다. 기본적으로 ssh-keygen이 있기 때문에 그대로 사용했고, GitLab 가이드대로 2048bit로 생성했다(권장). "gitlab.projooni"는 코멘트인데 굳이 넣지 않아도 되지만, 다른 키와 구분하기 위해 추가했다. 엔터를 치면 다음 스텝으로 파일명을 정할 수 있다. 결과적으로 아래와 같은 2개의 파일을 생성했다.

  • (개인키) id_rsa.gitlab.projooni
  • (공개키) id_rsa.gitlab.projooni.pub

RSA는 비대칭 키로써 개인키와 공개키 쌍으로 구성된다. 따라서 클라이언트는 개인키를 파일 형태로 갖고 있고, GitLab에는 공개키를 등록해서 인증을 수행한다.

GitLab에서 공개키 등록

$ vi id_rsa.gitlab.projooni.pub

공개키를 편집기로 열어 내용을 복사한다. 오른쪽 상단 프로필 → Preferences → SSH Keys 메뉴로 들어가서 복사한 키를 붙여넣기하고 Add key 버튼을 눌러 저장한다. GitLab 웹페이지는 버전별로 구성이 약간씩 다를 수 있으므로 굳이 화면은 캡처하지 않았으나, 대동소이하다.

클라이언트 SSH 설정

다시 클라이언트로 돌아와서 SSH 설정을 한다. SSH의 디폴트 포트는 22이다. 그래서 GitLab 레파지토리의 SSH url을 가지고 clone, pull, push 등을 시도하면 22번 포트로 접근하려고 할 것이다(123.123.123.123:22). 그런데 문제는 GitLab SSH 포트가 31000 이므로 123.123.123.123:31000로 접근해야 한다.

이를 해결하기 위해 클라이언트의 SSH 설정을 추가해야 한다. 리눅스에서 SSH 관련 기본 디렉터리는 ~/.ssh 이다. 이 안에 아래와 같이 config 파일을 생성한다.

$ vi ~/.ssh/config

그리고 아래와 같은 설정을 추가한다.

Host 123.123.123.123 # alias
  HostName 123.123.123.123 # host address
  Port 31000 # SSH Port
  PreferredAuthentications publickey # 인증방식(공개키)
  IdentifyFile ~/.ssh/id_rsa.gitlab.projooni # 개인키

작성하고 wq로 저장한다.

$ ssh -T git@123.123.123.123

위 명령어를 실행했을 때, Welcome to GitLab 이라고 뜨면 정상 설정이 된 것이다.

  • -T : 터미널을 열지 않음

git clone

$ git clone git@123.123.123.123:<id>/<repository name>.git
  • <id> : GitLab 아이디
  • <repository name> : 레파지토리 이름, 경로

GitLab UI에서 clone url을 복사해서 clone을 시도한다. 정상적으로 소스를 가져온다.

Reference

ProxyCommand를 이용한 SSH 중계 접속

SSH Proxy 와 점프호스트 ( 경유서버를 이용한 목적서버 연결 )

ssh config 설정 방법

<