チュートリアル:マネージド ID を使用した App Service からの Azure SQL Database 接続のセキュリティ保護

App Service では、Azure の高度にスケーラブルな自己適用型の Web ホスティング サービスを提供しています。 さらに、Azure SQL Database やその他の Azure サービスへのアクセスをセキュリティ保護するためのターンキー ソリューションであるマネージド ID もアプリ向けに提供しています。 App Service のマネージド ID を使用すると、接続文字列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、次のいずれかのチュートリアルで作成したサンプル Web アプリにマネージド ID を追加します。

作業が完了すると、サンプル アプリは、ユーザー名とパスワードを必要とせずに SQL Database に安全に接続するようになります。

チュートリアルのシナリオを表すアーキテクチャ図。

注意

このチュートリアルで説明する手順は、以下のバージョンをサポートしています。

  • .NET Framework 4.7.2 以降
  • .NET Core 2.2 以降

学習内容

  • マネージド ID を有効にする
  • SQL Database へのアクセスをマネージド ID に付与する
  • SQL Database で Azure AD 認証を使用するように Entity Framework を構成する
  • Azure AD 認証を使用して Visual Studio から SQL Database に接続する

注意

Azure AD 認証は、オンプレミスの Active Directory (AD DS) の 統合 Windows 認証とは 異なります。 AD DS と Azure AD はまったく異なる認証プロトコルを使用しています。 詳細については、「Azure AD Domain Services のドキュメント」を参照してください。

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

前提条件

この記事は、「チュートリアル:SQL Database を使用して Azure に ASP.NET アプリを作成する」または「チュートリアル: Azure App Service での ASP.NET Core および SQL Database アプリの作成」の続きです。 まだどちらも完了していない場合は、先に 2 つのチュートリアルのうちのいずれかに従って作業してください。 または、SQL Database を使用して独自の .NET アプリに合わせた手順を実行することもできます。

SQL Database をバックエンドとして使用してご自分のアプリをデバッグするには、ご使用のコンピューターからのクライアント接続を許可していることを確認してください。 そうなっていない場合は、「Azure portal を使用してサーバーレベルの IP ファイアウォール規則を管理する」の手順に従ってください。

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

  • Azure Cloud Shell で Bash 環境を使用します。

    新しいウィンドウで Cloud Shell を起動する

  • 必要に応じて、Azure CLI をインストールして、CLI リファレンス コマンドを実行します。

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

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

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

データベースへのアクセスを Azure AD ユーザーに許可する

まず、Azure AD ユーザーをサーバーの Active Directory 管理者として割り当てることで SQL Database への Azure AD 認証を有効にします。 このユーザーは、ご使用の Azure サブスクリプションのサインアップに使用した Microsoft アカウントと異なります。 Azure AD に作成、インポート、同期、または招待したユーザーである必要があります。 許可されている Azure AD ユーザーの詳細については、Azure AD の機能と SQL Database の制限事項に関するセクションを参照してください。

  1. Azure AD テナントにまだユーザーが作成されていない場合は、「Azure Active Directory を使用してユーザーを追加または削除する」の手順に従ってユーザーを作成します。

  2. az ad user list を使用して Azure AD ユーザーのオブジェクト ID を見つけます。 <user-principal-name> は置き換えてください。 結果は変数に保存されます。

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].objectId --output tsv)
    

    ヒント

    Azure AD 内のすべてのユーザー プリンシパル名の一覧を表示するには、az ad user list --query [].userPrincipalName を実行します。

  3. Cloud Shell で az sql server ad-admin create コマンドを使用して、この Azure AD ユーザーを Active Directory 管理者として追加します。 次のコマンドの <server-name> は、サーバー名 (.database.windows.net サフィックスなし) に置き換えてください。

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Active Directory 管理者の追加の詳細については、サーバーの Azure Active Directory 管理者のプロビジョニングに関するセクションを参照してください。

Visual Studio を設定する

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

  2. Azure サービス認証用に Azure AD ユーザーを設定するには、メニューから [ツール] > [オプション] の順に選択した後、 [Azure Service Authentication](Azure サービス認証) > [アカウントの選択] の順に選択します。 追加した Azure AD ユーザーを選択し、 [OK] をクリックします。

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

プロジェクトを変更する

