Azure Pipelines で Azure Key Vault シークレットを使用する

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022

Azure Key Vault は、開発者が API キー、資格情報、証明書などの機密情報を安全に格納および管理するのに役立つクラウド サービスです。 Key Vault では、ボールトとマネージド ハードウェア セキュリティ モジュール (HSM) プールという 2 種類のコンテナーがサポートされています。 コンテナーには、ソフトウェアキーと HSM ベースのキー、シークレット、証明書の両方を格納できます。 マネージド HSM プールでは、HSM でサポートされるキーのみがサポートされます。

この記事では、キー コンテナーを作成し、シークレットを追加し、アクセス ポリシーを構成してから、Azure Pipelinesでそのシークレットを使用する方法について説明します。 このチュートリアルでは、パブリック ネットワーク アクセスを持つキー コンテナーを使用します。 パイプラインから秘密キー コンテナーにアクセスする必要がある場合は、「パイプライン から秘密キー コンテナーにアクセスする」を参照してください。 Key Vaultシークレットを変数グループにリンクするには、「変数グループを Azure Key Vaultを参照してください。

前提条件

カテゴリ Requirements
Azure DevOps - Azure DevOps 組織
- Azure DevOps プロジェクト
紺碧 Azure サブスクリプション

コードを取得する

独自のプロジェクトがない場合は、次のサンプル リポジトリを Azure リポジトリにインポートします。

  1. Azure DevOps 組織にサインインしてから、プロジェクトに移動します。

  2. Repos を選択し、Import を選択します。 次のリポジトリ URL を入力し、 Import を選択します。

    https://github.com/MicrosoftDocs/pipelines-dotnet-core
    

Key Vault を作成します

Azure CLIを使用してAzureに新しいキー コンテナーを作成するには、次の手順に従います。

  1. Azure ポータルに移動し、右上隅にある Azure Cloud Shell を選択します。

  2. アカウントが複数のAzure サブスクリプションに関連付けられている場合は、既定のサブスクリプションを設定します。

    az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
    
  3. 既定の Azure リージョンを設定します。 使用可能なリージョンの一覧を表示するには、 az account list-locationsを実行します。

    az config set defaults.location=<YOUR_REGION>
    
  4. 新しいリソース グループを作成します。

    az group create --name <YOUR_RESOURCE_GROUP_NAME>
    
  5. 新しい Key Vault を作成します。

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. キー ボールトにシークレットを追加します。

    az keyvault secret set \
      --name <YOUR_SECRET_NAME> \
      --value <YOUR_ACTUAL_SECRET> \
      --vault-name <YOUR_KEY_VAULT_NAME>
    

認証の設定

キー コンテナーを作成したら、次の手順として認証を設定します。 [マネージド ID] または [サービス プリンシパル] を選択し、指示に従って認証を構成します。

ユーザー割り当てマネージド ID を作成する

  1. Azure ポータルに移動し、検索バーで管理 ID を検索します。

  2. [ 作成] を選択し、次の情報を指定します。

    • サブスクリプション: ドロップダウン メニューから Azure サブスクリプションを選択します。
    • リソース グループ: 既存のリソース グループを選択するか、新しいリソース グループを作成します。
    • リージョン: マネージド ID が作成されるリージョンを選択します。
    • 名前: ユーザー割り当てマネージド ID の名前を入力します。
  3. [ 確認と作成] を選択し、[ 作成 ] を選択してデプロイを開始します。

  4. デプロイが完了したら、[ リソースに移動] を選択し、 サブスクリプション IDクライアント ID の値をコピーします。 これらの値は、後の手順で必要になります。

  5. [ 設定]で [プロパティ] を選択し、後で使用するためにマネージド ID の テナント ID の値をコピーします。

キー ボールトのアクセス ポリシーを設定する

  1. Azure ポータル に移動し、検索バーを使用して、前に作成したキー コンテナーを見つけます。

  2. [ アクセス ポリシー] を選択し、[ 作成 ] を選択して新しいポリシーを追加します。

  3. [ シークレットのアクセス許可] で、[ 取得 ] チェック ボックスと [一覧] チェック ボックスをオンにします。

  4. 次へを選択します。 先ほど作成したマネージド ID の クライアント ID を検索バーに貼り付け、マネージド ID を選択します。

  5. 次へを選択してから、もう一度次へを選択します。

  6. アクセス ポリシーの詳細を確認し、[ 作成 ] を選択してポリシーを適用します。

