GitLab 차트용 Secrets 구성

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab 운영에는 다양한 시크릿이 필요합니다:

GitLab 구성요소:

  • 레지스트리 인증서
  • GitLab Shell을 위한 SSH 호스트 키 및 인증서
  • 개별 GitLab 서비스용 암호
  • GitLab Pages용 TLS 인증서

선택적 외부 서비스:

  • SMTP 서버
  • LDAP
  • OmniAuth
  • 수신 이메일용 IMAP (mail_room 서비스를 통해)
  • 서비스 데스크 이메일용 IMAP (mail_room 서비스를 통해)
  • 수신 이메일용 Microsoft Graph 및 OAuth2 (mail_room 서비스를 통해)
  • 서비스 데스크 이메일용 Microsoft Graph 및 OAuth2 (mail_room 서비스를 통해)
  • 발신 이메일용 Microsoft Graph 및 OAuth2
  • S/MIME 인증서
  • 스마트 카드 인증
  • OAuth 통합

매뉴얼으로 제공되지 않는 시크릿은 자동으로 무작위 값으로 생성됩니다. HTTPS 인증서의 자동 생성은 Let’s Encrypt에서 제공됩니다.

자동으로 생성된 시크릿을 사용하려면 다음 단계로 진행하세요.

자체 시크릿을 지정하려면 매뉴얼 시크릿 생성으로 계속 진행하세요.

매뉴얼 시크릿 생성 (선택 사항)

이 설명서의 이전 단계를 따라왔다면 배포 이름으로 gitlab을 사용하세요.

레지스트리 인증서

GitLab과 레지스트리 간의 통신은 인그레스 뒤에서 이루어지므로 대부분의 경우 이 통신을 위해 자체 서명된 인증서를 사용하는 것이 충분합니다. 이 트래픽이 네트워크를 통해 노출된 경우 공개적으로 유효한 인증서를 생성해야 합니다.

아래 예시에서는 자체 서명된 인증서가 필요하다고 가정합니다.

인증서-키파일 쌍을 생성하세요:

mkdir -p certs
openssl req -new -newkey rsa:4096 -subj "/CN=gitlab-issuer" -nodes -x509 -keyout certs/registry-example-com.key -out certs/registry-example-com.crt

이러한 인증서를 포함하는 시크릿을 생성하세요. <name>을 릴리스의 이름으로 대체하세요.

kubectl create secret generic <name>-registry-secret --from-file=registry-auth.key=certs/registry-example-com.key --from-file=registry-auth.crt=certs/registry-example-com.crt

이 시크릿은 global.registry.certificate.secret 설정에서 참조됩니다.

레지스트리 민감한 알림 헤더

레지스트리 알림 구성에 대한 문서에서 자세한 내용을 확인하세요.

시크릿 내용은 하나의 항목이라도 디렉터리이어야 합니다. 항목이 단일 항목이더라도 차트는 필요한 대로 그것을 디렉터리으로 변환하지 않습니다.

registry-authorization-header 시크릿에 값으로 RandomFooBar를 갖는 예시를 살펴봅니다.

kubectl create secret generic registry-authorization-header --from-literal=value="[RandomFooBar]"

기본적으로 시크릿 내에서 사용되는 키는 “value”입니다. 하지만 사용자는 다른 키를 사용할 수 있지만, 해당 키가 헤더 맵 항목 아래 key로 지정되어야 합니다.

SSH 호스트 키

OpenSSH 인증서-키 쌍을 생성하세요:

mkdir -p hostKeys
ssh-keygen -t rsa  -f hostKeys/ssh_host_rsa_key -N ""
ssh-keygen -t dsa  -f hostKeys/ssh_host_dsa_key -N ""
ssh-keygen -t ecdsa  -f hostKeys/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519  -f hostKeys/ssh_host_ed25519_key -N ""

이러한 인증서를 포함하는 시크릿을 생성하세요. <name>을 릴리스의 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-shell-host-keys --from-file hostKeys

