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 を選択し、Import を選択します。 次のリポジトリ URL を入力し、 Import を選択します。
https://github.com/MicrosoftDocs/pipelines-dotnet-core
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>
認証の設定
ユーザー割り当てマネージド ID を作成する
Azure ポータルにサインインし、検索バーで Managed Identities サービスを検索します。
[作成] を選択し、次のように必須フィールドに入力します。
- サブスクリプション: ドロップダウン メニューからサブスクリプションを選択します。
- リソース グループ: 既存のリソース グループを選択するか、新しいリソース グループを作成します。
- リージョン: ドロップダウン メニューからリージョンを選択します。
- 名前: ユーザー割り当てマネージド ID の名前を入力します。
完了したら [確認と作成] を選択します。
デプロイが完了したら、 リソースに移行を選択し、次の手順で使用する Subscription と Client ID 値をコピーします。
Settings>Properties に移動し、後で使用するためにマネージド ID の Tenant ID 値をコピーします。
キー コンテナーのアクセス ポリシーをセットアップする
Azure ポータルに移動し、検索バーを使用して、前に作成したキー コンテナーを見つけます。
Access ポリシーを選択し、Create を選択して新しいポリシーを追加します。
[アクセス許可ので、Get と List チェック ボックスをオンにします。
[次へ] を選択し、先ほど作成したマネージド ID の Client ID を検索バーに貼り付けます。 [マネージド ID] を選択します。
[次へ] を選択し、もう一度 [次へをします。
新しいポリシーを確認し、完了したら Create を選択します。
サービス接続を作成する
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
プロジェクト設定>サービス接続を選択し、 新しいサービス接続 を選択して新しいサービス接続を作成します。
Azure Resource Manager を選択し、 Next を選択します。
識別子の種類で、ドロップダウン メニューから Managed ID を選択します。
手順 1: マネージド ID の詳細では、次のようにフィールドに入力します。
マネージド ID のサブスクリプション: マネージド ID を含むサブスクリプションを選択します。
マネージド ID のリソース グループ: マネージド ID をホストしているリソース グループを選択します。
マネージド ID: ドロップダウン メニューからマネージド ID を選択します。
Step 2: Azure Scope の場合は、次のようにフィールドに入力します。
サービス接続のスコープ レベル: [サブスクリプション] を選択します。
サービス接続のサブスクリプション: マネージド ID がアクセスするサブスクリプションを選択します。
サービス接続のリソース グループ: (省略可能) マネージド ID アクセスを 1 つのリソース グループに制限するように指定します。
手順 3: サービス接続の詳細:
サービス接続名: サービス接続の名前を指定します。
サービス管理リファレンス: (省略可能) ITSM データベースからのコンテキスト情報。
説明: (省略可能) 説明を追加します。
Securityで、すべてのパイプラインに対するアクセス許可を付与するチェック ボックスをオンにして、すべてのパイプラインでこのサービス接続を使用できるようにします。 このオプションを選択しない場合は、このサービス接続を使用する各パイプラインへのアクセス権を手動で付与する必要があります。
[保存] を選択し、サービス接続を確認して作成します。
パイプラインから Key Vault シークレットにアクセスする
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン] を選択してから [新しいパイプライン] を選択します。
[Azure Repos Git (YAML)] を選択し、リポジトリを選択します。
[スタート パイプライン] テンプレートを選択します。
デフォルトのパイプラインには、echo コマンドを実行するスクリプトが含まれます。 これらのスクリプトは不要なので、削除できます。
AzureKeyVault タスクを追加します。プレースホルダーは、前に作成したサービス接続の名前とキー コンテナーの名前に置き換えます。 YAML ファイルは次のスニペットのようになります。
trigger: - main pool: vmImage: ubuntu-latest steps: - task: AzureKeyVault@2 displayName: Azure Key Vault inputs: azureSubscription: 'SERVICE_CONNECTION_NAME' KeyVaultName: 'KEY_VAULT_NAME' SecretsFilter: '*' RunAsPreJob: false
次のタスクを追加して、シークレットをコピーして公開しましょう。 この例はデモンストレーションのみを目的としており、運用環境では実装しないでください。
trigger: - main pool: vmImage: ubuntu-latest steps: - task: AzureKeyVault@2 displayName: Azure Key Vault inputs: azureSubscription: 'SERVICE_CONNECTION_NAME' KeyVaultName: 'KEY_VAULT_NAME' SecretsFilter: '*' RunAsPreJob: false - task: CmdLine@2 displayName: Create file inputs: script: 'echo $(SECRET_NAME) > secret.txt' - task: CopyFiles@2 displayName: Copy file inputs: Contents: secret.txt targetFolder: '$(Build.ArtifactStagingDirectory)' - task: PublishBuildArtifacts@1 displayName: Publish Artifact inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
[保存して実行]を選択し、もう一度選択して変更をコミットし、パイプラインをトリガーします。 Azure リソースへのパイプライン アクセスを許可するか尋ねられることがあります。ダイアログが表示されたら、[許可] を選択します。 パイプラインを承認する必要があるのは 1 回だけです。
[CmdLine] タスクを選択してログを表示します。
パイプライン実行が完了したら、パイプラインの概要に戻り、公開されたアーティファクトを選択します。
drop>secret.txt を選択してダウンロードします。
ダウンロードしたテキスト ファイルを開くと、テキスト ファイルには Azure Key Vault のシークレットが含まれているはずです。
警告
このチュートリアルは、学習に使用することのみを目的としています。 セキュリティのベスト プラクティスとシークレットを安全に扱う方法については、「Azure Key Vault を使用してサーバー アプリのシークレットを管理する」を参照してください。
リソースをクリーンアップする
作成したリソースを削除するには、下記のステップに従います。
プロジェクトをホストする新しい組織を作成した場合は、 組織を削除する方法を参照してください。それ以外の場合は、 プロジェクトを削除します。
このチュートリアル中に作成されたすべての Azure リソースは、単一のリソース グループの下でホストされます。 次のコマンドを実行して、リソース グループとそのすべてのリソースを削除します。
az group delete --name <YOUR_RESOURCE_GROUP_NAME>
よく寄せられる質問
質問: "ユーザーまたはグループに、シークレット リストのアクセス許可がありません" というエラーが表示されます。どうすればよいですか?
答え: ユーザーまたはグループにキー コンテナーに対するシークレット リストのアクセス許可がないことを示すエラーが表示される場合は、次のコマンドを実行して、アプリケーションが Azure Key Vault 内のキーまたはシークレットにアクセスすることを承認します。
az account set --subscription <YOUR_SUBSCRIPTION_ID>
az login
$spnObjectId = az ad sp show --id <YOUR_SERVICE_PRINCIPAL_ID>
az keyvault set-policy --name <YOUR_KEY_VAULT_NAME> --object-id $spnObjectId --secret-permissions get list