パイプラインからプライベート Key Vault へのアクセス
Azure Key Vault には、キー、シークレット、証明書などの資格情報をシームレスなセキュリティで管理するためのセキュリティで保護されたソリューションが用意されています。 Azure Pipelines を使用すると、Key Vault にアクセスして使用するプロセスを効率化でき、資格情報の格納と取得が簡単になります。
特定のシナリオでは、重要なアプリケーションの最高レベルのセキュリティを確保するために、Key Vault へのアクセスを指定された Azure 仮想ネットワークのみに制限することで、セキュリティに優先順位を付けます。
このチュートリアルでは、次の内容を学習します。
- サービス プリンシパルの作成
- サービス接続を作成する
- 受信アクセス ポイントを構成する
- パイプラインからプライベート Azure Key Vault クエリを実行する
前提条件
Azure DevOps organizationとプロジェクト。 まだ作成していない場合は、organizationまたはプロジェクトを作成します。
Azure サブスクリプション。 無料の Azure アカウントをまだお持ちでない場合は、無料の Azure アカウントを作成します。
Azure Key Vault。 Azure Key Vault をまだお持ちでない場合は、新しい Azure Key Vault を作成します。
プライベート Key Vault にアクセスする
Azure Pipelines を使用すると、開発者は Azure Key Vault を変数グループにリンクし、選択的 Vault シークレットをそれにマップできます。 変数グループとして使用される Key Vault にアクセスできます。
変数グループの構成時間中に、Azure DevOps から。
パイプライン ジョブの実行時に、セルフホステッド エージェントから。
サービス プリンシパルの作成
新しいサービス プリンシパルを作成することから始めましょう。これにより、Azure リソースにアクセスできるようになります。 次に、このサービス プリンシパルを使用して Azure DevOps で新しい ARM サービス接続を作成し、Azure Pipelines から Azure Key Vault に対してクエリを実行できるようにします。
Azure Portalに移動します。
[Cloud Shell]を開き、[Bash] を選択します。
次のコマンドを実行して、新しいサービス プリンシパルを作成します。
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
次の手順でサービス接続を作成するために使用するため、必ず出力をコピーしてください。
サービス接続を作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。
[Azure Resource Manager]、>[次へ] の順に選択し、[サービス プリンシパル (手動)]>[次へ] の順に選択します。
Environment に Azure Cloud を、 Scope Level に Subscription を選択し、 Subscription Id と Subscription Name を入力します。
サービス プリンシパル情報を入力し、[検証] を選択します。
正常に検証されたら、サービス接続に名前を付けて、説明を追加し、[すべてのパイプラインに権限を許可する] チェックボックスをオンにします。 完了したら [確認して保存] を選択します。
Azure DevOps コレクションにサインインし、プロジェクトに移動します。
[プロジェクト設定]>[サービス接続]>[新サービス接続] の順に選択します。
[Azure Resource Manager] を選択してサービス接続に名前をつけ、[環境] に [Azure クラウド] を、[範囲レベル] に [サブスクリプション] を選択します。
サブスクリプション ID と サブスクリプション名を入力します。
サービス プリンシパル情報を入力し、[接続を検証] を選択します。
[すべてのパイプラインにこの接続の使用を許可する] チェックボックスをオンにし、完了したら [OK] を選択します。
ヒント
サービス プリンシパル接続を確認できない場合は、サービス プリンシパルにサブスクリプションへの読み取り権限を付与します。
Azure Devops からプライベート Key Vault にアクセスする
このセクションでは、Azure DevOps からプライベート Key Vault にアクセスするための 2 つの方法について説明します。 まず、[変数グループ] を使用して Key Vault のシークレットをリンクおよびマップし、静的 IP 範囲を許可して受信アクセスを設定します。 Azure Pipelines では、[変数グループ] から Azure Key Vault に対してクエリを実行するときに、ポストされた Azure DevOps パブリック IP が使用されるため、受信アクセスが確立されます。 そのため、Azure Key Vault ファイアウォールに受信接続を追加することで、Azure Key Vault に正常に接続できます。
2 つ目の方法では、Microsoft がホストするエージェントの IP アドレスを Key Vault のファイアウォール許可リストに動的に追加し、Key Vault のクエリを実行し、完了後に IP を削除する方法を示します。 この 2 つ目のアプローチはデモンストレーション用であり、Azure Pipelines では推奨されるアプローチではありません。
1 - Key Vault シークレットを変数グループにマップする
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン]>[ライブラリ] の順に選択し、[+ 変数グループ] を選択します。
変数グループに名前を付け、トグル ボタンを選択して、[Azure Key Vault のシークレットを変数としてリンク] ボタンを有効にします。
ドロップダウン メニューから先ほど作成した Azure サービス接続を選択し、Key Vault を選択します。
上に示すように、「指定された Azure サービス接続には、選択した Key Vault に対する「Get、List」シークレット管理アクセス許可が必要です。」というエラー メッセージが表示される場合。 Azure Portalで Key Vault に移動し、[アクセス制御 (IAM)]>[ロールの割り当てを追加]>[Key Vault シークレット ユーザー]>[次へ] の順に選択し、サービス プリンシパルを追加し、完了したら、[レビューして割り当て] を選択します。
シークレットを追加し、完了したら [保存] を選択します。
2 - Azure DevOps からの受信アクセスを構成する
Azure DevOps から Key Vault へのアクセスを有効にするには、特定の静的 IP 範囲からのアクセスを許可する必要があります。 これらの範囲は、Azure DevOps 組織の地理的な場所によって決まります。
Azure DevOps 組織にサインインします。
[組織の設定] を選択します。
[概要] に移動すると、ページの下部に地理的な場所が一覧表示されます。
静的 IP 範囲からのアクセスを許可するように Key Vault を構成します。
3 - 変数グループを使用してプライベート Key Vault をクエリする
この例では、以前に設定し、サービス プリンシパルで承認された変数グループを使用して、リンクされた変数グループを使用するだけで、プライベート Azure Key Vault からシークレットのクエリとコピーを行います。 Azure Pipelines では、変数グループから Azure Key Vault に対してクエリを実行するときに、ポストされたパブリック 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 に対してクエリを実行します。 次に、Key Vault 許可リストに追加し、残りのタスクに進み、最後に Key Vault のファイアウォール許可リストから IP を削除します。
Note
このアプローチはデモンストレーション用であり、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()
重要
パイプラインから Key Vault にアクセスするために使用しているサービス プリンシパルが、Key Vault のアクセス制御 (IAM) 内で Key Vault 共同作成者 ロールを保持していることを確認します。
セルフホステッド エージェントからプライベート Key Vault にアクセスする
Azure Pipelines エージェントからプライベート Key Vault にアクセスできるようにするには、セルフホステッド エージェント (Windows、Linux、Mac) または Scale Set エージェントを使用する必要があります。 これは、他の汎用コンピューティング サービスと同様に、Microsoft がホストするエージェントは、信頼されたサービスの Key Vault の一覧に含まれていないためです。
プライベート Key Vault との接続を確立するには、Key Vaultのプライベート エンドポイントを構成して、見通し接続を指定する必要があります。 このエンドポイントはルーティング可能であり、そのプライベート DNS 名をセルフホステッド パイプライン エージェントから解決できる必要があります。
1 - セルフホステッド エージェントからの受信アクセスを構成する
指定された指示に従って、仮想ネットワークを作成する。
Azure Portal ページ上部にある検索バーで、Azure Key Vault を検索します。
検索結果に Key Vault が表示されたら、それを選択して、[設定]>[ネットワーク] の順に選択します。
[プライベート エンドポイント接続]、[作成] の順に選択し、新しいプライベート エンドポイントを作成します。
以前作成した仮想ネットワークをホストするリソース グループを選択します。 インスタンスに名前とネットワーク インターフェイス名を指定し、以前作成した仮想ネットワークと同じリージョンを選択します。 完了したら、 [次へ] を選択します。
[接続方法] に対して [ディレクトリの Azure リソースに接続] を選択し、[リソースの種類] ドロップダウン メニューで、[Microsoft.KeyVault/vaults] を選択します。 ドロップダウン メニューで [リソース] を選択します。 [対象サブリソース] に、valt の値が自動入力されます。 完了したら、 [次へ] を選択します。
[仮想ネットワーク] タブで、[仮想ネットワーク] と以前作成した[サブネット] を選択して、残りのフィールドは既定値のままにします。 完了したら、 [次へ] を選択します。
[DNS] と [タグ] タブで作業を続行し、既定の設定をそのまま使用します。 [レビューして作成] タブで、作業が完了したら、[作成] を選択します。
リソースがデプロイされたら、Key Vault、>[設定]>[ネットワーク設定]>[プライベート エンドポイント接続] の順に選択すると、[接続状態] [承認]でプライベート エンドポイントが一覧されます。 別のディレクトリの Azure リソースにリンクする場合は、リソース所有者が接続要求を承認するまで待機します。
2 - 仮想ネットワークを許可する
Azure Portal に移動し、Azure Key Vault を検索します。
[設定]>[ネットワーク設定] の順に選択しl[ファイアウォールおよび仮想ネットワーク] タブにアクセスしたことを確認します。
[仮想ネットワークを追加]>[既存の仮想ネットワークを追加] の順に選択します。
ドロップダウン メニューで [サブスクリプション] を選択し、以前作成した仮想ネットワークを選択したら、[サブネット] を選択します。
完了したら、[追加] を選択し、ページ下部までスクロールし、[適用] を選択して変更を保存します。
3 - セルフホステッド エージェントからプライベート Key Vault をクエリする
次の例では、仮想ネットワークの VM に設定されたエージェントを使用して、変数グループを介してプライベート Key Vault をクエリします。
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 にプライベート Key Vault への受信アクセス権を付与しない場合は、AzureKeyVault タスクを使用して Key Vault をクエリします。 ただし、Key Vault ファイアウォール設定でエージェントをホストする仮想ネットワークを許可する必要があります。
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.
これは、パブリック アクセスが無効になっており、プライベート エンドポイント接続もファイアウォール例外も設定されていないことを示します。 [#configure-inbound-access-from-a-self--hosted-agent] と 「Azure DevOps からの受信アクセスを構成」の手順に従い、プライベート Key Vault へのアクセスを設定します。
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>
このエラー メッセージは、Key Vault のパブリック アクセスが無効になっており、[このファイアウォールをバイパスする信頼された Microsoft サービス] オプションがオフになっているが、クライアント IP アドレスが Key Vault のファイアウォールに追加されていないことを示します。 Azure Portal で Key Vault に移動し、[設定]>[ネットワーク設定] の順に選択し、クライアント IP を ファイアウォール許可リストに追加します。
Error: Client address is not authorized and caller is not a trusted service.
必ず、Key Vault の許可リストに所在地の IPV4 範囲を追加してください。 詳細については、「Azure DevOps からの受信アクセスを構成」を参照してください。 または、「Microsoft がホストする エージェント IP を動的に許可する」 を参照して、実行中にクライアント IP を Key Vault のファイアウォールに追加する方法を確認してください。