チュートリアル: マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する

App Service では、Azure の高度にスケーラブルな自己適用型の Web ホスティング サービスを提供しています。 さらに、以下のような Azure データベースへのアクセスをセキュリティ保護するためのターンキー ソリューションであるマネージド ID もアプリ向けに提供しています。

Note

このチュートリアルには、Microsoft Entra 認証を異なる方法でサポートする Azure Cosmos DB のガイダンスは含まれていません。 詳しくは、「システム割り当てマネージド ID を使用して Azure Cosmos DB データにアクセスする」など、Azure Cosmos DB のドキュメントをご覧ください。

App Service のマネージド ID を使用すると、接続文字列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、マネージド ID を使用して App Service から上記のデータベースに接続する方法について説明します。

学習内容

  • Microsoft Entra ユーザーを Azure データベースの管理者として構成します。
  • データベースに Microsoft Entra ユーザーとして接続します。
  • App Service アプリのシステム割り当てまたはユーザー割り当てマネージド ID を構成します。
  • データベースへのアクセスをマネージド ID に付与します。
  • マネージド ID を使用して、コード (.NET Framework 4.8、.NET 6、Node.js、Python、Java) から Azure データベースに接続します。
  • Microsoft Entra ユーザーを使用して、開発環境から Azure データベースに接続します。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

  • .NET、Node.js、Python、または Java に基づいて、App Service でアプリを作成します。
  • Azure SQL Database、Azure Database for MySQL、または Azure Database for PostgreSQL でデータベース サーバーを作成します。
  • 標準的な接続パターン (ユーザー名とパスワード) を熟知し、App Service アプリから選択したデータベースに正常に接続できるようになる必要があります。

Azure CLI の環境を準備します。

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

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

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

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

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

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

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

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

Note

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

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

次に、Service Connector を使用してパスワードレス接続を作成します。

ヒント

Azure portal は、次のコマンドの作成に役立ちます。 Azure portal で、[Azure App Service] リソースに移動し、左側のメニューから [サービス コネクタ] を選択し、[作成] を選択します。 フォームに必要なすべてのパラメーターを入力します。 Azure automaticaly によって接続作成コマンドが生成されます。このコマンドは、コピーして CLI で使用したり、Azure Cloud Shell で実行したりできます。

次の Azure CLI コマンドでは、--client-type パラメーターを使用します。

  1. 必要に応じて、az webapp connection create sql -h を実行してサポートされているクライアントの種類を取得します。

  2. クライアントの種類を選択し、対応するコマンドを実行します。 次のプレースホルダーを実際の情報に置き換えてください。

    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

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

  • システム割り当てマネージド ID を有効にするか、Azure App Service によってホストされているアプリ <server-name> のユーザー ID を割り当てます。
  • Microsoft Entra 管理者を現在サインインしているユーザーに設定します。
  • システム割り当てマネージド ID またはユーザー割り当てマネージド ID のデータベース ユーザーを追加します。 データベース <database-name> のすべての特権をこのユーザーに付与します。 ユーザー名は、前のコマンド出力の接続文字列で確認できます。
  • AZURE_MYSQL_CONNECTIONSTRINGAZURE_POSTGRESQL_CONNECTIONSTRING、または AZURE_SQL_CONNECTIONSTRING という名前の構成を、データベースの種類に基づいて Azure リソースに設定します。
  • App Service の場合、構成は [アプリの設定] ブレードで設定されます。

接続の作成時に問題が発生した場合は、「トラブルシューティング」を参照してください。

3. コードを変更する

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

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

    using Microsoft.Data.SqlClient;
    
    // AZURE_SQL_CONNECTIONSTRING should be one of the following:
    // For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
    // For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

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

詳細については、「Microsoft SQL Server に対するクライアント プログラミングのホーム ページ」を参照してください。 その他のコード サンプルについては、「Service Connector を使用してデータベース サービスへのパスワードレス接続を作成する」を参照してください。

4. 開発環境をセットアップする

このサンプル コードは DefaultAzureCredential を使用して Azure データベースの使用可能トークンを Microsoft Entra ID から取得して、データベース接続に追加します。 DefaultAzureCredential はカスタマイズ可能ですが、既に既定で万能で使用できます。 トークンをサインインした Microsoft Entra ユーザーから取得するかマネージド ID から取得するかは、開発環境でローカルで実行するか、App Service で実行するかによって異なります。

