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 Key Vault へのアクセスを構成する
  • パイプラインでシークレットを使用する

前提条件

リポジトリの作成

すでに独自のリポジトリがある場合は、次のステップに進みます。 それ以外の場合は、次の手順に従ってリポジトリを初期化します。 この Azure Repo を使用してパイプラインを設定します。

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

  2. Repos を選択し、 Initialize を選択して README を使用してメイン ブランチを初期化します。

    READMEファイルを使用してリポジトリを初期化する方法を示すスクリーンショット。

Azure Key Vault を作成する

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

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

    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. 新しい Azure キー コンテナーを作成します。

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. Azure Key Vault で新しいシークレットを作成します。

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

キー コンテナーのアクセス ポリシーをセットアップする

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

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

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

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

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

  4. [次へ] を選択し、前に作成したサービス プリンシパルを選択します。 サービス プリンシパルは、Azure リソースへのアクセスを要求しているアプリケーションまたはサービスを表すオブジェクトです。

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

  6. ポリシーを確認し、完了したら [作成] を選択します。

Note

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

ロールの割り当ての追加

次のステップでは、サービス プリンシパルを使用して ARM サービス接続を作成します。 接続を確認する前に、サービス プリンシパルにサブスクリプション レベルで 読み取り アクセスを許可する必要があります。

  1. Azure portalに移動します。

  2. 左側のナビゲーション パネルから [サブスクリプション] を選択し、サブスクリプションを見つけて選択します。

  3. アクセス制御を選択し、 追加>役割の割り当ての追加を選択します。

    サブスクリプション レベルで新しい役割の割り当てを追加する方法を示すスクリーンショット。

  4. ロール タブで リーダー を選択し、 次へを選択します。

  5. ユーザー、グループ、またはサービス プリンシパルを選択し、 メンバーの選択を選択します。

    Azure のロール割り当てにメンバーを追加する方法を示すスクリーンショット。

  6. 検索バーを使用してサービス プリンシパルを見つけ、「+」記号を選択して選択し、 [選択] ボタンをクリックします。

  7. [確認 + 割り当て] を選択し、設定を確認してから、もう一度 [確認 + 割り当て] を選択して選択を確認し、役割の割り当てを追加します。