이 시크릿은 global.shell.hostKeys.secret 설정에서 참조됩니다.

이 시크릿이 로테이션되면 모든 SSH 클라이언트가 호스트 이름 불일치 오류를 보게 됩니다.

초기 엔터프라이즈 라이선스

caution
이 방법은 설치 시간에만 라이선스를 추가합니다. 라이선스를 갱신하거나 업그레이드하려면 웹 사용자 인터페이스의 관리 영역을 사용하세요.

GitLab 인스턴스에 대한 엔터프라이즈 라이선스를 저장하는 Kubernetes 시크릿을 생성하세요. <name>을 릴리스의 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-license --from-file=license=/tmp/license.gitlab

그런 다음 --set global.gitlab.license.secret=<name>-gitlab-license을 사용하여 라이선스를 구성에 삽입하세요.

라이선스 시크릿의 기본 license 키를 가리키는 것을 변경하려면 global.gitlab.license.key 옵션을 사용할 수 있습니다.

초기 루트 암호

초기 루트 암호를 저장하기 위한 Kubernetes 시크릿을 생성하세요. 암호는 최소 6자 이상이어야 합니다. <name>을 릴리스의 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-initial-root-password --from-literal=password=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32)

Redis 암호

Redis를 위한 무작위 64자 알파벳-숫자 조합 암호를 생성하세요. <name>을 릴리스의 이름으로 대체하세요.

kubectl create secret generic <name>-redis-secret --from-literal=secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이미 존재하는 Redis 클러스터로 배포할 경우, 무작위로 생성된 암호 대신에 base64로 인코딩된 Redis 클러스터 액세스 암호를 사용하세요.

이 시크릿은 global.redis.auth.secret 설정에서 참조됩니다.

GitLab Shell 시크릿

GitLab Shell을 위해 무작위 64자 알파벳-숫자 조합의 시크릿을 생성합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-shell-secret --from-literal=secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 global.shell.authToken.secret 설정에서 참조됩니다.

Gitaly 시크릿

Gitaly를 위해 무작위 64자 알파벳-숫자 조합의 토큰을 생성합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-gitaly-secret --from-literal=token=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 global.gitaly.authToken.secret 설정에서 참조됩니다.

Praefect 시크릿

Praefect를 위해 무작위 64자 알파벳-숫자 조합의 토큰을 생성합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-praefect-secret --from-literal=token=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 global.praefect.authToken.secret 설정에서 참조됩니다.

GitLab Rails 시크릿

<name>을 릴리스 이름으로 대체하세요.

cat << EOF > secrets.yml
production:
  secret_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 128)
  otp_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 128)
  db_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 128)
  encrypted_settings_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 128)
  openid_connect_signing_key: |
$(openssl genrsa 2048 | awk '{print "    " $0}')
EOF

kubectl create secret generic <name>-rails-secret --from-file=secrets.yml

이 시크릿은 global.railsSecrets.secret 설정에서 참조됩니다.

이 시크릿은 데이터베이스 암호화 키를 포함하고 있으므로 시크릿을 로테이션하는 것이 권장되지 않습니다. 시크릿을 로테이션하면 시크릿 파일이 손실된 경우과 같은 결과가 발생합니다.

note
encryped_settings_key_base는 GitLab 13.7에 추가되었으며 GitLab 14.0에서 필요합니다.

GitLab Workhorse 시크릿

Workhorse 시크릿을 생성합니다. 이것은 32자여햐 하고 base64로 인코딩되어야 합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-workhorse-secret --from-literal=shared_secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)

이 시크릿은 global.workhorse.secret 설정에서 참조됩니다.

GitLab Runner 시크릿

<name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-runner-secret --from-literal=runner-registration-token=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 gitlab-runner.runners.secret 설정에서 참조됩니다.

GitLab KAS 시크릿

