Gitaly TLS 지원

Gitaly는 TLS 암호화를 지원합니다. 안전한 연결을 위해 gitaly_address의 해당 리포지터리 항목에서 tls:// URL scheme을 사용하여 Gitaly 인스턴스와 통신할 수 있습니다.

Gitaly는 TLS 연결에서 서버 인증서를 동시에 클라이언트 인증서로 제공합니다. 이는 클라이언트 인증서를 유효성 검사하여 GitLab 접근을 승인하는 역방향 프록시(예: NGINX)와 결합하여 상호 TLS 인증 전략의 일부로 사용될 수 있습니다.

이 기능은 자동으로 제공되지 않으므로 별도의 인증서를 제공해야 합니다. 각 Gitaly 서버에 해당하는 인증서를 해당 Gitaly 서버에 설치해야 합니다.

게다가 해당 인증서(또는 해당 인증서 기관)를 다음에 설치해야 합니다:

  • Gitaly 서버
  • 해당 인증서와 통신하는 Gitaly 클라이언트

로드 밸런서를 사용하는 경우 ALPN TLS 확장을 사용하여 HTTP/2를 협상할 수 있어야 합니다.

인증서 요구 사항

  • 인증서는 Gitaly 서버에 액세스하는 데 사용하는 주소를 지정해야 합니다. 인증서에 호스트 이름 또는 IP 주소를 Subject Alternative Name으로 추가해야 합니다.
  • Gitaly 서버는 암호화되지 않은 수신 주소 listen_addr와 동시에 암호화된 수신 주소 tls_listen_addr로 구성할 수 있습니다. 이렇게 하면 필요에 따라 암호화되지 않은 트래픽에서 순차적으로 암호화된 트래픽으로 전환할 수 있습니다.
  • 인증서의 공통 이름 필드는 무시됩니다.

TLS로 Gitaly 구성

TLS 지원을 구성하기 전에 Gitaly를 구성합니다.

TLS 지원을 구성하는 절차는 설치 유형에 따라 다릅니다.

Linux 패키지 (Omnibus)
  1. Gitaly 서버용 인증서를 생성합니다.
  2. Gitaly 클라이언트에서 인증서(또는 해당 인증서 기관)을 /etc/gitlab/trusted-certs로 복사합니다:

    sudo cp cert.pem /etc/gitlab/trusted-certs/
    
  3. Gitaly 클라이언트에서 /etc/gitlab/gitlab.rbgit_data_dirs를 다음과 같이 편집합니다:

    git_data_dirs({
      'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
    })
    
  4. 파일을 저장하고 GitLab을 다시 구성합니다.
  5. Gitaly 서버에서 /etc/gitlab/ssl 디렉터리를 생성하고 키 및 인증서를 복사합니다:

    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 key.pem cert.pem
    
  6. 모든 Gitaly 서버 및 클라이언트에서 모든 Gitaly 서버 인증서(또는 해당 인증서 기관)를 /etc/gitlab/trusted-certs로 복사하여 서로 또는 다른 Gitaly 서버로의 호출 시 Gitaly 서버와 클라이언트가 해당 인증서를 신뢰하도록 합니다:

    sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
    
  7. /etc/gitlab/gitlab.rb을 편집하고 다음을 추가합니다:

    gitaly['configuration'] = {
       # ...
       tls_listen_addr: '0.0.0.0:9999',
       tls: {
         certificate_path: '/etc/gitlab/ssl/cert.pem',
         key_path: '/etc/gitlab/ssl/key.pem',
       },
    }
    
  8. 파일을 저장하고 GitLab을 다시 구성합니다.
  9. Gitaly 클라이언트(예: Rails 응용 프로그램)에서 sudo gitlab-rake gitlab:gitaly:check를 실행하여 Gitaly 서버에 연결할 수 있는지 확인합니다.
  10. Gitaly 연결 유형을 확인하여 Gitaly 트래픽이 TLS를 통해 제공되는지 확인합니다.
  11. 선택 사항. 다음을 수행하여 보안을 강화합니다:
    1. /etc/gitlab/gitlab.rbgitaly['configuration'][:listen_addr]을 주석 처리하거나 삭제하여 비-TLS 연결을 비활성화합니다.
    2. 파일을 저장합니다.
    3. GitLab을 다시 구성합니다.
