次の方法で共有


Azure DevOpsでサービス プリンシパル & マネージド ID を使用する

Azure DevOps Services

サービス プリンシパルとマネージド ID は、Azure DevOps 自動化ワークフローに対してセキュリティで保護されたスケーラブルな認証を提供します。 これらの Microsoft Entra ID の種類では、従来の個人用アクセス トークン (AT) に対するセキュリティが強化され、資格情報の自動管理、トークンの有効期間の短縮、エンタープライズ レベルのアクセス制御が提供されます。

サービス プリンシパルとマネージド ID の利点

セキュリティの強化

  • 有効期間の短いトークン: Microsoft Entra トークンは 1 時間ごとに期限切れとなり、PAT と比較して露出リスクが軽減されます (最長 1 年間続く可能性があります)
  • 自動ローテーション: マネージド ID は資格情報のローテーションを自動的に処理します
  • 保存されたシークレットなし: コードまたは構成に有効期間の長い資格情報を格納する必要がなくなります

オペレーショナル エクセレンス

  • 一元管理: Microsoft Entra ID ポリシーと Azure DevOps アクセス許可を使用してアクセスを制御する
  • 監査機能: 包括的なログ記録を使用して認証とアクセス パターンを追跡する
  • 効率的なスケーリング: 個々のユーザー依存関係なしでエンタープライズ 自動化シナリオをサポートする

先進認証

  • 標準ベース: OAuth 2.0 および OpenID Connect プロトコルを使用します
  • 多要素認証のサポート: 組織のセキュリティ ポリシーを継承します
  • 条件付きアクセス: コンテキストに基づいて高度なセキュリティ ポリシーを適用する

サービス プリンシパルとマネージド ID について

サービス プリンシパル

サービス プリンシパル は、テナント内のアプリケーションを表す Microsoft Entra オブジェクトです。 アプリケーションでできること、アクセスできるリソース、およびアプリケーションを使用できるユーザーを定義します。 Microsoft Entra ID でアプリケーションを登録すると、サービス プリンシパルが自動的に作成され、アプリケーションがリソースを認証してアクセスするための安全な方法が提供されます。

主な特性:

  • Microsoft Entra ID でのアプリケーション登録を通じて作成
  • マルチテナント シナリオのサポート
  • 明示的な資格情報管理 (証明書またはクライアント シークレット) が必要
  • さまざまな環境で認証する必要があるアプリケーションに最適

管理されたアイデンティティー

マネージド ID は、Azure が自動的に管理する特殊な種類のサービス プリンシパルです。 Azure リソースの Microsoft Entra ID に自動的にマネージド ID を提供することで、開発者が資格情報を管理する必要がなくなります。

マネージド ID の種類:

システム割り当ての管理対象 ID

  • 自動的に作成され、特定の Azure リソースに関連付けられている
  • Azure によって管理されるライフサイクル (リソースが削除されたときに削除されます)
  • Azure リソースとの一対一の関係
  • 1 つの Azure リソースにデプロイされたアプリケーションに最適

ユーザー割り当てマネージドID

  • スタンドアロンの Azure リソースとして作成
  • 複数の Azure リソースに割り当てることができます
  • 関連付けられているリソースから独立して管理されるライフサイクル
  • 複数のリソースで実行されるアプリケーションや共有 ID が必要なアプリケーションに最適

ヒント

各型を使用する場合:

  • サービス プリンシパル: クラウド間デプロイ、CI/CD パイプライン、Azure 外部のアプリケーション
  • システム割り当てマネージド ID: 単一の Azure リソース アプリケーション (Azure Functions、App Service)
  • ユーザー割り当てマネージド ID: マルチリソース アプリケーション、共有 ID シナリオ

実装ガイド

Azure DevOps 認証のサービス プリンシパルまたはマネージド ID を実装するには、次の手順に従います。 完全なコード例については、 サンプル アプリケーションを参照してください。

手順 1: ID を作成する

デプロイ シナリオに基づいて適切な ID の種類を選択します。

オプション A: サービス プリンシパルを作成する (アプリケーションの登録)

サービス プリンシパルは、柔軟なデプロイ オプションを必要とする CI/CD パイプライン、クロスクラウド シナリオ、アプリケーションに適しています。

  1. Microsoft Entra 管理センターでアプリケーションを登録する
  2. [ アプリの登録>新しい登録] に移動します。
  3. アプリケーションを構成します。
    • 名前: アプリケーションのわかりやすい名前
    • アカウントの種類: 適切なテナント サポートを選択する
    • リダイレクト URI: サービス間シナリオでは空白のままにします
  4. 認証資格情報を作成します。
    • 推奨: セキュリティ強化のために証明書をアップロードする
    • 別の方法: クライアント シークレットを作成する (定期的なローテーションが必要)

