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 DevOps organizationとプロジェクト。 まだ作成していない場合は、organizationまたはプロジェクトを作成します。
Azure サブスクリプション。 まだ Azure アカウントをお持ちでない場合は、無料で作成してください。
リポジトリの作成
すでに独自のリポジトリがある場合は、次のステップに進みます。 それ以外の場合は、次の手順に従ってリポジトリを初期化します。 この Azure Repo を使用してパイプラインを設定します。
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
Repos を選択し、 Initialize を選択して README を使用してメイン ブランチを初期化します。
Azure Key Vault を作成する
Azure Portal にサインインし、右上隅にある [Cloud Shell] ボタンを選択します。
アカウントに複数の Azure サブスクリプションが関連付けられている場合は、下記のコマンドを使用して既定のサブスクリプションを指定します。
az account list
を使用して、サブスクリプションのリストを生成できます。az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
既定の Azure リージョンを設定します。
az account list-locations
を使用して、使用可能なリージョンのリストを生成できます。az config set defaults.location=<YOUR_REGION>
新しいリソース グループを作成します。
az group create --name <YOUR_RESOURCE_GROUP_NAME>
新しい Azure キー コンテナーを作成します。
az keyvault create \ --name <YOUR_KEY_VAULT_NAME> \ --resource-group <YOUR_RESOURCE_GROUP_NAME>
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 を使用してサービス プリンシパルを作成し、このセクションの次の手順に進みます。
Azure portal に移動し、検索バーを使用して、前に作成したキー コンテナーを見つけます。
[アクセス ポリシー] を選択し、次に [作成] を選択して新しいポリシーを作成します。
シークレット アクセス許可で、 取得 と リストを選択します。
[次へ] を選択し、前に作成したサービス プリンシパルを選択します。 サービス プリンシパルは、Azure リソースへのアクセスを要求しているアプリケーションまたはサービスを表すオブジェクトです。
次へ を選択し、もう一度 次へ を選択します。
ポリシーを確認し、完了したら [作成] を選択します。
ロールの割り当てを追加する
次のステップでは、サービス プリンシパルを使用して ARM サービス接続を作成します。 接続を確認する前に、サービス プリンシパルにサブスクリプション レベルで 読み取り アクセスを許可する必要があります。
Azure portalに移動します。
左側のナビゲーション パネルから [サブスクリプション] を選択し、サブスクリプションを見つけて選択します。
アクセス制御を選択し、 追加>役割の割り当ての追加を選択します。
ロール タブで リーダー を選択し、 次へを選択します。
ユーザー、グループ、またはサービス プリンシパルを選択し、 メンバーの選択を選択します。
検索バーを使用してサービス プリンシパルを見つけ、「+」記号を選択して選択し、 [選択] ボタンをクリックします。
[確認 + 割り当て] を選択し、設定を確認してから、もう一度 [確認 + 割り当て] を選択して選択を確認し、役割の割り当てを追加します。
サービス接続を作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
プロジェクト設定>サービス接続を選択し、 新しいサービス接続 を選択して新しいサービス接続を作成します。
[Azure Resource Manager] を選択してから、[次へ] を選択します。
[サービス プリンシパル (自動)] を選択し、[次へ] を選択します。
Environment に Azure Cloud を、 Scope Level に Subscription を選択し、 Subscription Id と Subscription Name を入力します。
サービス プリンシパルの作成時に取得した情報を次のフィールドに入力し、完了したら [確認] を選択します。
- サービス プリンシパル ID: サービス プリンシパルの appId。
- サービス プリンシパル キー: サービス プリンシパルの パスワード。
- テナント ID: サービス プリンシパルのテナント。
検証が成功したら、サービス接続の名前と説明 (オプション) を入力し、[すべてのパイプラインにアクセス許可を与える] チェックボックスをオンにします。
完了したら [確認して保存] を選択します。
Azure DevOps コレクションにサインインし、プロジェクトに移動します。
プロジェクト設定>サービス接続>新しいサービス接続 を選択し、 Azure Resource Manager を選択して新しい ARM サービス接続を作成します。
サービス接続に名前を付け、 環境 として Azureクラウド を選択し、 スコープ レベル として サブスクリプション を選択します。
サブスクリプション ID と サブスクリプション名を入力します。
サービス プリンシパルの作成時に取得した情報を次のフィールドに入力し、完了したら [接続の確認] を選択します。
- サービス プリンシパル クライアント ID: サービス プリンシパル appId。
- サービス プリンシパル キー: サービス プリンシパルの パスワード。
- テナント ID: サービス プリンシパルのテナント。
[すべてのパイプラインにこの接続の使用を許可する] チェックボックスをオンにし、完了したら [OK] を選択します。
新しいパイプラインを作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン] を選択してから [新しいパイプライン] を選択します。
[クラシック エディターを使用する] を選択して、クラシック パイプラインを作成します。
[Azure Repos Git] を選択し、リポジトリと既定のブランチを選択して、 [続行]を選択します。
[.NET デスクトップ] パイプライン テンプレートを選択します。
この例では、最後の 2 つのタスクのみが必要です。 Ctrl キーを押してから最初の 5 つのタスクを選択し、右クリックして [選択したタスクを削除] を選択し、削除します。
+ を選択して、新しいタスクを追加します。 コマンド ライン タスクを検索して選択し、 追加 を選択してパイプラインに追加します。 追加したら、次のように構成します。
- 表示名: ファイルを作成します
- Script:
echo $(YOUR_SECRET_NAME) > secret.txt
+ を選択して、新しいタスクを追加します。 Azure Key Vault タスクを検索して選択し、[追加*] を選択してパイプラインに追加します。 追加したら、次のように構成します。
- 表示名: Azure Key Vault
- Azure サブスクリプション: 前に作成したサービス プリンシパルのサービス接続を選択します
- Key Vault: キー コンテナーを選択します
- シークレット フィルター: シークレット名のカンマ区切りのリスト、または選択したキー コンテナーからすべてのシークレットをダウンロードする場合は * のままにします
ファイルのコピー タスクを選択し、次のように必須フィールドに入力します。
- 表示名: コピーファイル
- 内容: secret.txt
- ターゲット フォルダ: $(build.artifactstagingdirectory)
アーティファクトの公開 タスクを選択し、次のように必須フィールドに入力します。
- 表示名: アーティファクトの公開
- 公開するパス: $(build.artifactstagingdirectory)
- アーティファクト名: ドロップ
- アーティファクトの公開場所: Azure パイプラインs
[保存してキュー]を選択し、次に [実行] を選択してパイプラインを実行します。
パイプライン実行が完了したら、パイプラインの概要に戻り、公開されたアーティファクトを選択します。
drop>secret.txt を選択して、公開されたアーティファクトをダウンロードします。
ダウンロードしたテキスト ファイルを開くと、テキスト ファイルには Azure Key Vault のシークレットが含まれているはずです。
Azure DevOps コレクションにサインインし、プロジェクトに移動します。
[パイプライン] を選択してから [ビルド] を選択します。
新規>新しいビルド パイプラインを選択します。
[クラシック エディターを使用する] を選択して、新しいクラシック ビルド パイプラインを作成します。
[Azure Repos Git] を選択し、リポジトリと既定のブランチを選択して、 [続行]を選択します。
.Net Desktop パイプライン テンプレートを選択し、 適用を選択します。
この例では、最後の 2 つのタスクのみが必要です。 Ctrl キーを押してから最初の 5 つのタスクを選択し、右クリックして [選択したタスクを削除] を選択し、削除します。
+ を選択して、新しいタスクを追加します。 コマンド ライン タスクを検索して選択し、 追加 を選択してパイプラインに追加します。 追加したら、次のように構成します。
- 表示名: ファイルを作成します
- Script:
echo $(YOUR_SECRET_NAME) > secret.txt
+ を選択して、新しいタスクを追加します。 Azure Key Vault タスクを検索して選択し、[追加*] を選択してパイプラインに追加します。 追加したら、次のように構成します。
- 表示名: Azure Key Vault
- Azure サブスクリプション: 前に作成したサービス プリンシパルのサービス接続を選択します
- Key Vault: キー コンテナーを選択します
- シークレット フィルター: シークレット名のカンマ区切りのリスト、または選択したキー コンテナーからすべてのシークレットをダウンロードする場合は * のままにします
ファイルのコピー タスクを選択し、次のように必須フィールドに入力します。
- 表示名: コピーファイル
- 内容: secret.txt
- ターゲット フォルダ: $(build.artifactstagingdirectory)
アーティファクトの公開 タスクを選択し、次のように必須フィールドに入力します。
- 表示名: アーティファクトの公開
- 公開するパス: $(build.artifactstagingdirectory)
- アーティファクト名: ドロップ
- アーティファクトの公開場所: Azure パイプラインs
Save & queue を選択し、次に Save & queue を選択してビルド パイプラインを実行します。
パイプライン実行が完了したら、 Artifacts を選択し、次に drop を選択します。
新しく開いたウィンドウで、 drop>secret.txtを選択し、省略記号アイコン (...) を選択してから、 download を選択してテキスト ファイルを保存します。
ダウンロードしたテキスト ファイルを開くと、Azure Key Vault のシークレットが含まれているはずです。
警告
このチュートリアルは、学習に使用することのみを目的としています。 セキュリティのベスト プラクティスとシークレットを安全に扱う方法については、「Azure Key Vault を使用してサーバー アプリのシークレットを管理する」を参照してください。
リソースをクリーンアップする
作成したリソースを削除するには、下記のステップに従います。
プロジェクトをホストする新しい組織を作成した場合は、 組織を削除する方法を参照してください。それ以外の場合は、 プロジェクトを削除します。
このチュートリアル中に作成されたすべての 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;