Azure AD のテナント制限機能について

#概要
　エンタープライズ企業の求める要件として、自社の社内 LAN からは、自社の Office 365 テナントのみにアクセス許可し、他社のテナントにはアクセス制限をしたいという要望があります。その要望に応える機能が **Azure AD のテナント制限**となります。

自社テナント以外へのアクセス制御 – “テナントの制限” 機能 (Tenant Restrictions)
https://blogs.technet.microsoft.com/office365-tech-japan/2017/02/06/tenant-restrictions/

※ Office 365 以外の他の SaaS アプリへのアクセスを制御する場合は、[Azure AD Premium P1 ライセンス](https://azure.microsoft.com/ja-jp/pricing/details/active-directory/)が必要です。

#仕組み
　テナント制限はオンプレミスに設置したプロキシサーバーで HTTP ヘッダを強制追加する事で実施します。クラウドサービス側の設定は一切不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/4f9bd135-5197-eb77-b6b2-335e48c0ffd5.png)
　HTTPS 通信で HTTPヘッダを追加するためにはプロキシサーバーで [SSL インターセプト](https://www.a10networks.co.jp/products/pdf/SBAX_SSLIntercept.pdf)（クライアントからの HTTPS 通信をプロキシで一度複合化し、HTTP ヘッダを追加後に WEB サーバーとの間で HTTPS セッションを張りなおす）を実施する必要があります。

#動作検証
　エンタープライズ企業で導入されている高度なプロキシサーバー（ネットワーク機器として配置されているハードウェア）には、暗号化通信の検疫を目的とする SSL インターセプト機能が備わっています。ここでは簡易的に Azure AD のテナント制限の動作を確認するために OSS の Squid を利用したた設定を紹介します。

　以下の環境は Azure の仮想ネットワークを社内 LAN と見立てて、その中にプロキシサーバーとクライアントを Azure VM としてデプロイするシナリオとなっています。

## プロキシサーバーのデプロイ

１. Azure VM として CentOS 7.5 をデプロイします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/8369eb04-0c29-f7f8-fa3b-a747b590039c.png)

２. デプロイした仮想マシンに SSH で接続し、squid をインストール

```bash
$ sudo yum -y install squid
```

３. テスト用 SSL 証明書の作成、Country Name (2 letter code) [XX]: などの情報は JP など適当に入力していきます

```bash
$ sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
$ sudo openssl x509 -in squidCA.pem -outform DER -out squidCA.der
$ sudo cp squidCA.pem /usr/lib64/squid/
```

４. ssl_db の初期化

```bash
$ sudo /usr/lib64/squid/ssl_crtd -c -s /var/db/ssl_db
$ sudo chown -R /var/db/ssl_db
```

５. squid.conf 構成ファイルの設定、アクセスを許可するテナント名 example.onmicrosoft.com と Context テナントID は適切なものに置き換えます

```bash:/etc/squid/squid.conf
# Add HTTP Header
request_header_add Restrict-Access-To-Tenants example.onmicrosoft.com
request_header_add Restrict-Access-Context ba1539e0-eb37-4575-8c83-4b4b4bacea6e

# SSL BUMP Settings
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/lib64/squid/squidCA.pem
ssl_bump bump all
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/db/ssl_db -M 4MB
```

６. squid の起動と有効化

```bash:/etc/squid/squid.conf
$ sudo systemctl start squid
$ sudo systemctl enable squid
```

##クライアントのデプロイ
１. Azure VM として Windows 10 を同じ仮想ネットワーク上にデプロイします

２．CentOS 側にある squidCA.der を Windows 10 にダウンロードします。[Tera Term](https://forest.watch.impress.co.jp/library/software/utf8teraterm/) をインストールして [SSH SCP でダウンロード](https://www.j-oosk.com/teraterm/file-transfer/143/)すると簡単です

３．ダウンロードした squidCA.der をダブルクリックし、以下の信頼済みルート証明機関にインストールします。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/4a2b0856-1a68-1aac-4428-159486046c1d.png)

４．Edge ブラウザのプロキシ設定を squid の IP アドレスと Port 3128 に設定します
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/dfa67475-c58e-9e8b-5565-917719204ac3.png)

５．プロキシ経由でのインターネットへの接続を確認します

　以下のサイトで HTTPS 通信で正しくヘッダが追加されていることを確認します
　https://uchy.me/tools/request_headers.html
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/af1d2c2e-0bcb-631c-1e03-e8028cc53be8.png)

６．期待通りに HTTP ヘッダが追加されていれば、許可したテナント以外へアクセスすると以下のように制限されアクセスが出来ない事が確認できます。許可したテナントには通常通りアクセスが可能です
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/6073d91c-d1e4-f7d0-f4e9-37d8f175ece0.png)

#参考資料
テナント制限について
https://blogs.technet.microsoft.com/jpazureid/2018/09/13/tenant-restrictions/

Azure 上の CentOS 7.3 に Squid3.5 をインストールし SSL インターセプトによりヘッダ情報を付与する
https://qiita.com/tamura2004/items/d2ca2cd56cf692487af2