Azure SQL を使用した Microsoft Entra サービス プリンシパル

適用対象:Azure SQL データベースAzure SQL Managed Instance

Azure SQL リソースは、Microsoft Entra ID (旧称 Azure Active Directory) のサービス プリンシパルとマネージド ID を使用するアプリケーションのプログラムによるアクセスをサポートしています。

サービス プリンシパル (Microsoft Entra アプリケーション) のサポート

この記事は、Microsoft Entra ID に登録されているアプリケーションに適用されます。 アプリケーションの資格情報を使用してAzure SQLにアクセスすることは、職務分離のセキュリティ原則をサポートし、組織がデータベースに接続する各アプリケーションの正確なアクセスを設定できるようにします。 特別な形式のサービス プリンシパルであるマネージド ID は、パスワードレスであるため、開発者が管理する資格情報の必要性を排除します。これらは特に推奨されます。

Microsoft Entra ID により、OAuth 2.0 On-Behalf-Of Flow (OBO) などの高度な認証シナリオがさらに有効になります。 OBOは、アプリケーション自体が委任された権限なしにデータベースへのアクセスを許可されるべきでないシナリオのために、アプリケーションがサインインしたユーザーの資格情報を要求することを可能にします。

Microsoft Entra アプリケーションの詳細については、「Microsoft Entra ID のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」および「Azure PowerShell を使用して Azure サービス プリンシパルを作成する」を参照してください。

サービス プリンシパルを使用した Microsoft Entra ユーザーの作成

この機能のサポートは、ユーザーの介入なしに SQL Database またはSQL Managed Instanceで Microsoft Entra プリンシパルを作成および管理する Microsoft Entra アプリケーションの自動化処理で役立ちます。 サービス プリンシパルは、グループのメンバーまたはスタンドアロンIDとして、SQL 論理サーバーまたはManaged Instanceの Microsoft Entra 管理者になることができます。 アプリケーションでは、SQL Database または SQL Managed Instance での Microsoft Entra オブジェクトの作成を自動化し、データベース ユーザーの作成を完全に自動化できます。

サービス プリンシパル を作成して Microsoft Entra ユーザーを作成する

アプリケーションを使用してAzure SQLにアクセスする場合、Microsoft Entraのユーザーやログインを作成するには、デフォルトではサービスプリンシパルやマネージドアイデンティティに割り当てられていない権限が必要です:Microsoft Graphからテナント内のユーザー、グループ、アプリケーションを読み取る能力です。 これらのアクセス許可は、SQL エンジンが、ログインまたはユーザーの作成に使用される ID のオブジェクトまたはアプリケーション ID を含む、CREATE LOGIN または CREATE USER 指定された ID を検証し、重要な情報をプルするために必要です。

Microsoft Entra ユーザーがこれらのコマンドを実行すると、Azure SQL の Microsoft アプリケーション は委任されたアクセス許可を使用してサインインしているユーザーを偽装し、そのアクセス許可を使用して Microsoft Graph にクエリを実行します。 このフローは、アプリケーションが別のアプリケーションを偽装できないため、サービス プリンシパルでは実行できません。 代わりに、SQL エンジンは、そのサーバー ID (SQL マネージド インスタンス、Azure SQL 論理サーバー、または Azure Synapse ワークスペースに割り当てられたプライマリ マネージド ID) を使用しようとします。 サーバーIDは存在し、Microsoft Graphのクエリ権限を持っていなければならず、そうでない場合は操作が失敗します。

