シークレット変数を設定する

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

シークレット変数は、値を公開せずにパイプラインで使用できる暗号化された変数です。 シークレット変数は、パイプラインで公開したくなかった、パスワード、ID、その他の識別データなどの個人情報用に使用できます。 シークレット変数は、2048 ビット RSA キーを使用して保存時に暗号化され、使用するタスクおよびスクリプト用に、エージェント上で使用できます。

シークレット変数の設定が推奨される箇所は、UI変数グループAzure Key Vault の変数グループです。 ログ コマンドを使ってスクリプトにシークレット変数を設定することもできますが、パイプラインにアクセスできるユーザーは誰でもシークレットを参照できるため、これは推奨されません。

パイプラインのパイプライン設定 UI で設定されたシークレット変数は、設定されたパイプラインにスコープが設定されます。 変数グループを使用して、パイプライン間でシークレット変数を共有できます。

UI のシークレット変数

個々のパイプラインを編集するときに、パイプライン エディターでシークレット変数を設定できます。 ロック アイコンを選択して、パイプライン変数シークレットを暗号化して作成します。

シークレット変数は、YAML とクラシックで、同じ方法で設定します。

Web インターフェイスでシークレットを設定するには、次の手順に従います。

  1. [パイプライン] ページにアクセスし、適切なパイプラインを選択して、 [編集]を選択します。
  2. このパイプラインの [変数] を探します。
  3. 変数を追加または更新します。
  4. 変数を暗号化して保存するには、 この値を秘密にする オプションを選択します。
  5. パイプラインを保存します。

シークレット変数は、2048 ビット RSA キーを使用して保存時に暗号化されます。 エージェントで使用するタスクとスクリプトに対してシークレットを利用できます。 パイプラインを変更するアクセス権を持つユーザーには注意してください。

重要

Azure Pipelines の出力に表示されないようにシークレットのマスクに努めますが、引き続き予防策を講じる必要があります。 シークレットを出力としてエコーしないでください。 一部のオペレーティング システムでは、コマンド ライン引数がログに記録されます。 コマンド ラインでシークレットを渡さないでください。 代わりに、シークレットを環境変数にマップすることをお勧めします。

シークレットの部分文字列をマスクすることはありません。 たとえば、"abc123" がシークレットとして設定されている場合、"abc" はログからマスクされません。 これは、レベルが細かすぎてログが読み取れなくなるシークレットのマスクを回避するためです。 このため、シークレットには構造化データを含めることはできません。 たとえば、"{ "foo": "bar" }" がシークレットとして設定されている場合、"bar" はログからマスクされません。

通常の変数とは異なり、スクリプトの環境変数には自動的に復号化されません。 シークレット変数を明示的にマップする必要があります。

UI でシークレット変数を使用する

YAML パイプラインでそれらを参照するには、シークレット変数を環境変数としてマップする必要があります。 この例では、UI に、2 つのシークレット変数 (SecretOne および SecretTwo) が定義されています。 SecretOne の値は foo で、SecretTwo の値は bar です。

steps:
- powershell: |
      Write-Host "My first secret variable is $env:FOO_ONE"
      $env:FOO_ONE -eq "foo"
  env:
    FOO_ONE: $(SecretOne)
- bash: |
    echo "My second secret variable: $FOO_TWO"
    if [ "$FOO_TWO" = "bar" ]; then
        echo "Strings are equal."
    else
        echo "Strings are not equal."
    fi
  env:
    FOO_TWO: $(SecretTwo) 

パイプラインの出力は次のとおりです。

My first secret variable is ***
True
My second secret variable: ***
Strings are equal.

Note

Azure Pipelines は、パイプライン ログにデータを出力するときにシークレットをマスクする作業を行うため、シークレットとして設定されていない出力とログに追加でマスクされた変数とデータが表示される場合があります。

詳しい例については、「変数の定義」を参照してください。

変数グループでシークレット変数を設定する

変数グループにシークレットを追加したり、既存の Azure Key Vault のシークレットをリンクしたりできます。

新しい変数グループを作成する

  1. [パイプライン]>[ライブラリ]>[変数グループの追加] を選択します。

    赤いボックスで強調表示された [変数グループの追加] ボタンのスクリーンショット。

  2. グループの名前と説明を入力します。

  3. 省略可能: トグルを移動して、Azure Key Vault のシークレットを変数としてリンクします。 詳細については、「Azure Key Vault のシークレットを使用する」を参照してください。

  4. グループに含める各変数の名前と値を入力し、それぞれに対して [+ 追加] を選択します。

  5. 変数を安全にするには、行の末尾にある "ロック" アイコンを選択します。

  6. 変数の追加が完了したら、[保存] を選択します。

    変数グループの保存のスクリーンショット。