GitLab Rails에서 KAS를 요구합니다. KAS 서브-차트를 설치하지 않은 경우에도 이 시크릿이 필요합니다. 아래 절차를 매뉴얼으로 따르거나 차트가 시크릿을 자동으로 생성하도록 할 수 있습니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-kas-secret --from-literal=kas_shared_secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)

이 시크릿은 global.appConfig.gitlab_kas.key 설정에서 참조됩니다.

GitLab KAS API 시크릿

차트가 시크릿을 자동으로 생성하도록 할 수 있거나 매뉴얼으로 생성할 수 있습니다(이름을 릴리스 이름으로 대체하세요):

kubectl create secret generic <name>-kas-private-api --from-literal=kas_private_api_secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)

이 시크릿은 gitlab.kas.privateApi.secret 설정에서 참조됩니다.

GitLab 제안 리뷰어 시크릿

note
제안 리뷰어 시크릿은 GitLab SaaS에서 자동으로 생성되며 그외의 경우에는 필요하지 않습니다. 이 시크릿은 Self-Managed GitLab 인스턴스에서는 필요하지 않습니다.

GitLab Rails에서 제안 리뷰어를 위한 시크릿이 필요합니다. 차트가 시크릿을 자동으로 생성하도록 할 수 있거나 매뉴얼으로 생성할 수 있습니다(이름을 릴리스 이름으로 대체하세요):

kubectl create secret generic <name>-gitlab-suggested-reviewers --from-literal=suggested_reviewers_secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)

이 시크릿은 global.appConfig.suggested_reviewers.secret 설정에서 참조됩니다.

MinIO 시크릿

MinIO를 위해 무작위의 20자 및 64자 알파벳-숫자 조합의 키를 생성합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-minio-secret --from-literal=accesskey=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 20) --from-literal=secretkey=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 global.minio.credentials.secret 설정에서 참조됩니다.

PostgreSQL 암호

무작위 64자 알파벳-숫자 조합의 암호를 생성합니다. <name>을 릴리스 이름으로 대체하세요.

kubectl create secret generic <name>-postgresql-password \
    --from-literal=postgresql-password=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64) \
    --from-literal=postgresql-postgres-password=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)

이 시크릿은 global.psql.password.secret 설정에서 참조됩니다.

번들된 PostgreSQL 서브차트용 PostgreSQL 암호 변경

caution
기본 Helm 차트 구성은 운영용으로 의도되지 않았습니다. 이는 번들된 PostgreSQL 서브차트도 포함됩니다.

번들된 PostgreSQL 서브차트는 데이터베이스가 처음으로 생성될 때만 시크릿에서 비밀번호로 데이터베이스를 구성합니다. 기존 데이터베이스에서 비밀번호를 변경하려면 추가적인 단계가 필요합니다.

이 작업은 변경이 이루어지는 동안 사용자에게 방해가 될 수 있습니다.

PostgreSQL 시크릿을 로테이션하려면:

  1. PostgreSQL 시크릿에 대한 일반적인 시크릿 로테이션 지침을 완료하세요.
  2. PostgreSQL 파드로 이동하여 데이터베이스에서 비밀번호를 업데이트합니다:
# PostgreSQL 파드로 이동
kubectl exec -it <name>-postgresql-0 -- sh

# 파드 내에서 데이터베이스에서 비밀번호를 업데이트합니다
sed -i 's/^\(local .*\)md5$/\1trust/' /opt/bitnami/postgresql/conf/pg_hba.conf
pg_ctl reload ; sleep 1
echo "ALTER USER postgres WITH PASSWORD '$(echo $POSTGRES_POSTGRES_PASSWORD)' ; ALTER USER gitlab WITH PASSWORD '$(echo POSTGRES_PASSWORD)'" | psql -U postgres -d gitlabhq_production -f -
sed -i 's/^\(local .*\)trust$/\1md5/' /opt/bitnami/postgresql/conf/pg_hba.conf
pg_ctl reload
  1. kubectl delete pod 명령을 사용하여 gitlab-exporter, postgresql, toolbox, sidekiqwebservice 파드를 삭제하여 새로운 시크릿으로 로드된 새 파드를 연결하고 데이터베이스에 연결을 허용합니다.

