1. 序章

Jenkins は、特にソフトウェア構成管理に git を使用する場合に、ソフトウェアのビルドと配信を自動化するための優れたツールです。 ただし、Jenkinsを使用する場合の一般的な問題は、パスワードやトークンなどの機密データの処理方法です

このチュートリアルでは、gitシークレットをJenkinsパイプラインとジョブに安全に挿入する方法を見ていきます。

2. Gitの秘密

まず、gitシークレットの生成について見ていきます。

2.1. GPGキーを作成する

gitシークレットはGPGキーを使用するため、最初に使用する有効なキーがあることを確認する必要があります。

$ gpg --gen-key

これにより、氏名と電子メール、および秘密のパスフレーズの入力を求められます。 後でJenkinsを構成するときに必要になるため、このパスフレーズを覚えておいてください。

これにより、ホームディレクトリに公開鍵と秘密鍵のペアが作成されます。これは、秘密の作成を開始するのに十分です。 後で、Jenkinsで使用するためにキーをエクスポートする方法を説明します。

2.2. シークレットを初期化する

git-secretユーティリティはgitのアドオンであり、機密データをgitリポジトリ内に保存できます。 クレデンシャルを安全に保存する方法であるだけでなく、gitにネイティブなバージョン管理とアクセス制御のメリットも得られます。

開始するには、最初にgit-secretユーティリティをインストールする必要があります。 これはほとんどのgitディストリビューションの一部ではなく、個別にインストールする必要があることに注意してください。

インストールすると、任意のgitリポジトリ内のシークレットを初期化できます。

$ git secret init

これは、 gitinitコマンドに似ています。 リポジトリ内に新しい.gitsecretディレクトリを作成します。

ベストプラクティスとして、 random_seed ファイルを除き、.gitignoreディレクトリ内のすべてのファイルをソース管理に追加する必要があります。 上記のinitコマンドは、.gitignoreがこれを処理することを確認する必要がありますが、再確認する価値があります。

次に、ユーザーをgit secretrepokeyringに追加する必要があります。

$ git secret tell [email protected]

これで、リポジトリにシークレットを保存する準備が整いました。

2.3. シークレットの保存と取得

git secret コマンドは、リポジトリ内の特定のファイルを暗号化することで機能します。 ファイルには.secret拡張子が付けられ、元のファイル名が .gitignore に追加されて、リポジトリにコミットされないようにします。

例として、データベースのパスワードをdbpassword.txtという名前のファイルに保存するとします。 最初にファイルを作成します。

$ echo "Password123" > dbpassword.txt

次に、ファイルを暗号化します。

$ git secret add dbpassword.txt

最後に、hiddenコマンドを使用してシークレットをコミットする必要があります。

$ git secret hide

この時点で、ファイルがリポジトリ内に安全に保存されるように変更をコミットする必要があります。これは標準のgitコマンドを使用して行われます。

$ git add .
$ git commit -m "Add encrypted DB password"
$ git push

暗号化されていないファイルは引き続きローカルで利用できることに注意してください。 ただし、gitによって自動的に無視されるため、誤ってチェックインすることはありません。

これを確認するために、リポジトリをもう一度チェックアウトすると、次のように表示されます。

$ ls
dbpassword.txt.secret

.secretファイルの内容は暗号化されて読み取り不能であることに注意してください。 それらを読み取る前に、ファイルを復号化する必要があります。

$ git secret reveal -p <PASSPHRASE>
$ git secret cat dbpassword.txt

PASSPHRASE は、GPGキーを生成するときに使用したGPGパスフレーズです。

3. JenkinsでGitシークレットを使用する

これで、 gitsecretを使用してクレデンシャルを保存および取得するために必要な手順を確認しました。 次に、Jenkinsで暗号化されたシークレットを使用する方法を説明します。

3.1. クレデンシャルを作成する

開始するには、最初に、以前に生成したGPG秘密鍵をエクスポートする必要があります。

$ gpg -a --export-secret-keys [email protected] > gpg-secret.key
$ gpg --export-ownertrust > gpg-ownertrust.txt

この秘密鍵を安全に保つことが重要です。 共有したり、公的にアクセス可能な場所に保存したりしないでください。

次に、この秘密鍵をJenkins内に保存する必要があります。 これを行うには、エクスポートしたばかりのGPG秘密鍵とトラストストアを格納するための複数のJenkinsクレデンシャルを作成します。

まず、資格情報>システム>グローバル資格情報に移動し、資格情報の追加をクリックします。 次のフィールドを設定する必要があります。

  • 種類:シークレットファイル
  • ファイル:上記でエクスポートしたgpg-secret.keyをアップロードします
  • ID :gpg-secret
  • 説明:GPGシークレットキー

クレデンシャルを保存し、トラストストアファイル用に別のクレデンシャルを作成します。

  • 種類:シークレットファイル
  • ファイル:上記でエクスポートしたgpg-ownertrust.txtをアップロードします
  • ID :gpg-ownertrust
  • 説明:GPG所有者の信頼

クレデンシャルを保存し、GPGパスフレーズの最終的なクレデンシャルを作成します。

  • 種類:秘密のテキスト
  • 文章
  • ID :gpg-パスフレーズ
  • 説明:GPGパスフレーズ

3.2. パイプラインでクレデンシャルを使用する

クレデンシャルとしてGPGキーを使用できるようになったので、キーを使用するようにJenkinsパイプラインを作成または変更できます。 これが機能する前に、Jenkinsエージェントにgit-secretツールをインストールする必要があることに注意してください。

パイプライン内の暗号化されたデータにアクセスするには、パイプラインスクリプトにいくつかの部分を追加する必要があります。

まず、environment宣言を追加します。

environment {
    gpg_secret = credentials("gpg-secret")
    gpg_trust = credentials("gpg-ownertrust")
    gpg_passphrase = credentials("gpg-passphrase")
}

これにより、前に作成した3つの資格情報を後続のパイプラインステージでアクセスできるようになります。

次に、GPGキーと信頼をローカルエージェント環境にインポートします。

steps {
    sh """
        gpg --batch --import $gpg_secret
        gpg --import-ownertrust $gpg_trust
    """
}

最後に、リポジトリ内で gitsecretコマンドを実行できます。

steps {
    sh """
        cd $WORKSPACE
        git secret reveal -p '$gpg_passphrase'
        git secret cat dbpassword.txt
    """
}

パイプラインを実行すると、最後にデータベースパスワードの出力が表示されます。

+ git secret cat dbpassword.txt
Password123

3.3. ジェンキンスジョブズ

従来のJenkinsジョブを使用してgitシークレットを使用することもできます。

パイプラインの場合と同様に、GPGキー、信頼、パスフレーズに対して3つのJenkinsクレデンシャルを構成する必要があります。

パイプラインとの主な違いは、Jenkins環境構成パネルを使用してGPGクレデンシャルを挿入することです。

次に、GPGインポートコマンドとgitシークレットコマンドをシェルコマンドに追加できます。

パイプラインと同様に、ジョブの実行の最後にデータベースのパスワードが出力されます。

+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS

4. 結論

このチュートリアルでは、Jenkinsパイプラインと従来のジョブの両方でgitシークレットを使用する方法を見てきました。 これは、CI/CDパイプラインへの機密データへのアクセスを提供する簡単な方法です。

ただし、Gitシークレットはキーを保存するための1つのオプションですが、 HashicorpVaultなどの他の専用セキュリティソリューションはより強力な代替手段を提供することに注意してください。