Von Bedeutung

アプリケーションを登録すると、Azure によってアプリケーション オブジェクトとサービス プリンシパル オブジェクトの両方が作成されます。 アプリケーションのオブジェクト ID ではなく、Azure DevOps に追加するときに、サービス プリンシパルのオブジェクト ID (エンタープライズ アプリケーションにあります) を使用します。

詳細については、次の記事を参照してください。

オプション B: マネージド ID を作成する

マネージド ID は、Azure でホストされるアプリケーションにとって最も簡単な認証エクスペリエンスを提供します。

システム割り当てマネージド ID の場合:

  1. Azure リソース (App Service、Function App など) に移動します。
  2. Identity>System assigned に移動します。
  3. [状態] を [オン] に切り替えます。
  4. 設定を 保存します。

ユーザー割り当てマネージド ID の場合:

  1. Azure portal でマネージド ID を作成します。
  2. リソースの作成>管理 ID に移動します。
  3. 基本設定を構成し、リソースを作成します。
  4. 必要に応じてリソースに割り当てます。

詳細については、次の記事を参照してください。

手順 2: Id を Azure DevOps に追加する

Microsoft Entra ID で ID を作成した後、それを Azure DevOps 組織に追加してリソースへのアクセスを許可します。

前提条件:

  • プロジェクト コレクション管理者 (PCA) の役割、または
  • 招待ポリシーでチーム管理者がユーザーを追加できる場合のプロジェクト管理者またはチーム管理者ロール

Azure DevOps ポータルを使用して追加します。

  1. 組織の設定>ユーザーに移動します
  2. [ ユーザーの追加] を選択します
  3. サービス プリンシパルまたはマネージド ID の表示名を入力します。
  4. 適切なアクセス レベルとプロジェクト アクセスを選択します。
  5. 招待を送信します。

プログラムによる追加:ServicePrincipalEntitlements REST API を使用してプロセスを自動化します。

ヒント

正しい ID を見つける: アプリケーション登録のオブジェクト ID ではなく、Microsoft Entra 管理センターの [エンタープライズ アプリケーション] ページからサービス プリンシパルのオブジェクト ID を使用します。

Users Hub のサービス プリンシパルとマネージド ID のスクリーンショット。

テナントの制限: Azure DevOps 組織が接続されているのと同じテナントからのみ ID を追加できます。 テナント間でのシナリオに関しては、FAQの回避策をご覧ください。

手順 3: アクセス許可を構成する

Azure DevOps 内でサービス プリンシパルまたはマネージド ID の詳細なアクセス許可を構成します。 他の Azure サービスとは異なり、Azure DevOps は Microsoft Entra アプリケーションのアクセス許可ではなく、独自のアクセス許可モデルを使用します。

アクセス許可オプション:

  • 直接割り当て: ID に直接アクセス許可を割り当てる
  • グループ メンバーシップ: Azure DevOps または Microsoft Entra セキュリティ グループに追加する
  • アクセス レベル: 適切なライセンス レベルを割り当てる (Basic、Basic + Test Plans、Visual Studio サブスクライバー)

のベスト プラクティス:

  • 最小限の特権を適用する: 必要な最小限のアクセス許可のみを付与する
  • グループの使用: メンテナンスを容易にするためにグループを使用してアクセス許可を管理する
  • 定期的なレビュー: アクセス許可を定期的に監査する

アクセス許可管理オプション:

Von Bedeutung

Azure DevOps と Microsoft Entra のアクセス許可: Azure DevOps では、Microsoft Entra ID アプリケーションのアクセス許可は使用されません。 すべてのアクセス制御は、Azure DevOps 独自のアクセス許可システムを通じて管理され、プロジェクトレベルとリソース レベルの詳細なアクセス許可を可能にします。

手順 4: Microsoft Entra ID トークンを取得する

Azure DevOps API とサービスを使用してアプリケーションを認証するためのアクセス トークンを取得します。

サービス プリンシパルの場合

クライアント資格情報フローの使用:

POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id={client-id}
&scope=https://app.vssps.visualstudio.com/.default
&client_secret={client-secret}
&grant_type=client_credentials

証明書認証の使用 (推奨):

using Microsoft.Identity.Client;

var app = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithCertificate(certificate)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