GitLab Pages secret

GitLab Pages 시크릿 생성. 이 값은 32자여야 하며 base64로 인코딩되어야 합니다. <name>을 릴리즈 이름으로 대체하세요.

kubectl create secret generic <name>-gitlab-pages-secret --from-literal=shared_secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)

이 시크릿은 global.pages.apiSecret.secret 설정에서 참조됩니다.

Registry HTTP secret

모든 레지스트리 pod에서 사용하는 랜덤 64자 알파벳-숫자 조합 키 생성. <name>을 릴리즈 이름으로 대체하세요.

kubectl create secret generic <name>-registry-httpsecret --from-literal=secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64 | base64)

이 시크릿은 global.registry.httpSecret.secret 설정에서 참조됩니다.

Registry notification secret

모든 레지스트리 pod 및 GitLab 웹 서비스 pod에서 사용하는 랜덤 32자 알파벳-숫자 조합 키 생성. <name>을 릴리즈 이름으로 대체하세요.

kubectl create secret generic <name>-registry-notification --from-literal=secret=[\"$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32)\"]

이 시크릿은 global.registry.notificationSecret.secret 설정에서 참조됩니다.

Praefect DB password

랜덤 64자 알파벳-숫자 조합 패스워드 생성. <name>을 릴리즈 이름으로 대체하세요.

kubectl create secret generic <name>-praefect-dbsecret \
    --from-literal=secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64) \

이 시크릿은 global.praefect.dbSecret 설정에서 참조됩니다.

외부 서비스

몇몇 차트는 자동으로 생성할 수 없는 기능을 활성화하기 위한 시크릿이 더 필요합니다.

OmniAuth

배포된 GitLab에서 OmniAuth Providers 사용을 가능하게 하려면 Globals 차트의 지침을 따르세요.

LDAP Password

LDAP 서버에 연결하기 위해 패스워드 인증이 필요한 경우, 패스워드를 Kubernetes 시크릿에 저장해야 합니다.

kubectl create secret generic ldap-main-password --from-literal=password=yourpasswordhere

그런 다음 --set global.appConfig.ldap.servers.main.password.secret=ldap-main-password를 사용하여 구성에 패스워드를 주입하세요.

note
Helm 속성을 구성할 때 _실제 패스워드_가 아닌 시크릿 이름을 사용하세요.

SMTP password

인증이 필요한 SMTP 서버를 사용하는 경우, 패스워드를 Kubernetes 시크릿에 저장하세요.

kubectl create secret generic smtp-password --from-literal=password=yourpasswordhere

그런 다음 Helm 명령어에 --set global.smtp.password.secret=smtp-password를 사용하세요.

note
Helm 속성을 구성할 때 _실제 패스워드_가 아닌 시크릿 이름을 사용하세요.

수신 이메일용 IMAP 패스워드

GitLab은 수신 이메일에 액세스하기 위해 앱 패스워드, 토큰 또는 IMAP 패스워드와 같은 인증 문자열을 사용합니다.

GitLab 수신 이메일 설명서에서 이메일 공급자를 찾고 해당 필요 인증 문자열을 Kubernetes 시크릿으로 설정하세요.

kubectl create secret generic incoming-email-password --from-literal="password=auth_string_for_your_provider_here"

그런 다음 다른 필요한 설정과 함께 Helm 명령어에 --set global.appConfig.incomingEmail.password.secret=incoming-email-password를 사용하세요.

note
Helm 속성을 구성할 때 _실제 패스워드_가 아닌 시크릿 이름을 사용하세요.

Microsoft Graph client secret for outgoing emails

