チュートリアル: Service Connector を使用してデータベース サービスへのパスワードレス接続を作成する

パスワードレス接続では、マネージド ID を使用して Azure サービスにアクセスします。 この方法では、マネージド ID のシークレットを手動で追跡および管理する必要はありません。 これらのタスクは、Azure 内部で安全に処理されます。

Service Connector を使用すると、Azure Spring Apps、Azure App Service、Azure Container Apps などのアプリ ホスティング サービスでマネージド ID を使用できます。 また、Service Connector により、Azure Database for PostgreSQL、Azure Database for MySQL、Azure SQL Database などのデータベース サービスはマネージド ID を受け入れるように構成されます。

このチュートリアルでは、Azure CLI を使用して以下のタスクを実了します。

  • Azure CLI を使用して初期環境を確認する。
  • Service Connector を使用してパスワードレス接続を作成する。
  • Service Connector によって生成された環境変数または構成を使用して、データベース サービスにアクセスする。

前提条件

環境を設定する

取引先企業

Azure CLI から az login を使用してサインインします。 Azure Cloud Shell を使用している場合、または既にログインしている場合は、az account show を使用して認証済みアカウントを確認します。

Service Connector パスワードレス拡張機能をインストールする

Azure CLI 用 Service Connector パスワードレス拡張機能をインストールします。

az extension add --name serviceconnector-passwordless --upgrade

パスワードレス接続を作成する

次に、Azure App Service を例として使用し、マネージド ID を使用する接続を作成します。

以下を使用する場合:

注意

Azure portal を使用する場合は、Azure App ServiceAzure Spring Apps、または Azure Container Apps[Service Connector] ブレードに移動し、[作成] を選択して接続を作成します。 Azure portal は自動的にコマンドを作成し、Cloud Shell でコマンド実行をトリガーします。

次の Azure CLI コマンドでは、--client-type パラメーターを使用します。 az webapp connection create postgres-flexible -h を実行してサポートされているクライアントの種類を取得し、アプリケーションに一致するものを選択します。

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type java

Azure Database for MySQL - フレキシブル サーバーでは、Microsoft Entra 認証を有効にするためにユーザー割り当てマネージド ID が必要です。 詳細については、「Azure Database for MySQL - フレキシブル サーバーの Microsoft Entra 認証を設定する」を参照してください。 次のコマンドを使用して、ユーザー割り当てマネージド ID を作成できます。

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

重要

ユーザー割り当てマネージド ID を作成したら、グローバル管理者または特権ロール管理者に、この ID に対して次のアクセス許可を付与するように依頼します。

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

詳細については、「Active Directory 認証」の「アクセス許可」セクションを参照してください。

次に、Service Connector を使用して、システム割り当てマネージド ID で MySQL データベースにアプリを接続します。

次の Azure CLI コマンドでは、--client-type パラメーターを使用します。 az webapp connection create mysql-flexible -h を実行してサポートされているクライアントの種類を取得し、アプリケーションに一致するものを選択します。

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

次の Azure CLI コマンドでは、--client-type パラメーターを使用します。 az webapp connection create sql -h を実行してサポートされているクライアントの種類を取得し、アプリケーションに一致するものを選択します。

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

この Service Connector コマンドは、バックグラウンドで次のタスクを完了します。

  • システム割り当てマネージド ID を有効にするか、Azure App Service/Azure Spring Apps/Azure Container Apps によってホストされるアプリ $APPSERVICE_NAME のユーザー ID を割り当てます。
  • Microsoft Entra 管理者を現在サインインしているユーザーに設定します。
  • システム割り当てマネージド ID、ユーザー割り当てマネージド ID、またはサービス プリンシパルのデータベース ユーザーを追加します。 データベース $DATABASE_NAME のすべての特権をこのユーザーに付与します。 ユーザー名は、前のコマンド出力の接続文字列で確認できます。
  • AZURE_MYSQL_CONNECTIONSTRINGAZURE_POSTGRESQL_CONNECTIONSTRING、または AZURE_SQL_CONNECTIONSTRING という名前の構成を、データベースの種類に基づいて Azure リソースに設定します。
    • App Service の場合、構成は [アプリの設定] ブレードで設定されます。
    • Spring Apps の場合、構成はアプリケーションの起動時に設定されます。
    • Container Apps の場合、構成は環境変数に設定されます。 すべての構成とその値は、Azure portal の [Service Connector] ブレードで取得できます。

