GitLab CI の設定
安全な CI/CD ワークフロー用に GitLab CI を設定する方法を学ぶ
概要
はじめに
アプリケーションに GitLab CI を使用している場合、シークレットが欠落しているためにパイプラインの実行が失敗する可能性があります。シークレットがないと、Quay、JFrog、Red Hat Advanced Cluster Security (ACS) との統合が機能せず、脆弱性スキャン、イメージ署名、コンプライアンスのための SBOM 生成などのセキュリティータスクが機能しなくなります。
これを防ぐには、GitLab CI にシークレットをセキュアに保存する必要があります。このガイドでは、パイプラインをスムーズかつセキュアに実行するためのプロセスを順を追って説明します。
第1章 外部ツールとの安全な統合のために GitLab CI にシークレットを追加する
前提条件
GitLab CI を設定する前に、次のものがあることを確認してください。
- GitLab リポジトリーと CI/CD 設定への 管理者 アクセス権。
- Quay.io、JFrog Artifactory、または Sonatype Nexus からコンテナーイメージをプルするための コンテナーレジストリー認証情報。
特定の GitLab CI タスクの 認証の詳細:
ACS セキュリティータスクの場合:
- ROX Central サーバーエンドポイント
- ROX API トークン
SBOM およびアーティファクト署名タスクの場合:
- Cosign 署名鍵のパスワード
- 秘密鍵と公開鍵
- Trustification URL
- クライアント ID およびシークレット
- サポートされている CycloneDX バージョン
注記認証情報やその他の詳細は、すでに Base64 でエンコードされているため、再度エンコードする必要はありません。これらの認証情報は、RHTAP のインストール中に作成した
private.env
ファイルにあります。
1.1. オプション 1: GitLab UI を使用する
手順
- GitLab にログインし、ソースリポジトリーを開きます。
- Setting メニューを展開し、CI/CD を選択します。
- 変数セクションで、Expand を選択し、Add variable を選択します。
以下の詳細を入力します。
- Flags で、Mask variable を選択して機密性の高い値を非表示にします。
- Key フィールドに MY_GITLAB_TOKEN と入力します。
- Value フィールドに、GitLab アカウントに関連付けられている トークン を入力します。
ステップ 3 - 4 を繰り返して、必要な変数を追加します。
変数 説明 1 つのイメージレジストリーに対してのみイメージレジストリー認証情報を提供します。
QUAY_IO_CREDS_USR
Quay.io リポジトリーにアクセスするためのユーザー名。
QUAY_IO_CREDS_PSW
Quay.io リポジトリーにアクセスするためのパスワード。
ARTIFACTORY_IO_CREDS_USR
JFrog Artifactory リポジトリーにアクセスするためのユーザー名。
ARTIFACTORY_IO_CREDS_PSW
JFrog Artifactory リポジトリーにアクセスするためのパスワード。
NEXUS_IO_CREDS_USR
Sonatype Nexus リポジトリーにアクセスするためのユーザー名。
NEXUS_IO_CREDS_PSW
Sonatype Nexus リポジトリーにアクセスするためのパスワード。
Gitlab CI ランナーが RHTAP インスタンスと同じクラスター上で実行されていない場合は、これらの変数を設定します。
REKOR_HOST
Rekor サーバーの URL。
TUF_MIRROR
TUF サービスの URL。
GitLab の GitOps 設定
GITOPS_AUTH_PASSWORD
新しくビルドされたイメージの GitOps リポジトリーを更新するためにシステムが使用するトークン。
GITOPS_AUTH_USERNAME
(任意)GitLab が Jenkins と連携するために必要なパラメーター。また、Jenkinsfile でこのパラメーターを含む行のコメントを解除する必要があります (GITOPS_AUTH_USERNAME = credentials('GITOPS_AUTH_USERNAME')。デフォルトでは、この行はコメントアウトされています。
ACS タスクに必要な変数
ROX_CENTRAL_ENDPOINT
ROX Central サーバーのエンドポイント。
ROX_API_TOKEN
ROX サーバーにアクセスするための API トークン。
SBOM タスクに必要な変数
COSIGN_SECRET_PASSWORD
Cosign 署名鍵のパスワード。
COSIGN_SECRET_KEY
Cosign の秘密鍵。
COSIGN_PUBLIC_KEY
Cosign の公開鍵。
TRUSTIFICATION_BOMBASTIC_API_URL
SBOM 生成で使用される Trustification Bombastic API の URL。
TRUSTIFICATION_OIDC_ISSUER_URL
Trustification Bombastic API と対話する際の認証に使用される OIDC 発行者 URL。
TRUSTIFICATION_OIDC_CLIENT_ID
OIDC を使用して Trustification Bombastic API に認証するためのクライアント ID。
TRUSTIFICATION_OIDC_CLIENT_SECRET
Trustification Bombastic API への認証にクライアント ID と一緒に使用されるクライアントシークレット。
TRUSTIFICATION_SUPPORTED_CYCLONEDX_VERSION
システムがサポートして生成する CycloneDX SBOM バージョンを指定します。
- Add variable を選択します。
最後のパイプライン実行を再実行して、シークレットが正しく適用されていることを確認します。
- または、GitLab でアプリケーションのソースリポジトリーに切り替えて、小さな変更を加え、コミットして新しいパイプラインの実行をトリガーします。
1.2. オプション 2: CLI を使用する
手順
Visual Studio Code などの任意のテキストエディターで、次の 2 つのファイルを含むプロジェクトを作成します。
- env_vars.sh
- glab-set-vars
次の環境変数を使用して
env_vars.sh
ファイルを更新します。# env_vars.sh # GitLab credentials export MY_GITLAB_TOKEN="your_gitlab_token_here" export MY_GITLAB_USER="your_gitlab_username_here" export GITOPS_AUTH_PASSWORD="your_OpenShift_GitOps_password_here" export GITOPS_AUTH_USERNAME="your_OpenShift_GitOps_username_here" // Provide the credentials for the image registry you use. # Quay.io credentials export QUAY_IO_CREDS_USR="your_quay_username_here" export QUAY_IO_CREDS_PSW="your_quay_password_here" # JFrog Artifactory credenditals export ARTIFACTORY_IO_CREDS_USR="your_artifactory_username_here" export ARTIFACTORY_IO_CREDS_PSW="your_artifactory_password_here" # Sonatype Nexus credentials export NEXUS_IO_CREDS_USR="your_nexus_username_here" export NEXUS_IO_CREDS_PSW="your_nexus_password_here" # Rekor and TUF routes export REKOR_HOST="your rekor server url here" export TUF_MIRROR="your tuf service url here" // Variables required for ACS tasks # ROX variables export ROX_CENTRAL_ENDPOINT="your_rox_central_endpoint_here" export ROX_API_TOKEN="your_rox_api_token_here" // Set these variables if Gitlab CI runners do not run on the same cluster as the {ProductShortName} instance. export ROX_CENTRAL_ENDPOINT="your_rox_central_endpoint_here" export ROX_API_TOKEN="your_rox_api_token_here" // Variables required for SBOM tasks. # Cosign secrets export COSIGN_SECRET_PASSWORD="your_cosign_secret_password_here" export COSIGN_SECRET_KEY="your_cosign_secret_key_here" export COSIGN_PUBLIC_KEY="your_cosign_public_key_here" # Trustification credentials export TRUSTIFICATION_BOMBASTIC_API_URL="your__BOMBASTIC_API_URL_here" export TRUSTIFICATION_OIDC_ISSUER_URL="your_OIDC_ISSUER_URL_here" export TRUSTIFICATION_OIDC_CLIENT_ID="your_OIDC_CLIENT_ID_here" export TRUSTIFICATION_OIDC_CLIENT_SECRET="your_OIDC_CLIENT_SECRET_here" export TRUSTIFICATION_SUPPORTED_CYCLONEDX_VERSION="your_SUPPORTED_CYCLONEDX_VERSION_here"
次の情報を使用して
glab-set-vars
ファイルを更新します。#!/bin/bash SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null 2>&1 && pwd)" if [ $# -ne 1 ]; then echo "Missing param, provide gitlab repo name" echo "Note: This script uses MY_GITLAB_TOKEN and MY_GITLAB_USER env vars" exit fi REPO=$1 HEADER="PRIVATE-TOKEN: $MY_GITLAB_TOKEN" URL=https://gitlab.com/api/v4/projects # Look up the project ID so we can use it below PID=$(curl -s -L --header "$HEADER" "$URL/$MY_GITLAB_USER%2F$REPO" | jq ".id") function setVars() { NAME=$1 VALUE=$2 MASKED=${3:-true} echo "setting $NAME in https://gitlab.com/$MY_GITLAB_USER/$REPO" # Delete first because if the secret already exists then its value # won't be changed by the POST below curl -s --request DELETE --header "$HEADER" "$URL/$PID/variables/$NAME" # Set the new key/value curl -s --request POST --header "$HEADER" "$URL/$PID/variables" \ --form "key=$NAME" --form "value=$VALUE" --form "masked=$MASKED" | jq } setVars ROX_CENTRAL_ENDPOINT $ROX_CENTRAL_ENDPOINT setVars ROX_API_TOKEN $ROX_API_TOKEN setVars GITOPS_AUTH_PASSWORD $MY_GITLAB_TOKEN setVars GITOPS_AUTH_USERNAME $MY_GITLAB_USER setVars QUAY_IO_CREDS_USR $QUAY_IO_CREDS_USR setVars QUAY_IO_CREDS_PSW $QUAY_IO_CREDS_PSW setVars COSIGN_SECRET_PASSWORD $COSIGN_SECRET_PASSWORD setVars COSIGN_SECRET_KEY $COSIGN_SECRET_KEY setVars COSIGN_PUBLIC_KEY $COSIGN_PUBLIC_KEY setVars TRUSTIFICATION_BOMBASTIC_API_URL "$TRUSTIFICATION_BOMBASTIC_API_URL" setVars TRUSTIFICATION_OIDC_ISSUER_URL "$TRUSTIFICATION_OIDC_ISSUER_URL" setVars TRUSTIFICATION_OIDC_CLIENT_ID "$TRUSTIFICATION_OIDC_CLIENT_ID" setVars TRUSTIFICATION_OIDC_CLIENT_SECRET "$TRUSTIFICATION_OIDC_CLIENT_SECRET" setVars TRUSTIFICATION_SUPPORTED_CYCLONEDX_VERSION "$TRUSTIFICATION_SUPPORTED_CYCLONEDX_VERSION" setVars ARTIFACTORY_IO_CREDS_USR $ARTIFACTORY_IO_CREDS_USR setVars ARTIFACTORY_IO_CREDS_PSW $ARTIFACTORY_IO_CREDS_PSW setVars NEXUS_IO_CREDS_USR $NEXUS_IO_CREDS_USR setVars NEXUS_IO_CREDS_PSW $NEXUS_IO_CREDS_PSW setVars REKOR_HOST $REKOR_HOST setVars TUF_MIRROR $TUF_MIRROR
(オプション)
glab-set-vars
ファイルを変更して、不要な変数を無効にします。たとえば、setVars ROX_API_TOKEN $ROX_API_TOKEN
を無効にするには、その横にfalse
を追加します。ROX_API_TOKEN $ROX_API_TOKEN false
現在のシェルセッションに環境変数を読み込みます。
source env_vars.sh
glab-set-vars
スクリプトを実行可能にし、リポジトリー名で実行して、GitLab リポジトリー内の変数を設定します。chmod +x glab-set-vars ./glab-set-vars your_repository_name
最後のパイプライン実行を再実行して、シークレットが正しく適用されていることを確認します。
- または、GitLab でアプリケーションのソースリポジトリーに切り替えて、小さな変更を加え、コミットして新しいパイプラインの実行をトリガーします。
改訂日時: 2025-02-14