※ 2023 年 2 月 10 日現在の情報をもとに作成しています
1. はじめに
Hosts ファイルを使用している場合、AnyConnect の SWG Agent が想定どおり動作しないことがあります。本記事では、その仕組みと回避策について説明します。
AnyConnect-SWG Clients do not Respect Hosts File Entry
https://support.umbrella.com/hc/en-us/articles/4403460139412-AnyConnect-SWG-Clients-do-not-Respect-Hosts-File-Entry
2. Hosts ファイルとは
Hosts ファイルは、ドメイン名 (ホスト名) と IP アドレスの組み合わせを記載したファイルのことで、名前解決の際に DNS よりも優先して使用されます。
Windows 環境の場合、C:\Windows\System32\drivers\etc\ に hosts という名前のファイルがあります。
なお、AnyConnect Umbrella Roaming Security Module を使って DNS セキュリティを利用している環境において、Hosts ファイルに記載されたドメインの名前解決では、PC 上で DNS クエリーが生成されないため、DNS ポリシーは適用されません。
3. SWG Agent について
SWG Agent は、AnyConnect の追加モジュールの 1 つである AnyConnect Umbrella Roaming Security Module に含まれる Web 機能を提供するサービスで、Windows のサービス画面からも確認できます。
PC 上で Web アクセスが発生した際、SWG Agent はそのパケットを横取りし、除外対象ではないものはクラウド上の SWG (Secure Web Gateway) というプロキシ サーバーに転送します。これにより、Web 通信に Web ポリシーを適用することが可能になります。
ここで言う除外対象というのは、Umbrella Dashboard の導入 > ドメイン管理の「内部ドメイン」および「外部ドメイン & IPs」に登録されているエントリー (およびシステムによって予約された一部の管理ドメイン) のことで、以下のファイル内の exceptionList の項で、最終的な除外対象を確認することができます。
C:\ProgramData\Cisco\Cisco AnyConnect Secure Mobility Client\Umbrella\SWG\SWGConfig.json
なお、AnyConnect の導入の際にローカル ディスクに保存した OrgInfo.json というファイルには、Umbrella を契約した組織の ID (Org ID) が書き込まれており、その契約に SIG (または SIG 相当) のサブスクリプションが含まれている場合、SWG Agent サービスは自動的に実行されます。
AnyConnect の GUI からも契約状況を確認することが可能です。
4. 問題点
Hosts ファイルに記載されたドメインに対して Web アクセスを行った場合、その通信は SWG Agent によって SWG へ転送されますが、最終的なアクセス先は Hosts ファイルに記載されている IP アドレスではなく、そのドメインの本来の IP アドレスになります。
PC の Web ブラウザ上で example.com に対して Web アクセスが行われた際を例に、この動作の仕組みを説明したものが以下になります。
- Web ブラウザは Hosts ファイルの情報から X.X.X.X という IP アドレスを取得します
- Web ブラウザは example.com にアクセスするための X.X.X.X 宛ての Web リクエストを送信します
- SWG Agent がこの Web リクエストを横取りします
- SWG Agent は除外リストをチェックしたのち、クラウド上の SWG に転送します
- SWG は改めて example.com に対して DNS 名前解決を行い、Y.Y.Y.Y という IP アドレスを取得します
- SWG は example.com にアクセスするための Y.Y.Y.Y 宛ての Web リクエストを送信します
つまり、PC 側で Hosts による宛先確認が行われた後、クラウド側でもう一度宛先確認が行われることになり、結果的に Hosts の記述が適用されません。
この問題の回避策としてまず思いつくのは、example.com を外部ドメインに追加して、SWG への転送対象から除外することになりますが、この方法では以下のような流れとなりうまくいきません。
- Web ブラウザは Hosts ファイルの情報から X.X.X.X という IP アドレスを取得します
- Web ブラウザは example.com にアクセスするための X.X.X.X 宛ての Web リクエストを送信します
- SWG Agent がこの Web リクエストを横取りします
- SWG Agent は、除外リストの中に example.com が含まれているのを見つけます
- SWG Agent は、ローカルに保存された DNS キャッシュにexample.com のエントリーがあるかどうか確認します
- SWG Agent は、example.com についての DNS キャッシュがないため (Hosts が原因)、IP アドレスは「不明」と判断します
- SWG Agent はこのドメインは除外対象ではないと判断し、最終的にクラウド上の SWG に転送します
- SWG は改めて example.com に対して DNS 名前解決を行い、Y.Y.Y.Y という IP アドレスを取得します
- SWG は example.com にアクセスするための Y.Y.Y.Y 宛ての Web リクエストを送信します
除外リストにドメインが登録されている場合、DNS キャッシュ情報を使って IP アドレスに変換してから確認が行われるという動作は、以下のサポート記事にも詳しい記載があります。
AnyConnect SWG module and External Domains
https://support.umbrella.com/hc/en-us/articles/8850741775764-AnyConnect-SWG-module-and-External-Domains
5. 回避策
この事象の回避策としては、Hosts に記載した IP アドレスを外部ドメイン & IPs に登録することが正解になります。この時の動作の流れを以下に示します。
- Web ブラウザは Hosts ファイルの情報から X.X.X.X という IP アドレスを取得します
- Web ブラウザは example.com にアクセスするための X.X.X.X 宛ての Web リクエストを送信します
- SWG Agent がこの Web リクエストを横取りします
- SWG Agent は、除外リストの中に X.X.X.X が含まれているのを見つけます
- SWG Agent は、除外リストの X.X.X.X と Webリクエストの送信先 IPアドレスが一致していることを確認します
- SWG Agent は SWG に転送するのをやめ、そのまま X.X.X.X に送信します