Microsoft Entra 認証を使用してデータベースに接続する

接続を作成した後、アプリケーションで接続文字列を使って、Microsoft Entra 認証でデータベースに接続できます。 たとえば、次のソリューションを使って、Microsoft Entra 認証でデータベースに接続できます。

.NET の場合、パスワードレス接続をサポートするためのプラグインやライブラリはありません。 Azure.Identity のようなクライアント ライブラリを使って、マネージド ID またはサービス プリンシパルのアクセス トークンを取得できます。 次に、アクセス トークンをパスワードとして使用してデータベースに接続できます。 次のコードを使用する場合は、使用する認証型のコード スニペットの一部をコメント解除します。

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

次に、Service Connector を使用する前に PostgreSQL フレキシブル サーバーでテーブルとシーケンスを作成している場合、所有者として接続し、Service Connector によって作成された <aad-username> にアクセス許可を付与する必要があります。 Service Connector によって設定された接続文字列または構成からのユーザー名は aad_<connection name> のようになるはずです。 Azure portal を使用する場合、Service Type 列の横にある展開ボタンを選択し、値を取得します。 Azure CLI を使用する場合、CLI コマンドの出力の configurations をチェックします。

次に、クエリを実行してアクセス許可を付与します

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

<owner-username><owner-password> は、他のユーザーにアクセス許可を付与できる既存のテーブルの所有者です。 <aad-username> は、サービス コネクタによって作成されたユーザーです。 これらを実際の値に置き換えます。

次のコマンドを使用して結果を検証します。

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

.NET の場合、パスワードレス接続をサポートするためのプラグインやライブラリはありません。 Azure.Identity のようなクライアント ライブラリを使って、マネージド ID またはサービス プリンシパルのアクセス トークンを取得できます。 次に、アクセス トークンをパスワードとして使用してデータベースに接続できます。 次のコードを使用する場合は、使用する認証型のコード スニペットの一部をコメント解除します。

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

その他のコード サンプルについては、「マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する」を参照してください。

  1. 依存関係をインストールします。

    dotnet add package Microsoft.Data.SqlClient
    
  2. サービス コネクタによって追加された環境変数から Azure SQL Database 接続文字列を取得します。

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    詳細については、「Active Directory Managed Identity 認証の使用」を参照してください。

詳細については、「Microsoft SQL Server に対するクライアント プログラミングのホーム ページ」を参照してください。

Azure ホスティング サービスにアプリケーションをデプロイする

最後に、Azure ホスティング サービスにアプリケーションをデプロイします。 そのソース サービスでは、マネージド ID を使用して Azure 上のターゲット データベースに接続できます。

Azure App Service の場合は、az webapp deploy コマンドを使用してアプリケーション コードをデプロイできます。 詳細については、「クイックスタート: ASP.NET Web アプリをデプロイする」を参照してください。

その後、ログをチェックするか、アプリケーションを呼び出して、Azure データベースに正常に接続できるかどうかを確認できます。

トラブルシューティング

権限

アクセス許可関連のエラーが発生した場合は、コマンド az account show を使用して Azure CLI サインイン済みユーザーを確認します。 正しいアカウントでサインインしていることを確認します。 次に、Service Connector とのパスワードレス接続を作成するために必要な可能性がある次のアクセス許可があることを確認します。

