次の方法で共有


チュートリアル: 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、Microsoft Fabric の SQL データベースなどのデータベース サービスも、マネージド ID を受け入れるように構成します。

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

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

前提条件

Azure CLI の使用を開始するには:

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「 Azure Cloud Shell の概要」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「 Docker コンテナーで Azure CLI を実行する方法」を参照してください

    • ローカル インストールを使用している場合は、 az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。

    • メッセージが表示されたら、最初に使用するときに Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「 Azure CLI での拡張機能の使用と管理」を参照してください。

    • az version を実行して、インストールされているバージョンと依存ライブラリを見つけます。 最新バージョンにアップグレードするには、 az upgrade を実行します。

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

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

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

az version を実行して、拡張機能 "serviceconnector-passwordless" バージョンが "2.0.2" 以降であることを確認してください。 拡張機能のバージョンをアップグレードするには、最初に Azure CLI のアップグレードが必要になる場合があります。

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

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

以下を使用する場合:

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

次の Azure CLI コマンドは --client-type パラメーターを使用します。パラメーターには java、dotnet、python などを使用できます。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 $CLIENT_TYPE

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

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGED_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

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

重要

現在、完全なオンボードには手動アクセス共有が必要です。 「Fabric での SQL データベースへのアクセスの共有」を参照してください。

az webapp connection create fabricsql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --fabric-workspace-uuid $FABRIC_WORKSPACE_UUID \
    --fabric-sql-db-uuid $FABRIC_SQL_DB_UUID \
    --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 認証を有効にします (有効になっていない場合)。
  • Microsoft Entra 管理者を現在サインインしているユーザーに設定します。
  • システム割り当てマネージド ID、ユーザー割り当てマネージド ID、またはサービス プリンシパルのデータベース ユーザーを追加します。 データベース $DATABASE_NAME のすべての特権をこのユーザーに付与します。 ユーザー名は、前のコマンド出力の接続文字列で確認できます。
  • AZURE_MYSQL_CONNECTIONSTRINGAZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_SQL_CONNECTIONSTRING、またはFABRIC_SQL_CONNECTIONSTRINGという名前の構成を、データベースの種類に基づいて Azure リソースに設定します。
    • App Service の場合、構成は [ アプリの設定] ブレードで設定されます。
    • Spring Apps の場合、構成はアプリケーションの起動時に設定されます。
    • Container Apps の場合、構成は環境変数に設定されます。 すべての構成とその値は、Azure portal の [Service Connector ] ブレードで取得できます。

Service Connector は次の権限をユーザーに割り当てます。これらの権限を取り消し、要件に基づいて権限を調整できます。

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";
ALTER ROLE db_datareader ADD MEMBER "username"
ALTER ROLE db_datawriter ADD MEMBER "username"
ALTER ROLE db_ddladmin ADD MEMBER "username"

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

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

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

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

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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 corresponding to the authentication type you want to use.
// 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 マネージド ID 認証の使用」を参照してください。

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

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

    dotnet add package Microsoft.Data.SqlClient
    
  2. Service Connector によって追加された環境変数から、Microsoft Fabric 接続文字列の SQL データベースを取得します。

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

    詳細については、「 Active Directory マネージド ID 認証の使用」を参照してください。

詳細については、「 Microsoft Fabric で SQL データベースに接続する」を参照してください

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

  1. Azure ホスティング サービスにアプリケーションをデプロイします。 必要に応じて、これらのリソースのデプロイの詳細については、以下のガイドを参照してください。

  2. ログを確認するか、アプリケーションを呼び出して、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 とパスワードレス接続の詳細については、次のリソースを参照してください。