Azure Key Vaultは、キー、シークレット、証明書など、資格情報を安全に管理する方法を提供します。 Azure Pipelinesを使用すると、キー コンテナーにアクセスして資格情報を格納および取得するプロセスを効率化できます。
特定のシナリオでは、組織は、指定されたAzure仮想ネットワークのみにキー コンテナーへのアクセスを制限することで、セキュリティに優先順位を付けます。 この制限により、重要なアプリケーションの最高レベルのセキュリティが保証されます。 このチュートリアルでは、パイプラインがプライベート Azure Key Vaultからデータを照会および取得できるように、認証を設定し、受信アクセスを構成する方法について説明します。
前提条件
| Product | 必要条件 |
|---|---|
| Azure DevOps | - Azure DevOps 組織です。 - Azure DevOps プロジェクト。 アクセス許可: - プロジェクト内のすべてのパイプラインへのアクセスを許可するには、プロジェクト 管理者グループのメンバーである必要があります。 - サービス接続を作成するには、 サービス接続の管理者ロールまたは作成者ロールが必要です。 |
| 紺碧 | - Azure サブスクリプション。 - Azure キー コンテナー。 |
プライベート Key Vault にアクセスする
開発者は、Azure Pipelinesを使用して、Azureキー コンテナーを変数グループにリンクし、選択的なコンテナー シークレットをそれにマップできます。 変数グループとして使用されるキー ボールトにアクセスできます。
- 変数グループの構成時に Azure DevOps から。
- パイプライン ジョブの実行時にセルフホステッド エージェントから。
秘密キー コンテナーへのアクセスを設定するには、次の手順を順番に実行します。
- Azure リソースで認証するサービス プリンシパルを作成します。
- サービス プリンシパルを使用して、Azure DevOpsでAzure Resource Managerサービス接続を作成します。
- Azureでサービス プリンシパルのフェデレーション資格情報を作成します。
サービス プリンシパルの作成
Azure リソースで認証するサービス プリンシパルを作成します。
Azure ポータルにアクセスします。
上部のメニューで Azure Cloud Shell を開き、 Bash を選択します。
次のコマンドを実行して、新しいサービス プリンシパルを作成します。
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAMEコマンド出力をコピーします。 これらの値は、次の手順でサービス接続を作成するときに必要になります。
サービス接続を作成する
サービス プリンシパルを作成した後、その出力値を使用して、Azure DevOpsでAzure Resource Managerサービス接続を作成します。
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。
[Azure Resource Manager] を選択してから、[次へ] を選択します。
[ID の種類] で、ドロップダウン メニューから [アプリの登録 (自動)] を選択します。
[資格情報] の場合は、ワークロード ID フェデレーションとして既定の推奨値のままにします。
[スコープ レベル] で [サブスクリプション] を選択し、ドロップダウン メニューからサブスクリプションを選択します。
指定したリソース グループのみにアクセスを制限する場合は、リソース グループを選択します。
サービス接続の名前を入力し、[ すべてのパイプラインにアクセス許可を付与 する] チェック ボックスをオンにして、すべてのパイプラインでこのサービス接続を使用できるようにします。
保存を選びます。
フェデレーション資格情報を作成する
サービス接続を保存したら、Azureでフェデレーション資格情報を構成して、サービス プリンシパルとAzure DevOps間の信頼を確立します。
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サービス接続を作成します。
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 DevOpsパブリック IP を使用するため、キー コンテナーファイアウォールでそれらの IP 範囲を許可する必要があります。
2 番目の方法では、パイプラインの開始時に、Microsoftホスト型エージェントの IP アドレスを Key Vault ファイアウォール許可リストに動的に追加し、キー コンテナーにクエリを実行してから、最後に IP を削除します。 この方法はデモンストレーションのみを目的としており、運用環境での使用はお勧めしません。
手順 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からの受信アクセスを構成する
変数グループを構成したら、組織の地理的リージョンの静的 IP 範囲を追加して、Azure DevOpsからキー コンテナーへの受信アクセスを許可します。
Azure DevOps 組織にサインインします。
[組織の設定] を選択します。
[ 概要 ] に移動して地理的な場所を見つけます。
-
重要
米国受信接続の場合は、必ずすべての米国リージョンの IP 範囲を追加してください。
静的 IP 範囲からのアクセスを許可するように Key Vault を構成します。
手順 3: 変数グループを使用して秘密キー コンテナーにクエリを実行する
変数グループがリンクされ、受信アクセスが構成されたら、次のパイプラインを使用して秘密キー コンテナーにクエリを実行し、取得したシークレットをコピーします。 Azure Pipelines は、変数グループ経由でキー コンテナーを照会するためにパブリック 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 を動的に許可する
この方法では、パイプラインは起動時にMicrosoftホストされるエージェント IP に対してクエリを実行し、それを Key Vault ファイアウォールの許可リストに追加し、キー コンテナー タスクを実行してから、パイプラインが終了する前に 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 = "$(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ホストされるエージェントは、信頼されたサービスのキー コンテナーの一覧には含まれません。
プライベート キー ボールトへの接続を確立するには、見通しアクセス用のプライベート エンドポイントを構成してください。 このエンドポイントはルーティング可能で、プライベート DNS 名はセルフホステッド パイプライン エージェントから解決できる必要があります。
手順 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'
トラブルシューティング
一般的な Key Vault アクセス エラーをトラブルシューティングするには、次のガイダンスを使用します。
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 が Key Vault ファイアウォールの許可リストに含まれていないことを示しています。 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 ファイアウォールに追加することを参照してください。