쿠버네티스 시크릿에 암호를 저장합니다:

kubectl create secret generic microsoft-graph-mailer-client-secret --from-literal=secret=your-secret-here

그런 다음, Helm 명령어에서 --set global.appConfig.microsoft_graph_mailer.client_secret.secret=microsoft-graph-mailer-client-secret를 사용하세요.

note
Helm 속성을 구성할 때 _실제 암호_가 아닌 Secret 이름을 사용하세요.

S/MIME Certificate

나가는 이메일 메시지는 S/MIME 표준을 사용하여 디지털로 서명할 수 있습니다. S/MIME 인증서는 TLS 형식의 시크릿으로 쿠버네티스 시크릿에 저장되어야 합니다.

kubectl create secret tls smime-certificate --key=file.key --cert file.crt

만약 기존의 불투명 형식의 시크릿이 있다면, global.email.smime.keyNameglobal.email.smime.certName 값을 해당 시크릿에 맞게 조정해야 합니다.

S/MIME 설정은 values.yaml 파일이나 명령줄을 통해 설정할 수 있습니다. S/MIME을 활성화하려면 --set global.email.smime.enabled=true를 사용하고 S/MIME 인증서를 포함하는 시크릿을 지정하려면 --set global.email.smime.secretName=smime-certificate를 사용하세요.

Smartcard Authentication

Smartcard authentication은 클라이언트 인증서를 서명하기 위해 사용자 정의 인증 기관(CA)를 사용합니다. 이 사용자 정의 CA의 인증서는 Webservice 파드에 삽입되어야 하고 클라이언트 인증서가 유효한지 확인할 수 있습니다. 이는 k8s 시크릿으로 제공됩니다.

kubectl create secret generic <secret name> --from-file=ca.crt=<path to CA certificate>

인증서가 저장된 시크릿 내의 키 이름은 ca.crt여야만 합니다.

OAuth 통합

GitLab Pages와 같은 다양한 서비스의 OAuth 통합을 구성하기 위해 OAuth 자격 증명을 포함하는 시크릿이 필요합니다. 시크릿은 기본적으로 appid 키 아래에 저장된 앱 ID 및 appsecret 키 아래에 저장된 앱 비밀번호를 포함해야 합니다. 이는 알파벳 및 숫자로 이루어진 64자 이상의 문자열이어야 합니다.

kubectl create secret generic oauth-gitlab-pages-secret --from-literal=appid=<app id> --from-literal=appsecret=<app secret>

이 시크릿은 global.oauth.<service name>.secret 설정을 사용하여 지정할 수 있습니다. appidappsecret 이외의 키를 사용하는 경우에는 global.oauth.<service name>.appIdKeyglobal.oauth.<service name>.appSecretKey 설정을 사용할 수 있습니다.

다음 단계

모든 시크릿이 생성되고 저장되면 GitLab을 배포하실 수 있습니다.

시크릿 회전

보안 목적으로 필요한 경우 시크릿을 회전시킬 수 있습니다.

  1. 현재 시크릿을 백업합니다.
  2. 편의를 위해 각 시크릿에 대해 매뉴얼으로 시크릿을 생성하여 -v2로 접미사가 붙은 새로운 시크릿을 만듭니다 (예: gitlab-shell-host-keys-v2).
  3. values.yaml 파일에서 새 시크릿 이름을 가리키도록 시크릿 키를 업데이트합니다. 대부분의 시크릿 이름은 매뉴얼 시크릿 생성 섹션 아래에 문서화되어 있습니다.
  4. 업데이트된 values.yaml 파일로 GitLab 차트 릴리스를 업그레이드합니다.
  5. PostgreSQL 시크릿을 회전하는 경우 회전을 완료하기 위해 추가 단계가 필요합니다.
  6. GitLab이 예상대로 작동하는지 확인하세요. 문제가 없다면 이전 시크릿을 안전하게 삭제할 수 있습니다.