GitLab Runner SSH 비밀번호 없이 원격 서버 자동 배포 설정하기

GitLab Runner 서버에서 SSH 공개키를 이용해 원격 서버에 비밀번호 없이 접속하는 방법을 설명합니다. ssh-copy-id 사용법부터 GitLab CI/CD 자동 배포 설정까지 실무 예제를 포함해 정리했습니다.

GitLab Runner SSH 비밀번호 없이 원격 서버 자동 배포 설정하기

GitLab CI/CD를 이용하여 서버 자동 배포를 구성할 때 가장 먼저 해결해야 하는 문제가 SSH 비밀번호 입력입니다. 배포 파이프라인은 사람이 직접 로그인하는 환경이 아니기 때문에 비밀번호 입력 없이 서버에 접속할 수 있어야 합니다.

이번 글에서는 GitLab Runner 서버에서 SSH 공개키를 등록하여 원격 서버에 무비밀번호 접속을 설정하는 방법을 설명합니다.


왜 SSH 비밀번호 없이 접속해야 할까?

일반적인 SSH 접속은 다음과 같이 비밀번호를 요구합니다.

 
ssh deployuser@xxx.xxx.xxx.xxx
 

하지만 GitLab Runner는 자동으로 스크립트를 실행하기 때문에 중간에 비밀번호를 입력할 수 없습니다.

따라서 다음과 같은 방식으로 SSH Key 인증을 사용해야 합니다.

GitLab Runner
    ↓
SSH Key 인증
    ↓
원격 서버
 

이렇게 구성하면 배포 시 비밀번호 입력 없이 자동으로 접속할 수 있습니다.


현재 SSH 키 확인하기

먼저 GitLab Runner 서버에 SSH 키가 존재하는지 확인합니다.

 
ll ~/.ssh/
 

예시 결과

 
id_rsa
id_rsa.pub
known_hosts
 

여기서 중요한 파일은 다음과 같습니다.

파일명설명
id_rsa 개인키(Private Key)
id_rsa.pub 공개키(Public Key)
known_hosts 접속한 서버 정보

특히 공개키인 id_rsa.pub 파일을 원격 서버에 등록해야 합니다.


SSH 공개키 등록하기

GitLab Runner 서버에서 아래 명령어를 실행합니다.

 
ssh-copy-id -i ~/.ssh/id_rsa.pub deployuser@xxx.xxx.xxx.xxx
 

예시

 
ssh-copy-id -i ~/.ssh/id_rsa.pub deployuser@xxx.xxx.xxx.xxx
 

이 명령은 현재 서버의 공개키를 원격 서버의 authorized_keys 파일에 자동 등록해 줍니다.


처음 접속 시 Host 인증

처음 연결하는 서버라면 아래 메시지가 출력될 수 있습니다.

 
The authenticity of host 'xxx.xxx.xxx.xxx' can't be established.
Are you sure you want to continue connecting (yes/no)?
 

다음과 같이 입력합니다.

 
yes
 

그러면 해당 서버 정보가 known_hosts 파일에 저장됩니다.


최초 1회 비밀번호 입력

공개키를 등록하는 과정에서는 원격 서버 계정 비밀번호를 한 번 입력해야 합니다.

 
deployuser@xxx.xxx.xxx.xxx's password:
 

원격 서버 계정 비밀번호를 입력합니다.

이 과정은 공개키 등록 시에만 필요합니다.


공개키 등록 성공 확인

정상적으로 등록되면 다음과 같은 메시지가 출력됩니다.

 
Number of key(s) added: 1

Now try logging into the machine, with:
  "ssh 'deployuser@xxx.xxx.xxx.xxx'"
 

이 메시지가 보이면 공개키 등록이 완료된 상태입니다.


SSH 접속 테스트

다시 접속을 시도합니다.

 
ssh deployuser@xxx.xxx.xxx.xxx
 

정상이라면 비밀번호를 묻지 않고 바로 로그인됩니다.

 
Last login: ...
[deployuser@server ~]$
 

이 상태가 되면 GitLab Runner 자동 배포를 위한 SSH 설정이 완료된 것입니다.


GitLab CI/CD 자동 배포 적용하기

이제 GitLab Runner에서 원격 서버에 비밀번호 없이 접속할 수 있으므로 .gitlab-ci.yml에 배포 명령을 추가할 수 있습니다.

 
deploy-to-main-server:
  stage: deploy

  only:
    - main

  script:
    - pwd

    # 로컬 서버 배포
    - ssh localuser@localhost "
      cd /home/localuser/project &&
      git checkout main &&
      git pull origin main
      "

    # 원격 서버 배포
    - ssh deployuser@xxx.xxx.xxx.xxx "
      cd /home/deployuser/project &&
      git checkout main &&
      git pull origin main
      "

  tags:
    - deploy
 

GitLab에서 Main 브랜치에 Push가 발생하면 Runner가 자동으로 접속하여 최신 소스를 배포하게 됩니다.


SSH 접속이 안 될 때 확인할 사항

authorized_keys 권한 확인

원격 서버에서 확인합니다.

 
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
 

SSH 서비스 실행 여부 확인

 
systemctl status sshd
 

또는

 
systemctl status ssh
 

공개키 등록 확인

 
cat ~/.ssh/authorized_keys
 

등록한 공개키가 포함되어 있는지 확인합니다.


실무 팁

실제 운영 환경에서는 다음 방식을 권장합니다.

개인키 암호 설정

보안을 위해 개인키에 암호를 설정할 수 있습니다.

 
ssh-keygen -p
 

배포 전 테스트 명령 추가

 
script:
  - ssh deployuser@xxx.xxx.xxx.xxx "hostname"
 

배포 전에 접속 가능 여부를 먼저 검증할 수 있습니다.


여러 서버 동시 배포

 
script:
  - ssh web1@xxx.xxx.xxx.xxx "deploy script"
  - ssh web2@xxx.xxx.xxx.xxx "deploy script"
  - ssh web3@xxx.xxx.xxx.xxx "deploy script"
 

운영 서버가 여러 대일 경우 동일한 방식으로 확장 가능합니다.


FAQ

SSH 키를 새로 생성해야 하나요?

아닙니다.

이미 아래 파일이 존재한다면 그대로 사용하면 됩니다.

 
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
 

ssh-copy-id 명령이 없으면 어떻게 하나요?

직접 공개키를 복사하여 등록할 수 있습니다.

 
cat ~/.ssh/id_rsa.pub
 

출력된 내용을 원격 서버의

 
~/.ssh/authorized_keys
 

파일에 추가하면 됩니다.


GitLab Runner에서만 사용할 수 있나요?

아닙니다.

Jenkins, Github Actions Self-hosted Runner, Drone CI, TeamCity 등 SSH 기반 자동 배포가 필요한 모든 환경에서 동일하게 사용할 수 있습니다.


마무리

GitLab Runner에서 원격 서버로 자동 배포를 구성하려면 SSH 공개키 인증 설정이 필수입니다. 이미 서버에 id_rsa와 id_rsa.pub가 존재한다면 새로 키를 생성할 필요 없이 ssh-copy-id 명령만 실행하면 됩니다.

공개키 등록이 완료된 후 ssh deployuser@xxx.xxx.xxx.xxx 명령이 비밀번호 없이 실행된다면 GitLab CI/CD 자동 배포 환경 구성이 성공적으로 완료된 것입니다.