-
手动创建 secret(可选)
- Registry 认证证书
- Registry 敏感通知 headers
- SSH 主机密钥
- 初始许可证
- 初始 root 密码
- Redis 密码
- GitLab Shell secret
- Gitaly secret
- Praefect secret
- GitLab Rails secret
- GitLab Workhorse secret
- GitLab Runner secret
- GitLab KAS secret
- GitLab KAS API secret
- GitLab Suggested Reviewers secret
- MinIO secret
- PostgreSQL 密码
- GitLab Pages secret
- Registry HTTP secret
- Registry notification secret
- Praefect DB 密码
- 外部服务
- 下一步
- 轮换 secrets
为极狐GitLab chart 配置 secret
极狐GitLab 需要多种 secret 才能运作:
GitLab 组件:
- Registry 认证证书
- GitLab Shell 的 SSH 主机密钥和证书
- 单个 GitLab services 的密码
- GitLab Pages 的 TLS 证书
可选外部服务:
- SMTP 服务
- LDAP
- OmniAuth
- 用于接收电子邮件的 IMAP(通过 mail_room 服务)
- 用于服务台电子邮件的 IMAP(通过 mail_room 服务)
- 用于接收电子邮件的带有 OAuth2 的 Microsoft Graph(通过 mail_room 服务)
- 带有 OAuth2 的 Microsoft Graph 用于服务台电子邮件(通过 mail_room 服务)
- 带有 OAuth2 的 Microsoft Graph 用于外发电子邮件
- S/MIME 认证
- Smartcard 身份验证
- OAuth 集成
任何未手动提供的 secret 都将使用随机值自动生成。HTTPS 证书的自动生成由 Let’s Encrypt 提供。
要利用自动生成的 secret,请继续下一步。
要指定您自己的 secret,请继续手动创建 secret。
手动创建 secret(可选)
如果您按照本文档中的先前步骤操作,请使用 gitlab
作为版本名称。
Registry 认证证书
极狐GitLab 和 Registry 之间的通信发生在 Ingress 之后,因此在大多数情况下使用自签名证书进行通信即可。如果此流量通过网络公开,您应该生成公开有效的证书。
在下面的示例中,我们假设我们需要自签名证书。
生成证书密钥对:
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
创建一个包含这些证书的 secret。
我们将在 <name>-registry-secret
secret 中创建 registry-auth.key
和 registry-auth.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
这个 secret 由 global.registry.certificate.secret
设置引用。
Registry 敏感通知 headers
查看有关配置 Registry 通知的文档了解更多详细信息。
Secret 内容应该是一个配置项列表,即使它包含单个配置项。 如果内容只是一个字符串,chart 不会根据需要将其转换为列表。
kubectl create secret generic registry-authorization-header --from-literal=value="[RandomFooBar]"
默认情况下,secret 中使用的密钥是“值”。但是,用户可以使用不同的键,但必须确保在 header 映射项下将其指定为“键”。
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 ""
创建包含这些证书的 secret。将 <name>
替换为发行版的名称。
kubectl create secret generic <name>-gitlab-shell-host-keys --from-file hostKeys
此 secret 由global.shell.hostKeys.secret
设置引用。
如果此密钥被轮换,所有 SSH 客户端都会看到 hostname mismatch
错误。
初始许可证
创建一个 Kubernetes secret,用于存储 GitLab 实例的许可证。
将 <name>
替换为发行版的名称。
kubectl create secret generic <name>-gitlab-license --from-file=license=/tmp/license.gitlab
然后使用 --set global.gitlab.license.secret=<name>-gitlab-license
将许可证注入到您的配置中。
您还可以使用 global.gitlab.license.key
选项更改指向许可证 secret 中的许可证的默认 license
键。
初始 root 密码
创建用于存储初始 root 密码的 Kubernetes secret。密码长度至少应为 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 集群访问密码,不要使用随机生成的密码。
此 secret 由 global.redis.auth.secret
设置引用。
GitLab Shell secret
为 GitLab Shell 生成一个随机的 64 个字符的包含字母和数字的 secret。 将 <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)
此 secret 由global.shell.authToken.secret
设置引用。
Gitaly secret
为 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)
此 secret 由 global.gitaly.authToken.secret
设置引用。
Praefect secret
为 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)
此 secret 由global.praefect.authToken.secret
设置引用。
GitLab Rails secret
将 <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}')
ci_jwt_signing_key: |
$(openssl genrsa 2048 | awk '{print " " $0}')
EOF
kubectl create secret generic <name>-rails-secret --from-file=secrets.yml
此 secret 被global.railsSecrets.secret
设置引用。
不建议轮换此 secret,因为它包含数据库加密密钥。如果 secret 被轮换,结果将与密钥文件丢失时表现相同。
encrypted_settings_key_base
是在 13.7
版本中添加的,并且在 14.0
版本中是必需的。GitLab Workhorse secret
生成 Workhorse secret。必须有 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)
此 secret 由 global.workhorse.secret
设置引用。
GitLab Runner secret
将 <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)
此 secret 由 gitlab-runner.runners.secret
设置引用。
GitLab KAS secret
GitLab Rails 要求存在 KAS 的 secret,即使是在未安装 KAS 子 chart 的情况下部署此 chart 时也是如此。不过,您可以按照以下过程手动创建此 secret,或将其留给 chart 以自动生成 secret。
将 <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)
此 secret 由 global.appConfig.gitlab_kas.key
设置引用。
GitLab KAS API secret
您可以使 chart 自动生成密钥,也可以手动创建此密钥(将 <name>
替换为版本名称):
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)
此 secret 由 gitlab.kas.privateApi.secret
设置引用。
GitLab Suggested Reviewers secret
极狐GitLab Rails 要求存在建议审核者的 secret。您可以将其留给 chart 来自动生成 secret,也可以手动创建此 secret(将 <name>
替换为发布名称):
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)
此 secret 由 global.appConfig.suggested_reviewers.secret
设置引用。
MinIO secret
为 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)
此 secret 由 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)
此 secret 由 global.psql.password.secret
设置引用。
更改捆绑的 PostgreSQL 子 chart 的 PostgreSQL 密码
捆绑的 PostgreSQL 子 chart 仅在最初创建数据库时使用来自 secret 的密码配置数据库。需要采取额外的步骤来更改现有数据库中的密码。
请注意,在进行更改时,此操作将对用户造成干扰。
要轮换 PostgreSQL 密钥:
- 完成 PostgreSQL secret 的通用轮换 secret 说明。
-
进入 PostgreSQL pod 并更新数据库中的密码:
# Exec into the PostgreSQL pod kubectl exec -it <name>-postgresql-0 -- sh # Inside the pod, update the passwords in the database 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
- 使用
kubectl delete pod
命令删除gitlab-exporter
、postgresql
、toolbox
、sidekiq
和webservice
pod,以便新的 pods 加载新的密码并允许它们连接到数据库。
GitLab Pages secret
生成 GitLab Pages secret。必须有 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)
此 secret 由 global.pages.apiSecret.secret
设置引用。
Registry HTTP secret
生成所有 Registry 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)
此 secret 由 global.registry.httpSecret.secret
设置引用。
Registry notification secret
生成由所有 Registry pod 和 GitLab webservice 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)\"]
此 secret 由 global.registry.notificationSecret.secret
设置引用。
Praefect DB 密码
生成一个随机的 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) \
此 secret 由 global.praefect.dbSecret
设置引用。
外部服务
一些 chart 有更多的 secret 来启用无法自动生成的功能。
OmniAuth
为了使 OmniAuth Providers 与已部署的极狐GitLab 一起使用,请按照全局 chart 中的说明
LDAP 密码
如果您需要密码认证来连接您的 LDAP 服务器,您必须将密码存储在 Kubernetes secret 中。
kubectl create secret generic ldap-main-password --from-literal=password=yourpasswordhere
然后使用 --set global.appConfig.ldap.servers.main.password.secret=ldap-main-password
将密码注入到您的配置中。
Secret
名称,而不是实际密码。SMTP 密码
如果您使用的是需要身份验证的 SMTP 服务器,请将密码存储在 Kubernetes secret中。
kubectl create secret generic smtp-password --from-literal=password=yourpasswordhere
然后在你的 Helm 命令中使用 --set global.smtp.password.secret=smtp-password
。
Secret
名称,而不是实际密码。接收电子邮件的 IMAP 密码
极狐GitLab 使用应用程序密码、令牌或 IMAP 密码等身份验证字符串来访问传入电子邮件。
在极狐GitLab 接收电子邮件文档中找到您的电子邮件提供商,并将其所需的身份验证字符串设置为 Kubernetes secret。
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
以及在文档中指定的其它必需设置。
Secret
名称,而不是实际密码。服务台电子邮件的 IMAP 密码
极狐GitLab 使用身份验证字符串(例如应用程序密码、令牌或 IMAP 密码)来访问服务台电子邮件。
在极狐GitLab 接收电子邮件文档中找到您的电子邮件提供商并将其所需的身份验证字符串设置为 Kubernetes secret。
kubectl create secret generic service-desk-email-password --from-literal="password=auth_string_for_your_provider_here"
然后在 Helm 命令中使用 --set global.appConfig.serviceDeskEmail.password.secret=service-desk-email-password
以及文档中指定的其它必需设置。
Secret
名称,而不是实际密码。接收电子邮件身份验证令牌
当接收电子邮件配置为使用 webhook 传递方法时,mail_room 服务和 web 服务之间应该有一个共享密钥,其必须具有 32 个字符的长度和 base64 编码。将 <name>
替换为发布版本的名称。
kubectl create secret generic <name>-incoming-email-auth-token --from-literal=authToken=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)
global.incomingEmail.authToken
设置引用了此 secret。
服务台电子邮件身份验证令牌
当服务台电子邮件配置为使用 webhook 传递方法时,mail_room 服务和 web 服务之间应该有一个共享密钥,其必须具有 32 个字符的长度和 base64 编码。将 <name>
替换为发布版本的名称。
kubectl create secret generic <name>-service-desk-email-auth-token --from-literal=authToken=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)
global.serviceDeskEmail.authToken
设置引用了此 secret。
Zoekt 基础验证密码
您可以让 chart 自动生成 secret,也可以手动创建 secret(将 <name>
替换为版本名称):
password=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)
kubectl create secret generic <name>-zoekt-basicauth --from-literal=gitlab_username=gitlab --from-literal=gitlab_password="$password"
此 secret 由 gitlab.zoekt.gateway.basicAuth.secretName
设置引用。
接收电子邮件的 Microsoft Graph 客户端 secret
让极狐GitLab 可以访问接收电子邮件,将 IMAP 账户的密码存储在 Kubernetes secret 中。
kubectl create secret generic incoming-email-client-secret --from-literal=secret=your-secret-here
然后,在 Helm 命令中使用 --set global.appConfig.incomingEmail.clientSecret.secret=incoming-email-client-secret
以及文档中指定的其它必需设置.
Secret
名称,而不是实际密码。服务台电子邮件的 Microsoft Graph 客户端 secret
为了让极狐GitLab 可以访问服务台电子邮件,将 IMAP 账户的密码存储在 Kubernetes secret 中。
kubectl create secret generic service-desk-email-client-secret --from-literal=secret=your-secret-here
然后在 Helm 命令中使用 --set global.appConfig.serviceDeskEmail.password.secret=service-desk-email-password
以及文档中指定的其它必需设置。
Secret
名称,而不是实际密码。S/MIME 证书
外发电子邮件可以使用 S/MIME 标准进行数字签名。 S/MIME 证书需要作为 TLS 类型的 secret 存储在 Kubernetes secret 中。
kubectl create secret tls smime-certificate --key=file.key --cert file.crt
如果存在 opaque 类型的现有 secret,则需要针对特定 secret 调整 global.email.smime.keyName
和 global.email.smime.certName
值。
S/MIME 设置可以通过 values.yaml
文件或在命令行上进行设置。使用 --set global.email.smime.enabled=true
启用 S/MIME,使用 --set global.email.smime.secretName=smime-certificate
指定包含 S/MIME 证书的 secret。
Smartcard 验证
Smartcard 验证使用自定义证书颁发机构 (CA) 签署客户端证书。这个自定义 CA 的证书需要注入到 Webservice pod 中,以便它验证客户端证书是否有效。这是作为 k8s secret 提供的。
kubectl create secret generic <secret name> --from-file=ca.crt=<path to CA certificate>
存储证书的 secret 中的键名称必须是 ca.crt
。
OAuth 集成
要配置各种服务的 OAuth 集成,例如 GitLab Pages,需要包含 OAuth 凭据的 secret。Secret 应该包含一个 App ID(默认情况下,存储在 appid
键下)和一个 App Secret(默认情况下,存储在 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
设置来指定此 secret。如果使用除 appid
和 appsecret
以外的键,则可以使用 global.oauth.<service name>.appIdKey
和 global.oauth.<service name>.appSecretKey
设置来指定它们。
下一步
生成并存储所有 secret 后,您可以继续部署极狐GitLab。
轮换 secrets
如果出于安全目的需要,可以轮换 secrets。
- 备份您当前的 secrets。
- 为方便起见,请按照手动创建 secret 步骤,为您希望轮换的每个 secret,创建以
-v2
为后缀的新 secret(例如gitlab-shell-host-keys-v2
)。 - 更新
values.yaml
文件中的密钥指向新的密钥名称。大多数 secret 名称都记录在手动创建 secret 部分。 - 使用更新的
values.yaml
文件升级极狐GitLab Chart 版本。 - 如果您要轮换 PostgreSQL 密钥,还需要其他步骤。
- 确认极狐GitLab 正在按预期工作。如果是,删除旧 secrets 应该是安全的。