サービス接続を作成する

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

  2. プロジェクト設定>サービス接続を選択し、 新しいサービス接続 を選択して新しいサービス接続を作成します。

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

  4. [サービス プリンシパル (自動)] を選択し、[次へ] を選択します。

  5. EnvironmentAzure Cloud を、 Scope LevelSubscription を選択し、 Subscription IdSubscription Name を入力します。

  6. サービス プリンシパルの作成時に取得した情報を次のフィールドに入力し、完了したら [確認] を選択します。

    • サービス プリンシパル ID: サービス プリンシパルの appId
    • サービス プリンシパル キー: サービス プリンシパルの パスワード
    • テナント ID: サービス プリンシパルのテナント
  7. 検証が成功したら、サービス接続の名前と説明 (オプション) を入力し、[すべてのパイプラインにアクセス許可を与える] チェックボックスをオンにします。

  8. 完了したら [確認して保存] を選択します。

    サービス プリンシパルを使用して新しい Azure Resource Manager サービス接続を作成する方法を示すスクリーンショット。

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

  2. プロジェクト設定>サービス接続>新しいサービス接続 を選択し、 Azure Resource Manager を選択して新しい ARM サービス接続を作成します。

  3. サービス接続に名前を付け、 環境 として Azureクラウド を選択し、 スコープ レベル として サブスクリプション を選択します。

  4. サブスクリプション IDサブスクリプション名を入力します。

  5. サービス プリンシパルの作成時に取得した情報を次のフィールドに入力し、完了したら [接続の確認] を選択します。

    • サービス プリンシパル クライアント ID: サービス プリンシパル appId
    • サービス プリンシパル キー: サービス プリンシパルの パスワード
    • テナント ID: サービス プリンシパルのテナント
  6. [すべてのパイプラインにこの接続の使用を許可する] チェックボックスをオンにし、完了したら [OK] を選択します。

    Azure DevOps Server 2019 でサービス プリンシパルを使用して新しい ARM サービス接続を作成する方法を示すスクリーンショット。

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

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

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

  3. [クラシック エディターを使用する] を選択して、クラシック パイプラインを作成します。

  4. [Azure Repos Git] を選択し、リポジトリと既定のブランチを選択して、 [続行]を選択します。

  5. [.NET デスクトップ] パイプライン テンプレートを選択します。

  6. この例では、最後の 2 つのタスクのみが必要です。 Ctrl キーを押してから最初の 5 つのタスクを選択し、右クリックして [選択したタスクを削除] を選択し、削除します。

    複数のパイプライン タスクを削除する方法を示すスクリーンショット。

  7. + を選択して、新しいタスクを追加します。 コマンド ライン タスクを検索して選択し、 追加 を選択してパイプラインに追加します。 追加したら、次のように構成します。

    • 表示名: ファイルを作成します
    • Script: echo $(YOUR_SECRET_NAME) > secret.txt

    コマンド ライン タスクを構成する方法を示すスクリーンショット。

  8. + を選択して、新しいタスクを追加します。 Azure Key Vault タスクを検索して選択し、[追加*] を選択してパイプラインに追加します。 追加したら、次のように構成します。

    • 表示名: Azure Key Vault
    • Azure サブスクリプション: 前に作成したサービス プリンシパルのサービス接続を選択します
    • Key Vault: キー コンテナーを選択します
    • シークレット フィルター: シークレット名のカンマ区切りのリスト、または選択したキー コンテナーからすべてのシークレットをダウンロードする場合は * のままにします

    クラシック パイプラインで Azure Key Vault タスクを設定する方法を示すスクリーンショット。

  9. ファイルのコピー タスクを選択し、次のように必須フィールドに入力します。

    • 表示名: コピーファイル
    • 内容: secret.txt
    • ターゲット フォルダ: $(build.artifactstagingdirectory)

    クラシック パイプラインでファイルのコピー タスクを設定する方法を示すスクリーンショット。

  10. アーティファクトの公開 タスクを選択し、次のように必須フィールドに入力します。

    • 表示名: アーティファクトの公開
    • 公開するパス: $(build.artifactstagingdirectory)
    • アーティファクト名: ドロップ
    • アーティファクトの公開場所: Azure パイプラインs

    クラシック パイプラインでアーティファクトの公開タスクを設定する方法を示すスクリーンショット。

  11. [保存してキュー]を選択し、次に [実行] を選択してパイプラインを実行します。

  12. パイプライン実行が完了したら、パイプラインの概要に戻り、公開されたアーティファクトを選択します。

  13. drop>secret.txt を選択して、公開されたアーティファクトをダウンロードします。

    公開されたアーティファクトをダウンロードする方法を示すスクリーンショット。

  14. ダウンロードしたテキスト ファイルを開くと、テキスト ファイルには Azure Key Vault のシークレットが含まれているはずです。

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

  2. [パイプライン] を選択してから [ビルド] を選択します。

  3. 新規>新しいビルド パイプラインを選択します。

  4. [クラシック エディターを使用する] を選択して、新しいクラシック ビルド パイプラインを作成します。

  5. [Azure Repos Git] を選択し、リポジトリと既定のブランチを選択して、 [続行]を選択します。

  6. .Net Desktop パイプライン テンプレートを選択し、 適用を選択します。

  7. この例では、最後の 2 つのタスクのみが必要です。 Ctrl キーを押してから最初の 5 つのタスクを選択し、右クリックして [選択したタスクを削除] を選択し、削除します。

    Azure DevOps Server 2019 のクラシック パイプラインで複数のパイプライン タスクを削除する方法を示すスクリーンショット。

  8. + を選択して、新しいタスクを追加します。 コマンド ライン タスクを検索して選択し、 追加 を選択してパイプラインに追加します。 追加したら、次のように構成します。

    • 表示名: ファイルを作成します
    • Script: echo $(YOUR_SECRET_NAME) > secret.txt

    Azure DevOps Server 2019 のクラシック パイプラインでコマンド ライン タスクを構成する方法を示すスクリーンショット。

  9. + を選択して、新しいタスクを追加します。 Azure Key Vault タスクを検索して選択し、[追加*] を選択してパイプラインに追加します。 追加したら、次のように構成します。

    • 表示名: Azure Key Vault
    • Azure サブスクリプション: 前に作成したサービス プリンシパルのサービス接続を選択します
    • Key Vault: キー コンテナーを選択します
    • シークレット フィルター: シークレット名のカンマ区切りのリスト、または選択したキー コンテナーからすべてのシークレットをダウンロードする場合は * のままにします

    Azure DevOps Server 2019 のクラシック パイプラインで Azure Key Vault タスクを設定する方法を示すスクリーンショット。

  10. ファイルのコピー タスクを選択し、次のように必須フィールドに入力します。

    • 表示名: コピーファイル
    • 内容: secret.txt
    • ターゲット フォルダ: $(build.artifactstagingdirectory)

    Azure DevOps Server 2019 のクラシック パイプラインでファイルのコピー タスクを設定する方法を示すスクリーンショット。

  11. アーティファクトの公開 タスクを選択し、次のように必須フィールドに入力します。

    • 表示名: アーティファクトの公開
    • 公開するパス: $(build.artifactstagingdirectory)
    • アーティファクト名: ドロップ
    • アーティファクトの公開場所: Azure パイプラインs

    Azure DevOps Server 2019 のクラシック パイプラインでアーティファクトの公開タスクを設定する方法を示すスクリーンショット。

  12. Save & queue を選択し、次に Save & queue を選択してビルド パイプラインを実行します。

  13. パイプライン実行が完了したら、 Artifacts を選択し、次に drop を選択します。

  14. 新しく開いたウィンドウで、 drop>secret.txtを選択し、省略記号アイコン (...) を選択してから、 download を選択してテキスト ファイルを保存します。

  15. ダウンロードしたテキスト ファイルを開くと、Azure Key Vault のシークレットが含まれているはずです。

警告

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

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

作成したリソースを削除するには、下記のステップに従います。

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

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

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

よく寄せられる質問

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

答え: ユーザーまたはグループにキー コンテナーに対するシークレット リストのアクセス許可がないことを示すエラーが表示される場合は、次のコマンドを実行して、アプリケーションが 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;