変数グループはライブラリ セキュリティ モデルに従います。

既存の Azure Key Vault にリンクする変数グループを作成し、選択した Key Vault シークレットを変数グループにマップできます。 シークレット名のみが変数グループにマップされ、シークレット値はマップされません。 変数グループへのリンクを持つパイプライン実行は、ボールトから最新のシークレット値をフェッチします。

キー コンテナー内の既存のシークレットに加えられた変更は、変数グループを使用するすべてのパイプラインで自動的に使用できます。 ただし、シークレットがボールトに追加されたり、ボールトから削除されたりしても、関連付けられている変数グループは自動的に更新されません。 変数グループに含めるシークレットを明示的に更新する必要があります。

Key Vault では暗号化キーと証明書の Azure への格納と管理がサポートされていますが、Azure Pipelines 変数グループ統合ではキー コンテナー シークレットのマッピングのみがサポートされます。 暗号化キーと証明書はサポートされていません。

Note

Azure ロールベースのアクセス制御 (Azure RBAC) を使用する Key Vault はサポートされていません。

前提条件

  • シークレットを含む Azure Key Vault。 Azure portal を使用して Key Vault を作成することもできます。
  • プロジェクトの Azure サービス接続

変数グループの作成

  1. Azure DevOps プロジェクトで、[パイプライン]>[ライブラリ]>[+ 変数グループ] を選択します。
  2. [変数グループ] ページで、変数グループの名前と説明 (オプション) を入力します。
  3. [シークレットを Azure Key Vault から変数としてリンクする] トグルを有効にします。
  4. Azure サブスクリプション エンドポイントと Key Vault 名を選択します。
  5. コンテナー名の横にある [承認] を選択して、Azure DevOps が Key Vault にアクセスできるようにします。
  6. [シークレットの選択] 画面で、コンテナーからこの変数グループにマッピングする特定のシークレットを選択し、[OK] を選択します。
  7. [保存] を選択して、シークレット変数グループを保存します。

Azure Key Vault 統合での変数グループのスクリーンショット。

Note

Azure サービス接続には、キー コンテナーに対する少なくとも Get および List アクセス許可が必要です。このアクセス許可は、前の手順で承認できます。 次の手順に従って、Azure portal からこれらのアクセス許可を付与することもできます。

  1. Key Vault の [設定] を開き、アクセス構成]>[アクセス ポリシーに移動] を選択します。
  2. [アクセス ポリシー] ページで、Azure Pipelines プロジェクトが少なくとも Get および List アクセス許可を持つ [アプリケーション] の下に一覧表示されていない場合は、[作成] を選択します。
  3. [シークレットのアクセス許可] で、[Get] および [List] を選択し、[次へ] を選択します。
  4. サービス プリンシパルを選択し、[次へ] を選択します。
  5. [次へ] をもう一度選択して設定を確認してから、[作成] を選択します。

Azure Key Vault タスクを使用する

Azure Key Vault タスクを使用して、パイプラインにシークレットを含めることができます。 このタスクにより、パイプラインで Azure Key Vault に接続して、パイプライン変数として使用するシークレットを取得できるようなります。

  1. パイプライン エディターで、[アシスタントを表示する] を選択してアシスタント パネルを展開します。

  2. vault を検索し、[Azure Key Vault タスク] を選択します。

    Azure Key Vault タスクを追加する。

[ジョブ全体に対してシークレットを使用できるようにする] オプションは、現時点では、Azure DevOps Server 2019 および 2020 でサポートされていません。

Azure Key Vault タスクの詳細については、「Azure Pipelines で Azure Key Vault シークレットを使用する」を参照してください。

ログ コマンドを使用してスクリプトでシークレット変数を設定する

task.setvariable ログ コマンドを使用して、PowerShell および Bash スクリプトで変数を設定できます。 これは、シークレット変数を操作するための最も安全性が低い方法ですが、デバッグに役立てることができます。 シークレット変数の設定が推奨される箇所は、UI、変数グループ、Azure Key Vault の変数グループです。

ログ コマンドを使用して変数をスクリプトとして設定するには、issecret フラグを渡す必要があります。

issecret が true に設定されている場合、変数の値はシークレットとして保存され、ログからマスクされます。

Note

Azure Pipelines は、パイプライン ログにデータを出力するときにシークレットをマスクする作業を行うため、シークレットとして設定されていない出力とログに追加でマスクされた変数とデータが表示される場合があります。

シークレット変数 mySecretVal を設定します。

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

シークレット変数 mySecretVal を取得します。

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

bash でのシークレット変数の出力。

bash の変数出力のスクリーンショット。

スクリプトでの変数の設定と使用の詳細について説明します。