Microsoft Entra アプリケーション プロキシを使用してオンプレミス API へのアクセスをセキュリティで保護する
ビジネス ロジック API がオンプレミスで実行されていたり、クラウドの仮想マシンでホストされていたりすることがあります。 Android、iOS、Mac、または Windows のネイティブ アプリは、データを使用したりユーザー対話を提供したりするために、この API エンドポイントと対話する必要があります。 Microsoft Entra アプリケーション プロキシと Microsoft Authentication Library (MSAL) を使用すると、ネイティブ アプリはオンプレミス API に安全にアクセスすることができます。 Microsoft Entra アプリケーション プロキシは、ファイアウォール ポートを開いてアプリ層で認証と承認を制御するよりも高速かつ安全なソリューションです。
この記事では、ネイティブ アプリがアクセスできる Web API サービスをホストするための Microsoft Entra アプリケーション プロキシ ソリューションを設定する手順を説明します。
概要
次の図は、オンプレミス API を公開するための従来の方法を示したものです。 このアプローチでは、受信ポート 80 と 443 を開く必要があります。
次の図は、Microsoft Entra アプリケーション プロキシを使用して、受信ポートを開かずに API を安全に公開する方法を示しています:
Microsoft Entra アプリケーション プロキシはこのソリューションのバックボーンを形成し、API アクセスのパブリック エンドポイントとして機能し、認証と承認を提供します。 Microsoft Authentication Library (MSAL) ライブラリを使用することで、さまざまなプラットフォームから API にアクセスできます。
Microsoft Entra アプリケーション プロキシの認証と承認は Microsoft Entra ID 上に構築されているため、Microsoft Entra の条件付きアクセスを使用して、信頼済みデバイスのみがアプリケーション プロキシ経由で公開された API にアクセスできるようにすることが可能です。 デスクトップ Microsoft Entra 参加または Microsoft Entra ハイブリッド参加を使用し、デバイスの場合は Intune Managed を使用します。 また、Microsoft Entra 多要素認証などの Microsoft Entra ID P1 または P2 機能と、Microsoft Entra ID Protection の機械学習に基づくセキュリティを利用することもできます。
前提条件
このチュートリアルを実行するには、次のものが必要です。
- アプリを作成して登録できるアカウントを持つ、Azure ディレクトリへの管理者アクセス権
- https://github.com/jeevanbisht/API-NativeApp-ADAL-SampleApp からのサンプル Web API およびネイティブ クライアント アプリ
アプリケーション プロキシ経由で API を公開する
アプリケーション プロキシを介してイントラネットの外部で API を公開するには、Web アプリを公開する場合と同じパターンに従ってください。 詳細については、「チュートリアル: Microsoft Entra ID のアプリケーション プロキシを使用してリモート アクセスするためのオンプレミス アプリケーションを追加する」を参照してください。
アプリケーション プロキシ経由で SecretAPI Web API を公開するには、次のようにします。
ローカル コンピューターまたはイントラネット上で、サンプルの SecretAPI プロジェクトを ASP.NET Web アプリとしてビルドして公開します。 Web アプリにローカルでアクセスできることを確認します。
少なくとも アプリケーション管理者 の権限で Microsoft Entra 管理センター にサインインします。
ID>アプリケーション>エンタープライズ アプリケーション を参照します。
[エンタープライズ アプリケーション - すべてのアプリケーション] ページの上部で、 [新しいアプリケーション] を選択します。
[Microsoft Entra ギャラリーの参照] ページで、[オンプレミスのアプリケーション] セクションを探し、[オンプレミスのアプリケーションの追加] を選択します。 [独自のオンプレミスのアプリケーションの追加] ページが表示されます。
アプリケーション プロキシ コネクタがインストールされていない場合は、インストールするように求められます。 [アプリケーション プロキシ コネクタのダウンロード] を選択してコネクタをダウンロードしてインストールします。
アプリケーション プロキシ コネクタをインストールしたら、 [独自のオンプレミスのアプリケーションの追加] ページで、次のようにします。
[名前] の横に SecretAPI と入力します。
[内部 URL] の横に、イントラネット内から API へのアクセスに使用する URL を入力します。
[事前認証] が [Microsoft Entra ID] に設定されていることを確認します。
ページの上部にある [追加] を選択し、アプリが作成されるまで待機します。
[エンタープライズ アプリケーション - すべてのアプリケーション] ページで、 [SecretAPI] アプリを選択します。
[SecretAPI - 概要] ページで、左側のナビゲーションから [プロパティ] を選択します。
エンド ユーザーが [MyApps] パネルで API を利用できないようにするために、 [プロパティ] ページの下部にある [Visible to users](ユーザーに表示する) を [いいえ] に設定し、 [保存] を選択します。
Microsoft Entra アプリケーション プロキシを通じて Web API を公開しました。 次に、アプリにアクセスできるユーザーを追加します。
[SecretAPI - 概要] ページで、左側のナビゲーションから [ユーザーとグループ] を選択します。
[ユーザーとグループ] ページで [ユーザーの追加] を選択します。
[割り当ての追加] ページで [ユーザーとグループ] を選択します。
[ユーザーとグループ] ページで、少なくとも自分自身を含め、アプリにアクセスできるユーザーを検索して選択します。 すべてのユーザーを選択した後、 [選択] を選択します。
[割り当ての追加] ページに戻り、 [割り当て] を選択します。
注意
統合 Windows 認証を使用する API では、追加の手順が必要になることがあります。
ネイティブ アプリを登録して API へのアクセス権を付与する
ネイティブ アプリは、特定のプラットフォームまたはデバイスで使用するために開発されたプログラムです。 ネイティブ アプリが API に接続してアクセスできるようにするには、Microsoft Entra ID に登録する必要があります。 次の手順では、ネイティブ アプリを登録し、アプリケーション プロキシ経由で公開された Web API へのアクセス権を付与する方法を示します。
AppProxyNativeAppSample ネイティブ アプリを登録するには、次のようにします。
少なくとも アプリケーション管理者 の権限で Microsoft Entra 管理センター にサインインします。
[ID]>[アプリケーション]>[エンタープライズ アプリケーション]>[登録] の順に移動します。
[新規登録] を選択します。
[アプリケーションの登録] ページで、次のようにします。
[名前] に AppProxyNativeAppSample と入力します。
[サポートされているアカウントの種類] で、[この組織ディレクトリのみに含まれるアカウント (Contoso のみ - シングル テナント)] を選択します。
[リダイレクト URL] で、ドロップダウンから [パブリック クライアント (モバイル & デスクトップ)] を選択し、*https://login.microsoftonline.com/common/oauth2/nativeclient * と入力します。
[登録] を選択し、アプリが正常に登録されるまで待ちます。
これで AppProxyNativeAppSample アプリが Microsoft Entra ID に登録されました。 ネイティブ アプリに SecretAPI Web API へのアクセス権を付与するには、次のようにします。
[アプリの登録] ページで、AppProxyNativeAppSample アプリを選択します。
[AppProxyNativeAppSample] ページで、左側のナビゲーションから [API のアクセス許可] を選択します。
[API のアクセス許可] ページで、 [アクセス許可の追加] を選択します。
最初の [API アクセス許可の要求] ページで、 [所属する組織で使用している API] タブを選択し、 [SecretAPI] を検索して選択します。
次の [API アクセス許可の要求] ページで、 [user_impersonation] の横のチェック ボックスをオンにし、 [アクセス許可の追加] を選択します。
[API のアクセス許可] ページに戻り、 [Contoso に管理者の同意を与えます] を選択して、他のユーザーがアプリに個別に同意しなくても済むようにします。
ネイティブ アプリ コードを構成する
最後の手順では、ネイティブ アプリを構成します。 次の手順で使用されるコード スニペットは、「Microsoft Authentication Library をコードに追加する (.NET C# サンプル)」に基づいています。 この例では、コードはカスタマイズされています。 コードは NativeClient サンプル アプリの Form1.cs ファイルに追加する必要があります。これにより、MSAL ライブラリは API 呼び出しを要求するためのトークンを取得し、それをリクエストのヘッダーにベアラーとして添付します。
Note
サンプル アプリは、Azure Active Directory 認証ライブラリ (ADAL) を使用します。 プロジェクトに MSAL を追加する方法を確認します。 クラスに MSAL への参照を追加し、ADAL 参照を削除します。
ネイティブ アプリ コードを構成する:
Form1.cs で、名前空間
using Microsoft.Identity.Client;
をコードに追加します。コードから名前空間
using Microsoft.IdentityModel.Clients.ActiveDirectory;
を削除します。行 26 と 30 は不要になったので削除します。
GetTodoList()
メソッドの内容を次のコード スニペットに置き換えます。// Acquire Access Token from Azure AD for Proxy Application var clientApp = PublicClientApplicationBuilder .Create(clientId) .WithDefaultRedirectUri() // Will automatically use the default URI for native app .WithAuthority(authority) .Build(); var accounts = await clientApp.GetAccountsAsync(); var account = accounts.FirstOrDefault(); var scopes = new string[] { todoListResourceId + "/user_impersonation" }; AuthenticationResult authResult; try { authResult = await clientApp.AcquireTokenSilent(scopes, account).ExecuteAsync(); } catch (MsalUiRequiredException ex) { authResult = await clientApp.AcquireTokenInteractive(scopes).ExecuteAsync(); } if (authResult != null) { // Use the Access Token to access the Proxy Application var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); // Call the To Do list service var response = await httpClient.GetAsync(todoListBaseAddress + "/api/values/4"); var responseString = await response.Content.ReadAsStringAsync(); MessageBox.Show(responseString); }
ネイティブ アプリが Microsoft Entra ID に接続し、API アプリのプロキシを呼び出すように構成するには、NativeClient サンプル アプリの App.config ファイルにあるプレース ホルダーの値を Microsoft Entra ID からの値で更新します:
[ディレクトリ (テナント) ID] を
<add key="ida:Tenant" value="" />
フィールドに貼り付けます。 この値 (GUID) は、いずれかのアプリの [概要] ページから検索してコピーすることができます。AppProxyNativeAppSample の [アプリケーション (クライアント) ID] を
<add key="ida:ClientId" value="" />
フィールドに貼り付けます。 この値 (GUID) は AppProxyNativeAppSample の [概要] ページから検索してコピーできます。左ナビゲーションの [管理] の下にあります。MSAL はメソッド PublicClientApplicationBuilder.WithDefaultRedirectUri() を使用して推奨される応答 URI を挿入するため、この手順は省略可能です。 AppProxyNativeAppSample の [リダイレクト URI] を
<add key="ida:RedirectUri" value="" />
フィールドに貼り付けます。 この値 (URI) は AppProxyNativeAppSample の [認証] ページから検索してコピーできます。左ナビゲーションの [管理] の下にあります。SecretAPI の [アプリケーション ID の URI] を
<add key="todo:TodoListResourceId" value="" />
フィールドに貼り付けます。 これは、以下のtodo:TodoListBaseAddress
と同じ値です。 この値 (URI) は SecretAPI の [API の公開] ページから検索してコピーできます。左ナビゲーションの [管理] の下にあります。SecretAPI の [ホーム ページ URL] を
<add key="todo:TodoListBaseAddress" value="" />
フィールドに貼り付けます。 この値 (URL) は左のナビゲーションの [管理] の下にある、SecretAPI の [ブランド化とプロパティ] ページから検索してコピーできます。
Note
ソリューションがビルドされず、[無効な Resx ファイル] のエラーが報告される場合は、ソリューション エクスプローラー で [プロパティ] を展開し、[Resources.resx] を右クリックして、[コードの表示] を選択します。 コメント行 121 から 123。
パラメーターを構成した後は、ネイティブ アプリをビルドして実行します。 [サインイン] ボタンを選択すると、アプリでサインインが行われ、SecretAPI に正常に接続されたことを確認する成功画面が表示されます。