サービス接続を作成する

  1. Azure DevOpsにサインインし、プロジェクトに移動します。

  2. [プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。

  3. [Azure Resource Manager] を選択してから、[次へ] を選択します。

  4. [ID の種類] で、[マネージド ID] を選択します。

  5. [手順 1: マネージド ID の詳細] で、次の情報を入力します。

    • マネージド ID のサブスクリプション: マネージド ID を含むサブスクリプションを選択します。
    • マネージド ID のリソース グループ: マネージド ID をホストするリソース グループを選択します。
    • マネージド ID: ドロップダウン リストからマネージド ID を選択します。
  6. 手順 2: Azure スコープの場合は、次の情報を指定します。

    • サービス接続のスコープ レベル: [サブスクリプション] を選択します。
    • サービス接続のサブスクリプション: マネージド ID がアクセスするサブスクリプションを選択します。
    • サービス接続のリソース グループ: (省略可能) マネージド ID のアクセスを 1 つのリソース グループに制限するリソース グループを指定します。
  7. 手順 3: サービス接続の詳細については、次の情報を指定します。

    • サービス接続名: サービス接続の名前を入力します。
    • サービス管理リファレンス: (省略可能) ITSM データベースからのコンテキスト情報を含めます。
    • 説明: (省略可能) 説明を入力します。
  8. [ セキュリティ] の [ すべてのパイプラインにアクセス許可を付与 する] オプションでは、すべてのパイプラインでこのサービス接続を使用できます。 このオプションはお勧めしません。 代わりに、 サービス接続を使用するように各パイプラインを個別に承認します

  9. [保存] を選択し、サービス接続を確認して作成します。

    Azure Resource Manager のマネージド ID サービス接続を作成する方法を示すスクリーンショット。

パイプラインから Key Vault シークレットにアクセスする

警告

このチュートリアルは、学習に使用することのみを目的としています。 シークレットを安全に操作するためのセキュリティのベスト プラクティスとガイダンスについては、「 Azure Key Vault を使用してサーバー アプリのシークレットを管理する」を参照してください。

  1. Azure DevOpsにサインインし、プロジェクトに移動します。

  2. [ パイプライン>新しいパイプライン] を選択します。

  3. [Azure Repos Git (YAML)] を選択し、リポジトリを選択します。

  4. [スタート パイプライン] テンプレートを選択します。

  5. 既定のパイプラインには、サンプルエコー コマンドが含まれています。 これらのコマンドは必要ないため、削除できます。

  6. Azure Key Vault タスクをパイプラインに追加します。 プレースホルダーを、以前に作成したサービス接続の名前とキー ボールト名に置き換えます。 YAML ファイルは次の例のようになります。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
  7. 次のタスクを追加して、シークレットをコピーして発行します。 この例は デモンストレーションのみを目的としています。 運用環境では使用しないでください。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      displayName: Create file
      inputs:
        script: 'echo $(SECRET_NAME) > secret.txt'
    
    - task: CopyFiles@2
      displayName: Copy file
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    
  8. [保存して実行]を選択し、もう一度選択して変更をコミットし、パイプラインをトリガーします。 メッセージが表示されたら、[ 許可 ] を選択して、Azure リソースへのアクセス権をパイプラインに付与します。

  9. パイプラインが開始されたら、 CmdLine タスクを選択してログを表示します。

    コマンド ライン タスク ログを示すスクリーンショット。

  10. パイプラインの実行が完了したら、パイプラインの概要に戻り、発行された成果物を選択します。

    [概要] タブに発行された成果物を示すスクリーンショット。

  11. drop>secret.txt を選択してファイルをダウンロードします。

    発行された成果物をダウンロードする方法を示すスクリーンショット。

  12. ダウンロードしたテキスト ファイルを開きます。 キー コンテナーから取得したシークレットがあることが必要です。

リソースをクリーンアップする

作成したリソースを削除するには、次の手順に従います。

  1. プロジェクトをホストする新しい組織を作成した場合は、 組織を削除する方法を参照してください。 それ以外の場合は、 プロジェクトを削除します

  2. このチュートリアルで作成したすべての Azure リソースは、1 つのリソース グループでホストされます。 次のコマンドを実行して、リソース グループとそのすべてのリソースを削除します。

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

トラブルシューティング

エラー: "ユーザーまたはグループにシークレット リストのアクセス許可がありません"

このエラーは、パイプラインで使用されるサービス プリンシパルまたはマネージド ID に、キー コンテナー内のシークレットを一覧表示するアクセス許可がない場合に発生します。 この問題を解決するには、ID にシークレットの Get アクセス許可と List アクセス許可があることを確認します。 次のコマンドを実行して、必要なアクセス許可をサービス プリンシパルに付与します。

az login

az account set --subscription <YOUR_SUBSCRIPTION_ID>

$spnObjectId = az ad sp show --id <YOUR_SERVICE_PRINCIPAL_ID>

az keyvault set-policy --name <YOUR_KEY_VAULT_NAME> --object-id $spnObjectId --secret-permissions get list