以下の手順では、サーバーにマネージドIDを割り当て、Microsoft Graphの権限を割り当てる方法を説明します。これにより、サービスプリンシパルがデータベース内でMicrosoft Entraユーザーとログインを作成できるようになります。

  1. サーバー ID を割り当てます。 サーバー ID は、システム割り当てまたはユーザー割り当てのマネージド ID の場合があります。 詳細については、「Azure SQL の Microsoft Entra ID でのユーザー割り当てマネージド ID」を参照してください。

    • 次の PowerShell コマンドは、システム割り当てマネージド ID でプロビジョニングされた新しい論理サーバーを作成します。
    New-AzSqlServer -ResourceGroupName <resource group> -Location <Location name> -ServerName <Server name> -ServerVersion "12.0" -SqlAdministratorCredentials (Get-Credential) -AssignIdentity
    

    詳しくは、New-AzSqlServer コマンド、または SQL Managed Instance の New-AzSqlInstance コマンドをご覧ください。

    • 既存の論理サーバーに対しては、次のコマンドを実行して、システム割り当てマネージド ID を追加します。
    Set-AzSqlServer -ResourceGroupName <resource group> -ServerName <Server name> -AssignIdentity
    

    詳しくは、Set-AzSqlServer コマンド、または SQL Managed Instance の Set-AzSqlInstance コマンドをご覧ください。

    • サーバー ID がサーバーに割り当てられているかどうかを確認するには、Get-AzSqlServer コマンドを実行するか、SQL Managed Instanceの場合はGet-AzSqlInstanceコマンドを実行します。

    Note

    サーバー ID は REST API および CLI コマンドを使用して割り当てることもできます。 詳細については、「az sql server create」、「az sql server update」、および「Servers - REST API」を参照してください。

  2. Microsoft Graph に対してクエリを実行するためのアクセス許可をサーバー ID に付与します。 これは、複数の方法で行うことができます。Microsoft Entra Directory Readers ロールに ID を追加するか、個々の Microsoft Graph のアクセス許可を ID に割り当てるか、ディレクトリ閲覧者ロールを持つロール割り当て可能なグループに ID を追加します。

    • ロール割り当て可能なグループにサーバー ID を追加します

      運用環境では、テナント管理者がロール割り当て可能なグループを作成し、ディレクトリ閲覧者ロールを割り当てることをお勧めします。 それから、グループ所有者は、それらのアクセス許可を継承して、グループにサーバー ID を追加できます。 これにより、グローバル 管理istrator または Privileged Roles 管理istrator が個々のサーバー ID にアクセス許可を付与する必要がなくなります。これにより、管理者は、このシナリオでグループの所有者にアクセス許可の割り当てを委任できます。 詳細については、「Azure SQL での Microsoft Entra IDのディレクトリ閲覧者ロール」を参照してください。

    • Microsoft Sentinel マネージド ID にアクセス許可を割り当てます

      個々の Microsoft Graph アクセス許可をサーバー ID に割り当てるには、Microsoft Entra Global 管理istrator ロールまたは Privileged Roles 管理istrator ロールが必要です。 これは、サーバー ID に必要のないアクセス許可がロールに含まれているため、ディレクトリ閲覧者ロールの割り当てよりも推奨されます。 個々のMicrosoft Graph読み取り権限のみを割り当てることで、テナント内のサーバーIDの権限が制限され、最小特権の原則が維持されます。 手順については、Azure SQL 用の Microsoft Entra ID でのユーザー割り当てマネージド IDをご参照ください。

    • ディレクトリ閲覧者ロールにサーバー ID を追加する

      サーバー ID をディレクトリ閲覧者ロールに追加するには、Microsoft Entra Global 管理者 ロールまたは Privileged Roles 管理者 ロールのメンバーである必要があります。 運用環境では、このオプションは 2 つの理由で推奨されません。ディレクトリ閲覧者ロールは、サーバー ID に必要なよりも多くのアクセス許可を付与します。ロールの割り当てプロセスでは、(グループの使用とは異なり) 各サーバー ID に対する管理者の承認が引き続き必要です。 Microsoft Entra 管理者のプロビジョニングMicrosoft Entra管理 (SQL Managed Instance) に関する記事に記載されている SQL Managed Instance の手順に従います。

トラブルシューティング

トラブルシューティングの際に、次のエラーに遭遇する可能性があります。

Msg 33134, Level 16, State 1, Line 1
Principal 'test-user' could not be resolved.
Error message: 'Server identity is not configured. Please follow the steps in "Assign an Azure AD identity to your server and add Directory Reader permission to your identity" (https://aka.ms/sqlaadsetup)'

このエラーは、サーバー ID が作成されていないか、Microsoft Graph のアクセス許可が割り当てられていないことを示しています。 「論理サーバーに ID を割り当てる」および「論理サーバーの ID にディレクトリ閲覧者のアクセス許可を割り当てる」の手順に従ってください。

制限事項

  • サービス プリンシパルは、テナントの境界を越えて認証することはできません。 別のテナントで作成された Microsoft Entra アプリケーションを使用して SQL Database または SQL Managed Instance にアクセスしようとすると失敗します。

  • Azure SQL の Microsoft Entra 管理者として Microsoft Entra アプリケーションを設定するには、Az.Sql 2.9.0 以降のモジュールが必要です。 最新のモジュールにアップグレードしてください。

次のステップ