직접 컴파일한 경우 (소스)
  1. Gitaly 서버용 인증서를 생성합니다.
  2. Gitaly 클라이언트에서 인증서를 시스템 신뢰 인증서로 복사합니다:

    sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
    sudo update-ca-certificates
    
  3. Gitaly 클라이언트에서 /home/git/gitlab/config/gitlab.ymlstorages를 다음과 같이 편집합니다:

    gitlab:
      repositories:
        storages:
          default:
            gitaly_address: tls://gitaly1.internal:9999
            path: /some/local/path
          storage1:
            gitaly_address: tls://gitaly1.internal:9999
            path: /some/local/path
          storage2:
            gitaly_address: tls://gitaly2.internal:9999
            path: /some/local/path
    
    note
    /some/local/path는 존재하는 로컬 폴더로 설정되어야 하지만 이 폴더에는 데이터가 저장되지 않습니다. 이 요구 사항은 Gitaly 이슈 #1282가 해결될 때까지 제거 예정입니다.
  4. 파일을 저장하고 GitLab을 다시 시작합니다.
  5. Gitaly 서버에서 /etc/default/gitlab을 생성하거나 편집하고 다음을 추가합니다:

    export SSL_CERT_DIR=/etc/gitlab/ssl
    
  6. Gitaly 서버에서 /etc/gitlab/ssl 디렉터리를 생성하고 키와 인증서를 복사합니다:

    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 key.pem cert.pem
    
  7. 모든 Gitaly 서버에 인증서(또는 해당 인증서 기관)를 시스템 신뢰 인증서 폴더로 복사하여 Gitaly 서버가 자체 또는 다른 Gitaly 서버로의 호출 시 해당 인증서를 신뢰하도록 합니다.

    sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
    sudo update-ca-certificates
    
  8. /home/git/gitaly/config.toml을 편집하고 다음을 추가합니다:

    tls_listen_addr = '0.0.0.0:9999'
       
    [tls]
    certificate_path = '/etc/gitlab/ssl/cert.pem'
    key_path = '/etc/gitlab/ssl/key.pem'
    
  9. 파일을 저장하고 GitLab을 다시 시작합니다.
  10. Gitaly 연결 유형을 확인하여 Gitaly 트래픽이 TLS를 통해 제공되는지 확인합니다.
  11. 선택 사항. 다음을 수행하여 보안을 강화합니다:
    1. /home/git/gitaly/config.tomllisten_addr를 주석 처리하거나 삭제하여 비-TLS 연결을 비활성화합니다.
    2. 파일을 저장합니다.
    3. GitLab을 다시 시작합니다.

인증서 업데이트

최초 구성 후 Gitaly 인증서를 업데이트하려면:

Linux 패키지 (Omnibus)

‘/etc/gitlab/ssl’ 디렉터리에 있는 SSL 인증서의 내용이 업데이트되었지만 ‘/etc/gitlab/gitlab.rb’에 구성 변경이 없다면 GitLab을 재구성해도 Gitaly에 영향을 주지 않습니다. 대신, Gitaly가 인증서를 로드하려면 Gitaly를 매뉴얼으로 다시 시작해야 합니다:

sudo gitlab-ctl restart gitaly

‘/etc/gitlab/trusted-certs’에서 인증서를 변경하거나 업데이트하고 ‘/etc/gitlab/gitlab.rb’ 파일을 변경하지 않았다면 다음을 수행해야 합니다:

  1. 신뢰할 수 있는 인증서에 대한 심볼릭 링크가 업데이트되도록 GitLab을 다시 구성합니다.
  2. 인증서를 로드하려면 Gitaly를 매뉴얼으로 다시 시작하세요:

    sudo gitlab-ctl restart gitaly
    
Self-compiled (소스)

‘/etc/gitlab/ssl’ 디렉터리에 있는 SSL 인증서의 내용이 업데이트되었다면 인증서가 Gitaly 프로세스에 의해 로드되기 위해 GitLab을 다시 시작해야 합니다.

‘/usr/local/share/ca-certificates’에서 인증서를 변경하거나 업데이트했다면 다음을 수행해야 합니다:

  1. 시스템의 신뢰할 수 있는 리포지터리를 업데이트하려면 sudo update-ca-certificates를 실행합니다.
  2. 인증서를 로드하려면 Gitaly를 매뉴얼으로 다시 시작하세요:

    GitLab을 다시 시작

Gitaly 연결 유형 확인

서비스되는 Gitaly 연결 유형을 확인하려면 관련 문서를 참조하세요.