アクセス許可 操作
Microsoft.DBforPostgreSQL/flexibleServers/read データベース サーバーの情報を取得するために必要
Microsoft.DBforPostgreSQL/flexibleServers/write データベース サーバーに対して Microsoft Entra 認証を有効にするために必要
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write ローカル IP アドレスがブロックされている場合にファイアウォール規則を作成するために必要
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete セキュリティの問題を回避するために、Service Connector によって作成されたファイアウォール規則を元に戻すために必要
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Azure CLI ログイン ユーザーがデータベース サーバーの Microsoft Entra 管理者であるかどうかを確認するために必要
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Azure CLI ログイン ユーザーをデータベース サーバーの Microsoft Entra 管理者として追加するために必要
権限 操作
Microsoft.DBforMySQL/flexibleServers/read データベース サーバーの情報を取得するために必要
Microsoft.DBforMySQL/flexibleServers/write 指定されたユーザー割り当てマネージド ID をデータベース サーバーに追加するために必要
Microsoft.DBforMySQL/flexibleServers/firewallRules/write ローカル IP アドレスがブロックされている場合にファイアウォール規則を作成するために必要
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete セキュリティの問題を回避するために、Service Connector によって作成されたファイアウォール規則を元に戻すために必要
Microsoft.DBforMySQL/flexibleServers/administrators/read Azure CLI ログイン ユーザーがデータベース サーバーの Microsoft Entra 管理者であるかどうかを確認するために必要
Microsoft.DBforMySQL/flexibleServers/administrators/write Azure CLI ログイン ユーザーをデータベース サーバーの Microsoft Entra 管理者として追加するために必要
権限 操作
Microsoft.Sql/servers/read データベース サーバーの情報を取得するために必要
Microsoft.Sql/servers/firewallRules/write ローカル IP アドレスがブロックされている場合にファイアウォール規則を作成するために必要
Microsoft.Sql/servers/firewallRules/delete セキュリティの問題を回避するために、Service Connector によって作成されたファイアウォール規則を元に戻すために必要
Microsoft.Sql/servers/administrators/read Azure CLI ログイン ユーザーがデータベース サーバーの Microsoft Entra 管理者であるかどうかを確認するために必要
Microsoft.Sql/servers/administrators/write Azure CLI ログイン ユーザーをデータベース サーバーの Microsoft Entra 管理者として追加するために必要

場合によっては、アクセス許可は必要ありません。 たとえば、Azure CLI で認証されたユーザーが既に SQL Server の Active Directory 管理者である場合、Microsoft.Sql/servers/administrators/write アクセス許可は必要ありません。

Microsoft Entra ID

エラー ERROR: AADSTS530003: Your device is required to be managed to access this resource. が発生した場合は、このデバイスを Microsoft Entra ID に参加させる方法について IT 部門に問い合わせてください。 詳細については、「Microsoft Entra 参加済みデバイス」を参照してください。

Service Connector は、アカウントの情報とホスティング サービスのマネージド ID を取得するために、Microsoft Entra ID にアクセスする必要があります。 次のコマンドを使用して、デバイスが Microsoft Entra ID にアクセスできるかどうかを確認できます。

az ad signed-in-user show

対話形式でログインしない場合、エラーと Interactive authentication is needed が表示される場合もあります。 エラーを解決するには、az login コマンドを使用してログインします。

ネットワーク接続

データベース サーバーが Virtual Network 内にある場合は、Azure CLI コマンドを実行する環境が Virtual Network 内のサーバーにアクセスできることを確認します。

データベース サーバーが Virtual Network 内にある場合は、Azure CLI コマンドを実行する環境が Virtual Network 内のサーバーにアクセスできることを確認します。

データベース サーバーがパブリック アクセスを許可していない場合は、Azure CLI コマンドを実行する環境がプライベート エンドポイント経由でサーバーにアクセスできることを確認します。

次のステップ

Service Connector とパスワードレス接続の詳細については、次のリソースを参照してください。