Azure Key Vault には、キー、シークレット、証明書などの資格情報をシームレスなセキュリティで管理するためのセキュリティで保護されたソリューションが用意されています。 Azure Pipelinesを使用すると、キー コンテナーにアクセスして資格情報を格納および取得するプロセスを効率化できます。
特定のシナリオでは、重要なアプリケーションの最高レベルのセキュリティを確保するために、Key Vault へのアクセスを指定された Azure 仮想ネットワークのみに制限することで、セキュリティに優先順位を付けます。
このチュートリアルでは、以下の内容を学習します。
- サービス プリンシパルを作成する。
- サービス接続を作成します。
- 受信アクセス ポイントを構成します。
- パイプラインからプライベート Azure キー コンテナーに対してクエリを実行します。
前提条件
- Azure DevOps 組織、プロジェクト。 まだ作成していない場合は、組織またはプロジェクトを作成してください。
- Azure サブスクリプション。 無料の Azure アカウントをまだお持ちでない場合は、無料の Azure アカウントを作成します。
- Azure Key Vault。
もしまだお持ちでない場合は新しいAzureキー ボールト を作成してください。
プライベート Key Vault にアクセスする
開発者は、Azure Pipelinesを使用して、Azureキー コンテナーを変数グループにリンクし、選択的なコンテナー シークレットをそれにマップできます。 変数グループとして使用されるキー ボールトにアクセスできます。
- 変数グループの構成時間中に、Azure DevOps から。
- パイプライン ジョブの実行時に、セルフホステッド エージェントから。
サービス プリンシパルの作成
まず、Azureリソースにアクセスできるように、新しいサービス プリンシパルを作成します。 次に、Azure DevOpsで新しいAzure Resource Manager サービス接続を作成する必要があります。 次に、サービス接続を確認してAzure DevOpsに保存する前に、Azureでサービス プリンシパルのフェデレーション資格情報を設定します。
Azure ポータルにアクセスします。
サービス メニューで Azure Cloud Shell を開き、 Bash を選択します。
次のコマンドを実行して、新しいサービス プリンシパルを作成します。
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME次の手順でサービス接続を作成するために使用するため、必ず出力をコピーしてください。
サービス接続を作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。
[Azure Resource Manager] を選択してから、[次へ] を選択します。
[ID の種類] で、ドロップダウン メニューから [アプリの登録 (自動)] を選択します。
[資格情報] の場合は、ワークロード ID フェデレーションとして既定の推奨値のままにします。
[スコープ レベル] で [サブスクリプション] を選択し、ドロップダウン メニューからサブスクリプションを選択します。
指定したリソース グループのみにアクセスを制限する場合は、リソース グループを選択します。
サービス接続の名前を入力し、[ すべてのパイプラインにアクセス許可を付与 する] チェック ボックスをオンにして、すべてのパイプラインでこのサービス接続を使用できるようにします。
保存を選びます。
フェデレーション資格情報を作成する
Azure ポータルに移動し、検索バーにサービス プリンシパルのクライアント ID を入力して、アプリケーションを選択します。
Manage で、Certificates & シークレット フェデレーション認証情報 を選択します。資格情報の追加を選択し、フェデレーテッド資格情報シナリオでその他の発行者を選択します。
発行者の場合は、次の URL を貼り付けて、プレースホルダーを組織の GUID に置き換えます。 組織 ID を確認するには、Organization 設定>Microsoft Entra に移動します。 ディレクトリに接続されているAzure DevOps組織の一覧をダウンロードします。
https://login.microsoftonline.com/<TENANT_ID>/v2.0[サブジェクト識別子] には、次の URL を貼り付けます。 プレースホルダーを組織名、プロジェクト名、サービス接続名に置き換えます。
ENTRA_PREFIX/sc/ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAMEフェデレーション資格情報の名前を入力し、[ 追加] を選択します。
サービス接続を作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。
Azure Resource Manager>Next を選択し、 Service principal (manual)>Next を選択します。
Environment で、Azure Cloud を選択し、Scope level で Subscription を選択します。 次に、サブスクリプション ID とサブスクリプション名を入力します。
サービス プリンシパル情報を入力し、[検証] を選択します。
検証が成功したら、サービス接続に名前を付け、説明を追加して、[ すべてのパイプラインにアクセス許可を付与 する] チェック ボックスをオンにします。 [Verify and save] を選択します。
ヒント
サービス プリンシパル接続を確認できない場合は、サービス プリンシパル閲覧者にサブスクリプションへのアクセス権を付与します。
Azure DevOps から秘密キー コンテナーにアクセスする
このセクションでは、Azure DevOpsから秘密キー コンテナーにアクセスするための 2 つの方法について説明します。 最初に、変数グループを使用してキー コンテナーからシークレットをリンクおよびマップし、続いて静的 IP 範囲を許可して受信アクセスを設定します。 Azure Pipelines は、変数グループから Azure Key Vault に対してクエリを実行するときに、Azure DevOps 公開IPアドレスを使用するため、着信アクセスを設定します。 Key Vault ファイアウォールに受信接続を追加することで、Azureキー コンテナーに正常に接続できます。
2 番目の方法では、Microsoftホストされるエージェントの IP アドレスをキー コンテナーのファイアウォール許可リストに動的に追加し、キー コンテナーのクエリを実行し、完了後に IP を削除する方法を示します。 この 2 つ目の方法は、デモンストレーションのみを目的としています。 この方法は、Azure Pipelinesにはお勧めしません。
手順 1: キー コンテナーシークレットを変数グループにマップする
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン]>[ライブラリ] の順に選択し、[+ 変数グループ] を選択します。
変数グループに名前を付け、Azure Key Vaultのシークレットを変数としてリンクをオンにします。
前に作成したサービス接続を選択し、キー コンテナーを選択して、[ 承認] を選択します。
[ 変数] で [ 追加 ] を選択してシークレットを追加し、[ 保存] を選択します。
注
サービス接続に Get および List アクセス許可があることを確認し、サービス プリンシパルにプライベート キー コンテナーのキー コンテナー シークレット ユーザー ロールが割り当てられていることを確認します。
手順 1.1: サービス接続のアクセス許可を設定する
Azure キー コンテナーに移動し、Access ポリシー を選択します。
Create を選択し、Secret のアクセス許可で、Get および List アクセス許可を追加し、 Next を選択します。
検索バーにサービス接続を追加して選択し、次を選択します。
[ 次へ ] をもう一度選択し、設定を確認して、[ 確認と作成] を選択します。
手順 1.2: サービス プリンシパルのアクセス許可を設定する
Azure キー コンテナーに移動し、Access コントロール (IAM) を選択します。
[追加]>[ロールの割り当ての追加] を選択し、[ロール] タブを選択します。
Key Vault Secrets User ロールを選択し、 Nextを選択します。
[ メンバーの選択] を選択し、サービス プリンシパルを追加して、[選択] を 選択します。
レビュー + 割り当て を選択します。
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン]>[ライブラリ] の順に選択し、[+ 変数グループ] を選択します。
変数グループに名前を付け、Azure Key Vaultのシークレットを変数としてリンクをオンにします。
ドロップダウン メニューから先ほど作成したAzure サービス接続を選択し、キー コンテナーを選択します。
エラー メッセージ「指定したAzureサービス接続には、選択したキー ボールトに対する「Get、List」シークレット管理アクセス許可が必要です」が表示されることがあります。Azure ポータルでキー コンテナに移動し、[アクセス制御 (IAM)]>[ロールの割り当てを追加する]>[キー コンテナ シークレットのユーザー]>[次へ] を選択します。 サービス プリンシパルを追加し、[ 確認と割り当て] を選択します。
シークレットを追加し、[保存] を選択 します。
手順 2: Azure DevOpsからの受信アクセスを構成する
Azure DevOps から Key Vault へのアクセスを有効にするには、特定の静的 IP 範囲からのアクセスを許可する必要があります。 これらの範囲は、Azure DevOps組織の地理的な場所によって決まります。
Azure DevOps 組織にサインインします。
[組織の設定] を選択します。
[ 概要 ] に移動して地理的な場所を見つけます。
-
重要
米国受信接続の場合は、必ずすべての米国リージョンの IP 範囲を追加してください。
静的 IP 範囲からのアクセスを許可するように Key Vault を構成します。
手順 3: 変数グループを使用して秘密キー コンテナーにクエリを実行する
この例では、以前に設定され、サービス プリンシパルで承認された変数グループを使用して、リンクされた変数グループを使用して、プライベート Azure キー コンテナーからシークレットのクエリとコピーを行います。 Azure Pipelinesは、変数グループから Azure キー コンテナーに対してクエリを実行するときに、ポストされたパブリック IP を使用するため、このアクションが正常に機能するには、構成された受信アクセスを使用してください。
variables:
- group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
代替方法: Microsoftホストされるエージェント IP を動的に許可する
この 2 つ目の方法では、パイプラインの先頭にあるMicrosoftホストされるエージェントの IP に対してクエリを実行します。 次に、キー ボールトの許可リストに追加します。 残りのタスクに進み、キー コンテナーのファイアウォール許可リストから IP を削除します。
注
この方法は、デモンストレーションのみを目的としています。 この方法は、Azure Pipelinesにはお勧めしません。
- task: AzurePowerShell@5
displayName: 'Allow agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
echo "##vso[task.setvariable variable=agentIP]ip"
- task: AzureKeyVault@2
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
KeyVaultName: 'YOUR_KEY_VAULT_NAME'
SecretsFilter: '*'
RunAsPreJob: false
- task: AzurePowerShell@5
displayName: 'Remove agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ipRange = $env:agentIP + "/32"
Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
condition: succeededOrFailed()
重要
パイプラインからキー コンテナにアクセスするために使用しているサービス プリンシパルに、キー コンテナのアクセス制御 (IAM) 内のキー コンテナ共同作成者のロールがあることを確認します。
セルフホステッド エージェントからプライベート Key Vault にアクセスする
Azure Pipelines エージェントから秘密キー保管庫にアクセスするには、セルフホステッド エージェント (Windows、Linux、またはMac) またはVirtual Machine Scale Sets エージェントを使用する必要があります。 この要件は、他Microsoft汎用コンピューティング サービスと同様に、ホストされるエージェントがキー コンテナーの信頼されたサービスの一覧に含まれていないためです。
プライベート キー コンテナとの接続を確立するには、キー コンテナのプライベート エンドポイントを構成して、見通し通信を指定する必要があります。 このエンドポイントはルーティング可能であり、そのプライベート ドメイン ネーム システム名をセルフホステッド パイプライン エージェントから解決できる必要があります。
手順 1: セルフホステッド エージェントからの受信アクセスを構成する
手順に従って 仮想ネットワークを作成します。
Azure ポータルで、ページの上部にある検索バーを使用して、Azureキー コンテナーを見つけます。
キー コンテナーを選択し、 設定>Networking に移動します。
[プライベート エンドポイント接続]、[作成] の順に選択し、新しいプライベート エンドポイントを作成します。
新しいプライベート エンドポイント接続を作成する方法を示す Azure キー ボルトのスクリーンショット
前に作成した仮想ネットワークをホストするリソース グループを選択します。 インスタンスの名前とネットワーク インターフェイス名を入力し、先ほど作成した仮想ネットワークと同じリージョンを選択していることを確認します。 次へを選択します。
Azure Key Vault の新しいプライベート エンドポイント インスタンスを作成するときに [基本] タブを構成する方法を示すスクリーンショット。 Connection メソッドで、ディレクトリ内のAzure リソースに接続 を選択します。 リソースの種類で、ドロップダウン メニューからMicrosoft.KeyVault/vaultsを選択します。 ドロップダウン メニューからリソースを選択します。 ターゲット サブリソース には、値 ボールト が自動的に設定されます。 次へを選択します。
Virtual Network タブで、前に作成したvirtual networkとサブネットを選択し、残りのフィールドは既定値のままにします。 次へを選択します。
[DNS] タブと [タグ] タブの既定の設定をそのまま使用します。 [確認と作成] タブで、[作成] を選択します。
リソースがデプロイされたら、キー コンテナーに移動し 、設定>Networking>Private エンドポイント接続を選択します。 プライベート エンドポイントは、[ 接続] 状態 が [承認済み] と表示されている必要があります。 別のディレクトリ内のAzure リソースにリンクする場合は、リソース所有者が接続要求を承認するのを待つ必要があります。
手順 2: 仮想ネットワークを許可する
Azure ポータル に移動し、Azureキー コンテナーを見つけます。
> ネットワーク] を選択し、[ファイアウォールと仮想ネットワーク] タブにいることを確認します。
[仮想ネットワークを追加]>[既存の仮想ネットワークを追加] の順に選択します。
ドロップダウン メニューからサブスクリプションを選択し、先ほど作成した仮想ネットワークを選択し、サブネットを選択します。
[ 追加] を選択し、ページの一番下までスクロールし、[ 適用 ] を選択して変更を保存します。
手順 3: セルフホステッド エージェントからプライベートキー ボールトにクエリを実行する
次の例では、仮想ネットワークの仮想マシンに設定されたエージェントを使用して、変数グループを介して秘密キー コンテナーに対してクエリを実行します。
pool: Self-hosted-pool
variables:
group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
秘密キー コンテナーへの受信アクセスAzure DevOps許可しない場合は、AzureKeyVault タスクを使用して、キー コンテナーのクエリを実行できます。 キー コンテナーのファイアウォール設定でエージェントをホストする仮想ネットワークを許可する必要があります。
pool: Self-hosted-pool
steps:
- task: AzureKeyVault@2
inputs:
azureSubscription: '$(SERVICE_CONNECTION_NAME)'
keyVaultName: $(KEY_VAULT_NAME)
SecretsFilter: '*'
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
トラブルシューティング
次のエラーが発生した場合は、このセクションの手順に従って問題のトラブルシューティングと解決を行います。
Public network access is disabled and request is not from a trusted service nor via an approved private link.このエラーは、パブリック アクセスが無効になっており、プライベート エンドポイント接続とファイアウォールの例外が設定されなかったことを示します。
セルフホステッド エージェントからの受信アクセスの構成 とAzure DevOps の手順に従って、秘密キー コンテナーへのアクセスを設定します。Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>このエラーメッセージは、キー ボールトのパブリック アクセスが無効化されており、信頼された Microsoft サービスがこのファイアウォールをバイパスするオプションが空白のままで、クライアントの IP アドレスがキー ボールト ファイアウォールに追加されていないことを示しています。 Azure ポータルでキー コンテナーに移動し、Settings>Networking を選択し、クライアント IP をファイアウォールの許可リストに追加します。
Error: Client address is not authorized and caller is not a trusted service.必ず、あなたの地域のIPV4範囲をキー コンテナーの許可リストに追加してください。 詳細については、「
Azure DevOps を参照してください。または、「Microsoft がホストする エージェント IP を動的に許可する」 を参照して、実行中にクライアント IP を Key Vault のファイアウォールに追加する方法を確認してください。