GitLabチャートのシークレットを設定する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
GitLabが動作するには、さまざまなシークレットが必要です:
GitLabコンポーネント:
- レジストリ認証証明書
- GitLab Shell用のSSHホストキーと証明書
- 個々のGitLabサービス用パスワード
- GitLab Pages用TLS証明書
オプションの外部サービス:
- SMTPサーバー
- LDAP
- OmniAuth
- 受信メール用IMAP (mail_roomサービス経由)
- サービスデスクメール用IMAP (mail_roomサービス経由)
- 受信メール用Microsoft Graph with OAuth2 (mail_roomサービス経由)
- サービスデスクメール用Microsoft Graph with OAuth2 (mail_roomサービス経由)
- 送信メール用Microsoft Graph with OAuth2
- S/MIME証明書
- スマートカード認証
- OAuthインテグレーション
手動で提供されなかったシークレットは、ランダムな値で自動的に生成されます。HTTPS証明書の自動生成はLet’s Encryptによって提供されます。
自動生成されたシークレットを利用するには、次のステップに進んでください。
独自のシークレットを指定するには、手動シークレット作成に進んでください。
手動シークレット作成 (オプション)
このドキュメントの以前のステップに従った場合は、gitlabをリリース名として使用してください。
レジストリ認証証明書
GitLabとレジストリ間の通信は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これらの証明書を含むシークレットを作成します。<name>-registry-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このシークレットはglobal.registry.certificate.secret設定で参照されます。
レジストリの機密通知ヘッダー
詳細については、レジストリ通知の設定に関するドキュメントを確認してください。
シークレットの内容は、単一の項目であっても項目リストである必要があります。内容が単なる文字列の場合、チャートは必要に応じてリストに変換WILL NOT。
値RandomFooBarを持つregistry-authorization-headerシークレットが作成される例を考えてみましょう。
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 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クライアントにhostname mismatchエラーが表示されます。
初期Enterpriseライセンス
GitLabインスタンスのEnterpriseライセンスを保存するためのKubernetesシークレットを作成します。<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オプションを使用して、ライセンスシークレット内のライセンスを指すデフォルトのlicenseキーを変更することもできます。
初期rootパスワード
初期rootパスワードを保存するための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-f0-9' | head -c 128)
otp_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-f0-9' | head -c 128)
db_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-f0-9' | head -c 128)
encrypted_settings_key_base: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-f0-9' | head -c 128)
openid_connect_signing_key: |
$(openssl genrsa 2048 | awk '{print " " $0}')
active_record_encryption_primary_key:
- $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32)
active_record_encryption_deterministic_key:
- $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32)
active_record_encryption_key_derivation_salt: $(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32)
EOF
kubectl create secret generic <name>-rails-secret --from-file=secrets.ymlこのシークレットはglobal.railsSecrets.secret設定で参照されます。
このシークレットにはデータベース暗号化キーが含まれているため、ローテーションすることはお勧めしません。シークレットがローテーションされた場合、その結果はシークレットファイルが失われた場合と同じ動作を示します。
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設定で参照されます。
GitLabKASシークレット
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.secret設定で参照されます。
GitLabKASAPIシークレット
チャートにシークレットを自動生成させることも、手動でこのシークレットを作成することもできます (<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)このシークレットはgitlab.kas.privateApi.secret設定で参照されます。
GitLabKAS WebSocketトークンシークレット
チャートにシークレットを自動生成させることも、手動でこのシークレットを作成することもできます (<name>をリリース名に置き換えてください):
kubectl create secret generic <name>-kas-websocket-token --from-literal=kas_websocket_token_secret=$(head -c 72 /dev/urandom | base64 -w0)このシークレットはgitlab.kas.websocketToken.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パスワードの変更
バンドルされているPostgreSQLサブチャートは、データベースが最初に作成されるときにのみ、シークレットからのパスワードでデータベースを設定します。既存のデータベースのパスワードを変更するには、追加の手順を実行する必要があります。
変更中はユーザーに影響が出る可能性があることに注意してください。
PostgreSQLシークレットをローテーションするには:
PostgreSQLシークレットの一般的なシークレットのローテーション手順を完了してください。
PostgreSQLポッドにexecして、データベース内のパスワードを更新します:
# 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)' ; ALTER USER registry WITH PASSWORD '$(echo $REGISTRY_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注: レジストリユーザーのパスワード更新は、レジストリメタデータデータベース機能が有効になっている場合にのみ必要です。レジストリユーザーが存在しない場合、
ALTER USER registryコマンドはエラーを生成しますが、他のパスワード更新には影響しません。gitlab-exporter、postgresql、toolbox、sidekiq、webservice、およびregistryのポッドをkubectl delete podコマンドを使用して削除し、新しいポッドに新しいシークレットを読み込むことで、データベースに接続できるようにします。
GitLab Pagesシークレット
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設定で参照されます。
レジストリHTTPシークレット
すべてのレジストリポッドで共有されるランダムな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設定で参照されます。
レジストリ通知シークレット
すべてのレジストリポッドとGitLabウェブサービスポッドで共有されるランダムな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パスワード
ランダムな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プロバイダーの使用を有効にするには、Globalsチャート内の指示に従ってください。
LDAPパスワード
LDAPサーバーに接続するためにパスワード認証が必要な場合は、パスワードをKubernetesシークレットに保存する必要があります。
kubectl create secret generic ldap-main-password --from-literal=password=yourpasswordhere次に、--set global.appConfig.ldap.servers.main.password.secret=ldap-main-passwordを使用してパスワードを設定に注入します。
SMTPパスワード
認証が必要なSMTPサーバーを使用している場合は、パスワードをKubernetesシークレットに保存します。
kubectl create secret generic smtp-password --from-literal=password=yourpasswordhere次に、--set global.smtp.password.secret=smtp-passwordをHelmコマンドで使用します。
受信メール用IMAPパスワード
GitLabは、受信メールにアクセスするために、アプリパスワード、トークン、IMAPパスワードなどの認証文字列を使用します。
GitLab受信メールドキュメントでメールプロバイダーを見つけて、必要な認証文字列をKubernetesシークレットとして設定します。
kubectl create secret generic incoming-email-password --from-literal="password=auth_string_for_your_provider_here"次に、--set global.appConfig.incomingEmail.password.secret=incoming-email-passwordをHelmコマンドで、ドキュメントで指定されている他の必要な設定とともに使用します。
サービスデスクメール用IMAPパスワード
GitLabは、サービスデスクメールにアクセスするために、アプリパスワード、トークン、IMAPパスワードなどの認証文字列を使用します。
GitLab受信メールドキュメントでメールプロバイダーを見つけて、必要な認証文字列をKubernetesシークレットとして設定します。
kubectl create secret generic service-desk-email-password --from-literal="password=auth_string_for_your_provider_here"次に、--set global.appConfig.serviceDeskEmail.password.secret=service-desk-email-passwordをHelmコマンドで、ドキュメントで指定されている他の必要な設定とともに使用します。
GitLab受信メール認証トークン
受信メールがWebhook配信方法を使用するように設定されている場合、mail_roomサービスとウェブサービス間で共有シークレットが必要です。これは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設定で参照されます。
GitLabサービスデスクメール認証トークン
サービスデスクメールがWebhook配信方法を使用するように設定されている場合、mail_roomサービスとウェブサービス間で共有シークレットが必要です。これは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設定で参照されます。
Zoektインデクサー内部APIシークレット
GitLab-Zoektサブチャートがインストールされている場合、ZoektインデクサーはJWTを使用してGitLab内部APIに認証するします。デフォルトでは、このシークレットは自動生成されたGitLab Shellシークレットを再利用します。
Zoekt用に別のシークレットを使用したい場合は、手動で作成できます (<name>をリリース名に置き換えてください):
kubectl create secret generic <name>-zoekt-internal-api --from-literal=secret=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 64)次に、チャートを設定して使用します:
--set global.zoekt.indexer.internalApi.secretName=<name>-zoekt-internal-api \
--set global.zoekt.indexer.internalApi.secretKey=secret指定されていない場合、global.zoekt.indexer.internalApi.secretNameはGitLab Shell認証トークンシークレット (global.shell.authToken.secret) にデフォルト設定されます。
受信メール用Microsoft Graphクライアントシークレット
GitLabが受信メールにアクセスできるように、IMAPアカウントのパスワードをKubernetesシークレットに保存します:
kubectl create secret generic incoming-email-client-secret --from-literal=secret=your-secret-here次に、--set global.appConfig.incomingEmail.clientSecret.secret=incoming-email-client-secretをHelmコマンドで、ドキュメントで指定されている他の必要な設定とともに使用します。
サービスデスクメール用Microsoft Graphクライアントシークレット
GitLabがサービスデスクメールにアクセスできるように、IMAPアカウントのパスワードをKubernetesシークレットに保存します:
kubectl create secret generic service-desk-email-client-secret --from-literal=secret=your-secret-here次に、--set global.appConfig.serviceDeskEmail.clientSecret.secret=service-desk-email-client-secretをHelmコマンドで、ドキュメントで指定されている他の必要な設定とともに使用します。
送信メール用Microsoft Graphクライアントシークレット
パスワードをKubernetesシークレットに保存します:
kubectl create secret generic microsoft-graph-mailer-client-secret --from-literal=secret=your-secret-here次に、--set global.appConfig.microsoft_graph_mailer.client_secret.secret=microsoft-graph-mailer-client-secretをHelmコマンドで使用します。
S/MIME証明書
送信メールメッセージは、S/MIME標準を使用してデジタル署名できます。S/MIME証明書は、TLSタイプのKubernetesシークレットとして保存する必要があります。
kubectl create secret tls smime-certificate --key=file.key --cert file.crt不透明なタイプとして既存のシークレットがある場合は、特定のシークレットに合わせてglobal.email.smime.keyNameとglobal.email.smime.certNameの値を調整する必要があります。
S/MIME設定は、values.yamlファイルまたはコマンドラインで設定できます。S/MIMEを有効にするには--set global.email.smime.enabled=trueを使用し、S/MIME証明書を含むシークレットを指定するには--set global.email.smime.secretName=smime-certificateを使用します。
スマートカード認証
スマートカード認証は、カスタム認証局 (CA) を使用してクライアント証明書に署名します。このカスタムCAの証明書は、クライアント証明書が有効かどうかを検証するために、ウェブサービスポッドに注入する必要があります。これはK8sシークレットとして提供されます。
kubectl create secret generic <secret name> --from-file=ca.crt=<path to CA certificate>証明書が保存されているシークレット内のキー名はca.crtでなければなりません。
OAuthインテグレーション
GitLab PagesのようなさまざまなサービスのOAuthインテグレーションを設定するには、OAuth認証情報を含むシークレットが必要です。シークレットには、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設定を使用して指定できます。appidとappsecret以外のキーが使用されている場合は、global.oauth.<service name>.appIdKeyとglobal.oauth.<service name>.appSecretKey設定を使用して指定できます。
次の手順
すべてのシークレットが生成され保存されたら、GitLabをデプロイできます。
シークレットのローテーション
シークレットは、セキュリティ上の目的で必要な場合にローテーションできます。
- 現在のシークレットをバックアップします。
- 便宜上、ローテーションしたい各シークレットの手動シークレット作成手順に従って、
-v2(例:gitlab-shell-host-keys-v2) がサフィックスとして付加された新しいシークレットを作成してください。 values.yamlファイル内のシークレットキーを更新して、新しいシークレット名を指すようにします。ほとんどのシークレット名は、手動シークレット作成セクションの各シークレットの下にドキュメント化されています。- 更新された
values.yamlファイルでGitLabチャートリリースをアップグレードします。 - PostgreSQLシークレットをローテーションする場合は、ローテーションを完了するための追加手順があります。
- GitLabが期待どおりに動作していることを確認します。そうなった場合、古いシークレットを削除しても安全です。