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

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

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

このチュートリアルでは、次の内容を学習します。

  • Azure CLI を使用して Azure Key Vaultを作成する
  • シークレットを追加し、Azure キー コンテナーへのアクセスを構成する
  • パイプラインでシークレットを使用する

前提条件

Azure Key Vault を作成する

Azure Portal にサインインし、右上隅にある [Cloud Shell] ボタンを選択します。

  1. アカウントに複数の Azure サブスクリプションが関連付けられている場合は、次のコマンドを使用して既定のサブスクリプションを指定します。 を使用 az account list して、サブスクリプションの一覧を生成できます。

    az account set --subscription <your_subscription_name_or_ID>
    
  2. 既定の Azure リージョンを設定します。 を使用 az account list-locations して、使用可能なリージョンの一覧を生成できます。

    az config set defaults.location=<your_region>
    

    たとえば、次のコマンドは westus2 リージョンを選択します。

    az config set defaults.location=westus2
    
  3. 新しいリソース グループを作成します。 リソース グループは、Azure ソリューションの関連するリソースを保持するコンテナーです。

    az group create --name <your-resource-group>
    
  4. 新しいキー コンテナーを作成します。

    az keyvault create \
      --name <your-key-vault> \
      --resource-group <your-resource-group>
    
  5. Azure キー コンテナーに新しいシークレットを作成します。

    az keyvault secret set \
      --name "Password" \
      --value "mysecretpassword" \
      --vault-name <your-key-vault-name>
    

プロジェクトの作成

  1. Azure DevOps 組織にサインインします。

  2. organizationにプロジェクトがまだない場合は、[プロジェクトの作成] を選択して作業を開始します。 それ以外の場合は、右上隅にある [新しいプロジェクト ] を選択します。

リポジトリを作成する

YAML を使用してパイプラインを作成しますが、最初に新しいリポジトリを作成する必要があります。

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

  2. [ リポジトリ] を選択し、[ 初期化 ] を選択して README を使用して新しいリポジトリを初期化します。

    リポジトリを初期化する方法を示すスクリーンショット。

新しいパイプラインを作成する

  1. [パイプライン] を選択してから [新しいパイプライン] を選択します。

  2. [Azure Repos Git (YAML)] を選択します。

    ソース管理Azure Repos選択する方法を示すスクリーンショット。

  3. 前の手順で作成したリポジトリを選択します。

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

  5. 既定のパイプラインには、エコー コマンドを実行するいくつかのスクリプトが含まれます。 これらは必要ないので、削除できます。 新しい YAML ファイルは次のようになります。

    trigger:
    - main
    
    pool:
        vmImage: 'ubuntu-latest'
    
    steps:
    
  6. [アシスタントの表示] を選択して、アシスタント パネルを展開します。 このパネルには、パイプライン タスクの便利で検索可能なリストが用意されています。

    タスク アシスタント パネルにアクセスする方法を示すスクリーンショット。

  7. コンテナーを検索し、Azure Key Vault タスクを選択します。

    Azure Key Vault タスクを検索する方法を示すスクリーンショット。

  8. Azure サブスクリプションを選択し、[承認] を選択します。 ドロップダウン メニューから キー コンテナー を選択し、[ 追加 ] を選択してタスクを YAML パイプラインに追加します。

    Azure Key Vault タスクを構成する方法を示すスクリーンショット。

    注意

    ジョブ全体でシークレットを使用できるようにする機能は、Azure DevOps Server 2019 および 2020 ではサポートされていません。

  9. YAML ファイルは次のようになります。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      inputs:
        azureSubscription: 'Your-Azure-Subscription'
        KeyVaultName: 'Your-Key-Vault-Name'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      inputs:
        script: 'echo $(Your-Secret-Name) > secret.txt'
    
    - task: CopyFiles@2
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    

まだパイプラインを保存したりキューに入れたりしないでください。 まず、Azure Key Vaultにアクセスするための適切なアクセス許可をパイプラインに付与する必要があります。 ブラウザー タブを開いたままにしておきます。キー コンテナーのアクセス許可を設定すると、残りの手順が再開されます。

Azure Key Vault アクセス ポリシーを設定する

Azure Key Vaultにアクセスするには、まず Azure Pipelines へのアクセスを許可するサービス プリンシパルを設定する必要があります。 このガイドに従ってサービス プリンシパルを作成し、このセクションの次の手順に進みます。

  1. Azure Portalに移動します。

  2. 検索バーを使用して、前に作成したキー コンテナーを検索します。

    Azure Key Vaultを検索する方法を示すスクリーンショット。

  3. [ 設定] で[ アクセス ポリシー] を選択します。

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

  5. [シークレットのアクセス許可] で、[取得][リスト] を選択します。

  6. サービス プリンシパルを選択するオプションを選択し、このセクションの最初に作成したサービス プリンシパルを検索します。 セキュリティ プリンシパルは、Azure リソースへのアクセスを要求するユーザー、グループ、サービス、またはアプリケーションを表すオブジェクトです。

  7. [ 追加] を選択してアクセス ポリシーを作成し、完了したら [保存] を選択します。

注意

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

パイプラインを実行して確認する

  1. 中断した前のタブに戻ります。

  2. [ 保存] を選択し、もう一度 [保存] を選択して変更をコミットし、パイプラインをトリガーします。 Azure リソースへのパイプライン アクセスを許可するように求められる場合があります。メッセージが表示されたら、[ 許可] を選択します。 パイプラインを承認する必要があるのは 1 回だけです。

  3. CmdLine タスクを選択してログを表示します。

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

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

    パイプラインの概要と発行された成果物を示すスクリーンショット。

  5. secret.txt 成果物を選択して開きます。

    発行された成果物を開く方法を示すスクリーンショット。

  6. テキスト ファイルには、 シークレット mysecretpassword が含まれている必要があります。

警告

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

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

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

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

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

    az group delete --name PipelinesKeyVaultResourceGroup
    

よく寄せられる質問

Q: "ユーザーまたはグループにシークレット リストのアクセス許可がありません" というエラーが表示される場合は、どうすればよいですか?

A: ユーザーまたはグループにキー コンテナーに対するシークレット リストのアクセス許可がないことを示すエラーが発生した場合は、次のコマンドを実行して、アプリケーションが Azure Key Vault内のキーまたはシークレットにアクセスすることを承認します。

$ErrorActionPreference="Stop";
$Credential = Get-Credential;
Connect-AzAccount -SubscriptionId <YOUR_SUBSCRIPTION_ID> -Credential $Credential;
$spn=(Get-AzureRmADServicePrincipal -SPN <YOUR_SERVICE_PRINCIPAL_ID>);
$spnObjectId=$spn.Id;
Set-AzureRmKeyVaultAccessPolicy -VaultName key-vault-tutorial -ObjectId $spnObjectId -PermissionsToSecrets get,list;

次のステップ