プロジェクトに対して実行する手順は、ASP.NET プロジェクトであるか ASP.NET Core プロジェクトであるかによって異なります。

  1. Visual Studio で、パッケージ マネージャー コンソールを開き、NuGet パッケージ Microsoft.Azure.Services.AppAuthentication を追加します。

    Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.4.0
    
  2. Web.config で、ファイルの先頭から作業を行い、次の変更を加えます。

    • <configSections> に、次の section 宣言を追加します。

      <section name="SqlAuthenticationProviders" type="System.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      
    • 閉じる </configSections> タグの下に、<SqlAuthenticationProviders> の次の XML コードを追加します。

      <SqlAuthenticationProviders>
        <providers>
          <add name="Active Directory Interactive" type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
        </providers>
      </SqlAuthenticationProviders>
      
    • MyDbConnection という接続文字列を見つけ、その connectionString 値を "server=tcp:<server-name>.database.windows.net;database=<db-name>;UID=AnyString;Authentication=Active Directory Interactive" に置き換えます。 <server-name><db-name> を実際のサーバー名とデータベース名に置き換えます。

    注意

    登録した SqlAuthenticationProvider は、先ほどインストールした AppAuthentication ライブラリに基づいています。 既定では、システム割り当ての ID が使用されます。 ユーザー割り当ての ID を活用するには、追加の構成を行う必要があります。 AppAuthentication ライブラリについては、「接続文字列のサポート」を参照してください。

    これが、SQL Database に接続するために必要な作業のすべてです。 Visual Studio でデバッグする場合は、「Visual Studio を設定する」で構成した Azure AD ユーザーが、コードによって使用されます。 後で、App Service アプリのマネージド ID からの接続を許可するように SQL Database を設定します。

  3. Ctrl+F5 キーを押してアプリをもう一度実行します。 これで、お使いのブラウザー内で同じ CRUD アプリが Azure AD 認証を使用して Azure SQL Database に直接接続します。 この設定により、Visual Studio からのデータベースの移行を実行できます。

マネージド ID の接続の使用

次に、システムによって割り当てられたマネージド ID を使用して SQL Database に接続するよう、ご自分の App Service アプリを構成します。

注意

このセクションの手順では、システム割り当て ID を使用していますが、ユーザー割り当て ID も同じように簡単に使用できます。 そのためには、 目的のユーザー割り当て ID を使用するように az webapp identity assign command を変更する必要があります。 その後 SQL ユーザーを作成するときは、サイト名ではなく、ユーザー割り当て ID リソースの名前を使用してください。

アプリのマネージド ID を有効にする

Azure アプリのマネージド ID を有効にするには、Cloud Shell で az webapp identity assign コマンドを使用します。 次のコマンドの <app-name> を置き換えます。

az webapp identity assign --resource-group myResourceGroup --name <app-name>

注意

デプロイ スロットのマネージド ID を有効にするには、--slot <slot-name> を追加し、 <slot-name> にスロットの名前を使用します。

出力の例を次に示します。

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

マネージド ID にアクセス許可を付与する

注意

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

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. Cloud Shell 内で、SQLCMD コマンドを使用して SQL Database にサインインします。 <server-name> は実際のサーバー名に、 <db-name> はアプリが使用するデータベース名に、 <aad-user-name><aad-password> は Azure AD ユーザーの資格情報に置き換えます。

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 対象のデータベースの SQL プロンプトで次のコマンドを実行して、ご自分のアプリに必要なアクセス許可を付与します。 たとえば、次のように入力します。

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

    <identity-name> は、Azure AD のマネージド ID の名前です。 ID がシステムによって割り当てられる場合は常に、App Service アプリと同じ名前になります。 デプロイ スロットの場合、システムによって割り当てられた ID の名前は、 <app-name>/slots/<slot-name> です。 Azure AD グループのアクセス許可を付与するには、代わりにグループの表示名を使用します (たとえば、myAzureSQLDBAccessGroup)。

  3. EXIT」と入力して Cloud Shell プロンプトに戻ります。

    注意

    マネージド ID のバックエンド サービスは、トークン キャッシュも管理します。トークン キャッシュでは、有効期限が切れたときにのみターゲット リソースのトークンが更新されます。 SQL Database のアクセス許可に設定ミスがあり、アプリでトークンを取得しようとした "後に" アクセス許可に変更を加えようとしても、実際には、キャッシュされたトークンの有効期限が切れるまで、更新されたアクセス許可で新しいトークンを取得することはできません。

    注意

    Azure Active Directory とマネージド ID は、オンプレミスの SQL Server ではサポートされていません。

接続文字列を変更する

Web.config または appsettings.json 内で行ったのと同じ変更をマネージド ID に対して使用できるため、必要な作業は App Service 内の既存の接続文字列 (ご自分のアプリを初めてデプロイすると Visual Studio によって作成されます) を削除することだけである点に注意してください。 次のコマンドを使用しますが、 <app-name> はご自分のアプリの名前に置き換えます。

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

変更を発行する

あとは、Azure に変更を発行するだけです。

  1. チュートリアル: SQL Database を使用して Azure に ASP.NET アプリを作成する」からこのチュートリアルに進んできた場合は、Visual Studio での変更を発行します。 ソリューション エクスプローラーDotNetAppSqlDb プロジェクトを右クリックし、 [発行] を選択します。

    ソリューション エクスプローラーから発行する

  2. 発行ページで [発行] をクリックします。

    重要

    App Service 名が既存のアプリの登録と一致していないことを確認してください。 これにより、プリンシパル ID の競合が発生します。

新しい Web ページに To-Do リストを表示するとき、アプリはマネージド ID を使用してデータベースに接続しています。

Code First Migration の手順後の Azure アプリ

以前と同様に To-Do リストを編集できるようになりました。

リソースをクリーンアップする

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。

az group delete --name myResourceGroup

このコマンドの実行には、少し時間がかかる場合があります。

次のステップ

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

  • マネージド ID を有効にする
  • SQL Database へのアクセスをマネージド ID に付与する
  • SQL Database で Azure AD 認証を使用するように Entity Framework を構成する
  • Azure AD 認証を使用して Visual Studio から SQL Database に接続する