これ以上変更することなく、あなたのコードは Azure で実行する準備ができました。 ただしコードをローカルでデバッグするには、サインインした Microsoft Entra ユーザーが開発環境に必要です。 この手順では、Microsoft Entra ユーザーでサインインして、お好きな環境を構成します。

  1. Visual Studio for Windows は Microsoft Entra 認証と統合されています。 Visual Studio で開発とデバッグを有効にするには、メニューから [ファイル]>[アカウント設定] を選択し、[サインイン] または [追加] を選択して、Visual Studio で Microsoft Entra ユーザーを追加してください。

  2. Azure サービス認証用に Microsoft Entra ユーザーを設定するには、メニューから [ツール]>[オプション] の順に選択した後、[Azure サービス認証]>[アカウントの選択] の順に選択してください。 追加した Microsoft Entra ユーザーを選択し、[OK] を選択してください。

Microsoft Entra 認証用に開発環境を設定する方法の詳細については.NET 用 Azure Identity クライアント ライブラリに関するページを参照してください。

これで、Microsoft Entra 認証を使用し、SQL Database をバックエンドとして利用して、ご自分のアプリを開発およびデバッグする準備ができました。

5. テストして発行する

  1. コードを開発環境で実行します。 コードは、環境内でサインインした Microsoft Entra ユーザーを使って、バックエンド データベースに接続します。 このユーザーがデータベースにアクセスできる理由は、データベースの Microsoft Entra 管理者として構成されているからです。

  2. コードを Azure に、望ましい発行方法を使用して発行します。 App Service では、コードはアプリのマネージド ID を使用してバックエンド データベースに接続します。

よく寄せられる質問

マネージド ID は SQL Server をサポートしていますか?

はい。 詳細については、以下を参照してください:

エラー Login failed for user '<token-identified principal>'. が発生します

トークンを要求しようとしているマネージド ID が、Azure データベースへのアクセスを許可されていません。

App Service 認証または関連しているアプリ登録に変更を加えました。 古いトークンをまだ取得するのはなぜですか?

マネージド ID のバックエンド サービスは、トークン キャッシュも管理します。トークン キャッシュでは、有効期限が切れたときにのみターゲット リソースのトークンが更新されます。 アプリでトークンを取得しようとしたに構成を変更すると、キャッシュされたトークンの期限が切れるまで、更新されたアクセス許可で新しいトークンが実際には取得されません。 この問題を回避するには、新しい InPrivate (Edge)/private (Safari)/Incognito (Chrome) ウィンドウで変更をテストするのが最もよい方法です。 そうすれば、新しい認証済みセッションから始めることができます。

マネージド ID を Microsoft Entra グループに追加するにはどうすればよいですか?

必要に応じて、Microsoft Entra グループに ID を追加し、ID ではなく Microsoft Entra グループにアクセスを許可することができます。 たとえば、次のコマンドは、前の手順のマネージド ID を myAzureSQLDBAccessGroup という名前の新しいグループに追加します。

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

Microsoft Entra グループのデータベース アクセス許可を付与するには、それぞれのデータベースの種類に関するドキュメントを参照してください。

エラー SSL connection is required. Please specify SSL options and retry が発生します。

Azure データベースへの接続に追加の設定が必要であり、このチュートリアルのスコープを超えています。 詳細については、以下のいずれかのリンクを参照してください。

Azure Database for PostgreSQL (単一サーバー) で TLS 接続を構成するzure Database for MySQL に安全に接続するためにアプリケーションで SSL 接続を構成する

Web App + Database テンプレートを使用してアプリを作成しましたが、Service Connector コマンドを使用してマネージド ID 接続を構成できなくなりました。

Service Connector で、アプリ ID にアクセス権を付与するには、データベースへのネットワーク アクセスが必要です。 Azure portal で Web App + Database テンプレートを使用して、既定でセキュリティで保護されたアプリとデータベースのアーキテクチャを作成すると、そのアーキテクチャにより、データベースへのネットワーク アクセスはロックダウンされ、仮想ネットワーク内からの接続のみが許可されます。 これは Azure Cloud Shell の場合も当てはまります。 ただし、仮想ネットワークに Cloud Shell をデプロイしてから、その Cloud Shell で Service Connector コマンドを実行することはできます。

次のステップ

ここで学習した内容は次のとおりです。

  • Microsoft Entra ユーザーを Azure データベースの管理者として構成します。
  • データベースに Microsoft Entra ユーザーとして接続します。
  • App Service アプリのシステム割り当てまたはユーザー割り当てマネージド ID を構成します。
  • データベースへのアクセスをマネージド ID に付与します。
  • マネージド ID を使用して、コード (.NET Framework 4.8、.NET 6、Node.js、Python、Java) から Azure データベースに接続します。
  • Microsoft Entra ユーザーを使用して、開発環境から Azure データベースに接続します。