Entraアプリケーションプロキシを設定してみる
1.Entraアプリケーションプロキシとは
1-1.概要
Entraアプリケーションプロキシは、オンプレミスのWebアプリケーションをインターネット経由で公開するためのリバースプロキシサービスです。
- Entra IDと統合された認証・認可機能
- シングルサインオン(SSO)対応
- 条件付きアクセスポリシーとの連携
構成は下記公式サイトの図がわかりやすいと思います。
オンプレミスアプリ以外にもプライベートサブネット等に配置したWebサーバーを公開する用途にも使えそうです。
普通のリバースプロキシと比較した場合の大きなメリットとしては、Entra認証認可と統合されているので、簡単にSSO対応できるというところでしょうか。
逆に初期コストや柔軟性はNginxなどのリバースプロキシに優位性がありそうな気がします。
1-2.EntraアプリケーションプロキシとNginxリバースプロキシ比較
EntraアプリケーションプロキシとNginxリバースプロキシをざっと比較してみました。
機能・特徴 | Entra Appプロキシ | Nginxリバースプロキシ |
---|---|---|
製品タイプ | SaaS / エンタープライズ | オープンソース |
対応OS | コネクタサーバー:Windows | サーバー:Linux全般(※) |
初期投資 | 中(EntraIDライセンス要) | 低(インフラのみ) |
認証統合 | EntraID統合 | モジュール実装必要 ※EntraID連携は要Nginx Plus |
プロトコル対応 | HTTP/HTTPS中心 | HTTP/HTTPS/TCP/UDP |
スケーラビリティ | 高(クラウドネイティブ) | 高(軽量設計) |
強み | - Entra連携 - 一元管理 |
- 高機能 - 柔軟な設定 |
課題 | - Entra依存 - コネクタ運用 - ライセンスコスト |
- セキュリティ設計 - 運用工数 - 専門知識要 |
2.Entraアプリケーションプロキシの前提条件
Entraアプリケーションプロキシを利用するための前提条件がいくつかあります。
まず有料サブスクリプションであるEntra ID P1またはP2ライセンスが必要です(またはEnterprise Mobility + Security E3/E5やMicrosoft 365 E3/E5ライセンス)。
また、Entraアプリケーションプロキシは「コネクタ」がオンプレアプリとクラウドのアプリプロキシを仲介するのですが、このコネクタをインストールできるのがWindows限定という条件があります。
コネクタとなるWindowsサーバーはクラウドに接続する必要があるので、アウトバウンド(ポート443)が解放されている必要もあります。
3.動作の仕組み
実際にEntraアプリケーションプロキシ準備からユーザーアクセス
-
コネクタのインストール
- オンプレミス環境にアプリケーションプロキシコネクタをインストール
- Entra IDとの安全なアウトバウンド接続を確立
-
アプリケーションの公開・設定
- 内部URLと外部URLの対応付けを設定
- 認証方式や認証の要件を定義
-
ユーザーアクセスフロー
- ユーザーが外部URLにアクセス
- Entra IDによる認証
- コネクタを経由した内部リソースへのアクセス
シーケンス図にすると下記のようになると思います。
4.実際に設定して動かしてみる
実際にEntraアプリケーションプロキシを使って、AWSのプライベートサブネットに配置しているNginxウェブサーバーを公開する設定をしてみようと思います。
簡単な構成イメージは下記です。
設定の流れとしては下記となります。
- Entraコネクタセットアップ(AWS)
- Nginxウェブアプリセットアップ(AWS)
- Entraアプリケーションプロキシセットアップ(Azure)
- 接続テスト(クライアントPC)
4-1.Entraコネクタセットアップ(AWS)
まずはEntraコネクタのセットアップをしていきます。
Windowsサーバーにインストールするコネクタアプリをダウンロードします。
-
Azureポータルにログイン
-
「Microsoft Entra ID」->「アプリケーション プロキシ」->「コネクタ サービスのダウンロード」を選択
※「現在、プライベート ネットワークはテナントに対して無効になっています。」というメッセージが表示されていますが、一旦このまま進めます
下記画面が表示されます。「規約に同意してダウンロード」します。
MicrosoftEntraPrivateNetworkConnectorInstaller.exeというファイルがダウンロードされます。
-
AWSマネージメントコンソールにログインしてEC2画面を開き、「インスタンス」->「インスタンスを起動」でEC2を作成していきます。
- 名前:App Proxy Connector
- AMI:Microsoft Windows Server 2022 Base
- インスタンスタイプ:t2.micro
「新しいキーペアの作成」でキーペアを作成します。
下記のように設定して「キーペアを作成」を選択すると作成されたキーペアがダウンロードされます。 - キーペア名:AppProxyConnector
- キーペアのタイプ:RSA
- プライベートキーファイル形式:.pem
今作成したキーペアを指定
ネットワーク設定はプライベートサブネットを指定します。「編集」を選択。
※VPCやプライベートサブネットは作成済みとして記載しています。
プライベートサブネットを指定し、3389ポートのインバウンドを許可するセキュリティグループを作成してアタッチします。 - VPC:プライベートサブネットが存在するVPC
- サブネット:プライベートサブネット
- セキュリティグループ:「セキュリティグループを作成」
- セキュリティグループ名:AppProxy-test
- 説明:AppProxy-test
- インバウンドセキュリティグループのルール:デフォルトのまま
- 高度なネットワーク設定:デフォルトのまま
ストレージ設定はデフォルトのまま
高度な詳細では「IAMインスタンスプロフィールを作成」を選択します。
IAMロールを作成するための新しいウィンドウが開くので、「ロールを作成」を選択します。
下記を選択して「次へ」 - 信頼されたエンティティタイプ:AWSのサービス
- サービスまたはユースケース:EC2
- ユースケース:EC2
下記2つの許可ポリシーにチェックを入れて「次へ」
※先ほどダウンロードしたコネクタアプリの受け渡しはS3経由でおこなうのでS3権限も追加します - AmazonSSMManagedInstanceCore
- AmazonS3FullAccess
ロール名を入力して、許可ポリシーが2つ追加されていることを確認して「ロールを作成」を選択 - ロール名:AppProxyTest
先ほどのウィンドウに戻り、IAMインスタンスプロフィールを選択(選択肢に表示されない場合は右のリロードボタンをクリック) - IAMインスタンスプロフィール:AppProxyTest
残りはデフォルトのまま、「インスタンスを起動」をクリック
これでコネクタ用EC2インスタンスが起動しました。
- コネクタアプリ受け渡し用S3バケットを作成して、コネクタアプリをアップロードしておきます
S3の画面を開き、「バケットを作成」を選択
バケット名のみ入力して他はデフォルトのまま「バケットを作成」を選択してバケットを作成します。
今作成したバケットを開き、ダウンロードしたMicrosoftEntraPrivateNetworkConnectorInstaller.exeをアップロードします。
5.EC2画面で「App Proxy Connector」にチェックを入れて、「接続」をクリック
「RDPクライアント」タブを選択し、「Fleet Managerを使用して接続する」にチェックを入れて、「Fleet Manager Remote Desktop」をクリック
※「Fleet Managerを使用して接続する」が活性化されていない場合はEC2からの通信が疎通していない可能性があります。ルートテーブルの0.0.0.0/0ルートやセキュリティグループのルール、EC2にアタッチされているロールを確認してください。
認証タイプ「キーペア」を選択し、キーペアファイルをアップロードして「接続」をクリック
しばらく待つと、リモートデスクトップが表示されますので「PowerShell」を管理者権限で開きます
検索バーでPowershellを検索し、Powershellのアイコン上で右クリックし、Run as a administrator
をクリックする。
確認画面が出るので、「Yes」で起動する。
PowerShellで以下を実行する。
※your-bucket
の箇所はコネクタアプリをアップロードしたS3バケット名に変更してください
# S3からダウンロード
Read-S3Object -BucketName "your-bucket" -Key "/MicrosoftEntraPrivateNetworkConnectorInstaller.exe" -File "C:\temp\MicrosoftEntraPrivateNetworkConnectorInstaller.exe"
C:\temp配下にコネクタアプリがダウンロードされています。
ダブルクリックしてインストールします。
が、、、エラーになってしまいました。。
Trusted sites zoneに追加しろということなので、「Add」をクリックして追加します
「Add」->「Close」
このあと、何回かTrusted sites zoneに追加しろと表示されるのですべてAddしていきます。
が、、最終的に「We can't sign you in」と表示されてしまいました。。JavaScriptを有効化しろ?とのことです。
一旦インストールをキャンセルしてIEでJavaScriptを有効化してみます。
Windows Server 2022にIE入ってるか不安でしたが、ありました。
右上の歯車アイコン->「Internet Options」
「Advanced」->「Allow active content to run in files on My Computer」にチェックを入れて、「Apply」->「OK」
Azureのサインイン画面になるので、Entraのアカウントでサインインします。
またTrusted sites zoneに追加しろと表示されるのでAddします。
MFA認証して、インストール続行します。
無事インストールできました..。
4-2.Nginxウェブアプリセットアップ(AWS)
EC2にNginxをインストールして、テスト用ウェブアプリを作成します。
- EC2画面を開き、「インスタンス」->「インスタンスを起動」でEC2を作成していきます。
- 名前:Nginx App Server
- AMI:Amazon Linux 2023 AMI
- インスタンスタイプ:t2.micro
今回は「キーペアなしで続行」を選択し、キーペアを作成しません。
ネットワーク設定はコネクタと同じプライベートサブネットを指定します。「編集」を選択。
プライベートサブネットを指定し、80ポートのインバウンドをセキュリティグループAppProxy-test(コネクタアプリ)からのみ許可するセキュリティグループを作成してアタッチします。 - VPC:コネクタと同じVPC
- サブネット:コネクタと同じプライベートサブネット
- セキュリティグループ:「セキュリティグループを作成」
- セキュリティグループ名:NginxWebApp-test
- 説明:NginxWebApp-test
- インバウンドセキュリティグループのルール:
- タイプ:HTTP
- ソースタイプ:カスタム
- ソース:セキュリティグループAppProxy-test
- 高度なネットワーク設定:デフォルトのまま
ストレージ設定はデフォルトのまま
高度な詳細ではコネクタと同じIAMインスタンスプロフィールを選択 - IAMインスタンスプロフィール:AppProxyTest
残りはデフォルトのまま、「インスタンスを起動」をクリック
これでNginxウェブアプリ用EC2インスタンスが起動しました。
- 「Nginx App Server」にチェックを入れて、「接続」をクリック
「セッションマネージャー」タブを選択し、「接続」をクリック
セッションマネージャーのコンソールが表示されるので、下記コマンドでNginxをインストールします。
# パッケージ更新
sudo dnf -y update
# Nginxインストール
sudo dnf -y install nginx
Nginxがインストールできました。
デフォルトのままでも全然いいのですが、アクセスした際の画面を少し修正します。
sudo vi /usr/share/nginx/html/index.html
12行目だけWelcome to nginx via Entra App Proxy!
に変更しておきます。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx via Entra App Proxy!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Nginxを起動します。
# Nginx起動
sudo systemctl start nginx
# Nginxステータス確認
sudo systemctl status nginx
正常に起動(active(running)
)していることが確認できました。
念のためcurlで確認します。
curl http://localhost
変更箇所も反映されていそうです。
セッションマネージャーを終了します。
- Nginxウェブアプリサーバの「プライベートIP DNS名」と念のため「プライベートIPアドレス」を確認しておきます。
「Nginx App Server」にチェックを入れて、「プライベートIP DNS名」と「プライベートIPアドレス」をコピー
4-3.Entraアプリケーションプロキシ作成(Azure)
AzureポータルでEntraアプリケーションプロキシを作成します(Entra管理センターでも作成可能です
)。
- Azureポータルにログイン
- 「Microsoft Entra ID」の「エンタープライズアプリケーション」メニューを開く
- 「新しいアプリケーション」からアプリケーション追加
「オンプレミスのアプリケーションの追加」を選択
- アプリケーションを下記のように設定
- 名前:NginxWebAppServer
- 内部URL:<Nginxウェブアプリサーバーの内部DNS名>
- 外部URL:クライアントから接続する際のURL
- 事前認証:Microsoft Entra ID(デフォルト)
詳細設定をクリックして下記のように設定し、「作成」をクリック - バックエンドSSL証明書の検証:チェックなし
- 他はデフォルト
- 「エンタープライズアプリケーション」->「すべてのアプリケーション」に戻ると、追加した「NginxWebAppServer」が表示されています(表示されていない場合は「更新」をクリック)
- 「NginxWebAppServer」を選択して作成したアプリを開く
左メニューで「ユーザーとグループ」を選択し、「ユーザーまたはグループの追加」をクリック
ユーザーとグループの「選択されていません」の箇所をクリックし、アクセスしたいユーザー、グループにチェックを入れて「選択」をクリック
※下記ではグループAWS-Adminsを選択
「割り当て」をクリック
- 最後にコネクタが正常に接続されているか確認します
「Microsoft Entra ID」の「エンタープライズアプリケーション」メニューを開く
「プライベート ネットワーク コネクタ」を選択し、コネクタが表示されていること、状態がアクティブになっていることを確認
4-4.接続テスト
外部URLにアクセスして、Nginxの画面が表示されるかテストします。
- 「エンタープライズアプリケーション」->「すべてのアプリケーション」->「NginxWebAppServer」で作成したアプリを開く
左メニューで「アプリケーション プロキシ」を選択し、外部URLをコピー
- ブラウザのシークレットモードでウィンドウを開き、外部URLにアクセスすると、Microsoftのサインイン画面になります。
メール、パスワードを入力し、MFA認証をおこないます。
下記画面が表示されれば、Entraアプリケーションプロキシ経由でプライベートサブネットのNginxウェブサーバーにアクセスできています。
5. まとめ
意外とWindowsサーバーへのコネクタアプリインストールに手間取りましたが、無事接続することができました。
実際に運用する際は、コネクタサーバーの監視や冗長化、コネクタアプリバージョンアップなど考慮する事項はあると思います。
もしかすると大規模なアクセスがあるシステムの場合は別の方法を採用したほうがよいかもしれませんが、EntraでSSOできるリバースプロキシを比較的手軽に構築できるのはメリットと思います。
他にも応用できそうな気がするので、今後何か思いついた際には検証してみたいと思います。
Discussion