var result = await app
    .AcquireTokenForClient(new[] { "https://app.vssps.visualstudio.com/.default" })
    .ExecuteAsync();

string accessToken = result.AccessToken;

マネージド ID の場合

Azure リソースから:

using Azure.Identity;
using Azure.Core;

var credential = new ManagedIdentityCredential();
var tokenRequest = new TokenRequestContext(new[] { "https://app.vssps.visualstudio.com/.default" });
var token = await credential.GetTokenAsync(tokenRequest);

string accessToken = token.Token;

Azure Instance Metadata Service (IMDS) の使用:

GET http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://app.vssps.visualstudio.com/
Metadata: true

アドホック操作用の Azure CLI

1 回限りの操作またはテストでは、Azure CLI を使用します。

# For service principal
az login --service-principal --username {client-id} --password {client-secret} --tenant {tenant-id}
az account get-access-token --resource https://app.vssps.visualstudio.com/

# For managed identity (from Azure resource)
az login --identity
az account get-access-token --resource https://app.vssps.visualstudio.com/

詳細なガイダンスについては、 Microsoft Entra トークンの取得に関する記事を参照してください。

手順 5: Azure DevOps でトークンを使用する

取得したトークンを使用して、REST API 呼び出しやその他の Azure DevOps 操作を認証します。

認証済み API 呼び出しの実行:

using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", accessToken);

var response = await client.GetAsync(
    "https://dev.azure.com/{organization}/_apis/projects?api-version=7.1");

ビデオの例:

一般的な統合シナリオ:

完全なコード例については、 サンプル アプリケーションを参照してください。

管理に関する考慮事項

サービス プリンシパルとマネージド ID には、ユーザー アカウントと比較して異なる管理特性があります。

ライセンス

  • 各 ID には、参加するすべての組織のライセンスが必要です
  • 複数組織の課金 はサービス プリンシパルに対して適用されません。
  • グループベースのライセンス規則は自動的には適用されません。ライセンスを直接割り当てる

ID 管理:

  • 電子メール アドレスなし - 電子メール経由で招待することはできません
  • Azure DevOps で表示名またはアバターを変更できない
  • 表示名は Microsoft Entra ID から継承されます

グループ メンバーシップ:

  • Microsoft Entra グループと Azure DevOps グループに追加できます
  • 技術的な制限により、Microsoft Entra グループメンバーリストに表示できなくなります (UI の制限のみ)
  • 自分が属する Microsoft Entra グループから引き続きアクセス許可を継承する

具体化:

  • 組織に明示的に追加する必要があります (ユーザーのような自動具体化は行われません)
  • サービス プリンシパルは対話形式でサインインできないため、必須

ユーザー アカウントとの主な違い

サービス プリンシパルとマネージド ID には、通常のユーザーと比べて特定の制限があります。

資格:

  • ✅ API アクセス用の Microsoft Entra トークンを生成する
  • ✅ 適切なアクセス許可で Azure DevOps リソースにアクセスする
  • ✅ セキュリティ グループとチームに参加する
  • ❌ 個人用アクセス トークン (AT) または SSH キーを作成する
  • ❌ 対話形式でサインインするか、Web UI にアクセスする
  • ❌ 組織を作成または所有する
  • Azure DevOps OAuth フローのサポート

課金:

  • 各組織で個別のライセンスとしてカウントされます (複数組織の割引なし)
  • アクセス レベルを直接割り当てる必要があります (グループ ルールは自動的には適用されません)

よく寄せられる質問

Q: PAT の代わりにサービス プリンシパルまたはマネージド ID を使用する必要がある理由

A: サービス プリンシパルとマネージド ID は、個人アクセス トークンよりも大きなセキュリティ上の利点を提供します。

セキュリティの利点:

  • 有効期間が短い: Microsoft Entra トークンの有効期限は 1 時間ごとであり、PAT は最大 1 年間有効です。
  • 自動ローテーション: マネージド ID が資格情報を自動的にローテーションする
  • 共有シークレットなし: 有効期間の長いトークンを格納または誤って公開するリスクを排除します
  • 一元管理: エンタープライズ セキュリティ ポリシーを使用して Microsoft Entra ID を使用して管理

運用上の利点:

  • 監査証跡: 認証とアクセス パターンの完全なログ記録
  • 条件付きアクセス: 場所、デバイス、リスク要因に基づいてポリシーを適用する
  • サービス アカウントなし: 自動化のために個々のユーザー アカウントへの依存関係を排除します

移行の例については、「 APP を Microsoft Entra トークンに置き換える」を参照してください。

Q: サービス プリンシパルとマネージド ID のレート制限は何ですか?

A: サービス プリンシパルとマネージド ID には、ユーザーと同じ レート制限 があります。

Q: この機能を使用すると、コストは高くなりますか?

A: サービス プリンシパルとマネージド ID は、アクセス レベルに基づいてユーザーと同じように価格が設定されます。 主な違い:

  • 複数組織の課金割引なし: 各 ID は、すべての組織で個別のライセンスとしてカウントされます
  • ライセンスの割り当て: アクセス レベルを直接割り当てる必要があります (グループ ルールは自動的に適用されません)
  • 同じ価格レベル: Basic、Basic + Test Plans、Visual Studio サブスクライバー料金が適用されます

Q: 別のテナントのマネージド ID をorganizationに追加できますか?

A: 組織の接続済みテナントからのみ ID を直接追加できます。 テナント間のシナリオでは、次の回避策を使用します。

テナント間マネージド ID のセットアップ:

  1. リソース テナントでユーザー割り当てマネージド ID を作成する
  2. Azure リソースへの割り当て (VM、関数アプリなど)
  3. Key Vault の作成** と証明書の生成 (PEM 以外の形式)
  4. シークレットの取得/一覧表示アクセス許可を使用して Key Vault へのマネージド ID アクセスを許可する
  5. CER 形式の証明書をダウンロードする (公開キーのみ)
  6. ターゲット テナントにアプリケーションを登録する
  7. アプリケーション登録に証明書をアップロードする
  8. Azure DevOps 組織にサービス プリンシパルを追加する
  9. Key Vault の証明書を使用して認証を構成する
// Example: Acquire token using managed identity certificate
public static async Task<string> GetSecret(string keyVaultName, string secretName)
{
    var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net");
    var client = new SecretClient(keyVaultUri, new ManagedIdentityCredential());
    var keyVaultSecret = await client.GetSecretAsync(secretName);
    return keyVaultSecret.Value.Value;
}

private static async Task<AuthenticationResult> GetAppRegistrationAADAccessToken(
    string applicationClientID, string appTenantId)
{
    byte[] privateKeyBytes = Convert.FromBase64String(await GetSecret(keyVaultName, secretName));
    var certificate = new X509Certificate2(privateKeyBytes, (string)null, X509KeyStorageFlags.MachineKeySet);

    var app = ConfidentialClientApplicationBuilder.Create(applicationClientID)
        .WithCertificate(certificate)
        .WithAuthority(new Uri($"https://login.microsoftonline.com/{appTenantId}"))
        .Build();

    var result = await app.AcquireTokenForClient(
        new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" })
        .ExecuteAsync();

    return result;
}

Von Bedeutung

セキュリティのベスト プラクティスのために証明書を定期的にローテーションします。

一般的なエラーと解決

名前または識別子を持つ Git リポジトリが存在しないか、アクセス許可がありません

解決: サービス プリンシパルに少なくとも Basic ライセンスがあることを確認します。 利害関係者 ライセンスでは、リポジトリへのアクセスは提供されません。

オブジェクト ID を持つサービス プリンシパルを作成できませんでした

解決: アプリケーション登録のオブジェクト ID ではなく、 エンタープライズ アプリケーションのサービス プリンシパルのオブジェクト ID を使用していることを確認します。

正しい ID を見つけます。

  1. Microsoft Entra 管理センター > Enterprise アプリケーションに移動する
  2. アプリケーション名を検索する
  3. [エンタープライズ アプリケーション] ページの オブジェクト ID を 使用する

アクセスが拒否されました: ユーザーを追加するためのアクセス許可が必要です

考えられる原因と解決策:

  • ロールが不十分: 招待アクセス許可が有効になっているプロジェクト コレクション管理者またはプロジェクト/チーム管理者である必要があります
  • ポリシーの制限: [チーム管理者とプロジェクト管理者に新しいユーザーの招待を許可する] ポリシーが有効になっているかどうかを確認します
  • ライセンスの割り当て: プロジェクト管理者は招待中にライセンスを割り当てることはできません。ライセンスの変更については PCA にお問い合わせください

Azure DevOps Graphs List API が空のリストを返す

解決:continuationTokenを使用して、すべてのページを反復処理します。 サービス プリンシパルは、API の改ページ動作により、後のページに表示される場合があります。

TF401444: サインインが必要なエラー

解決: 必要なアクセス許可を持つ組織にサービス プリンシパルが適切に追加されていることを確認します。 このエラーは、ID が組織内で認識されていないことを示します。