はじめに
Cloudflare の Zero Trust ソリューションの大きな強みの一つは、クライアントレス構成を非常にシンプルに実装できる点だと思っています。
一方で、WARP(エージェント)のインストールが難しい端末では、Secure Web Gateway における Identity ベースの制御が適用しづらいという課題がありました。
この課題を解決するための機能が、ついに Cloudflare からリリースされます!
2025年12月現在、この機能はクローズドベータの段階にあり、すべてのアカウントで有効化されているわけではありません。近日中にオープンベータになると言われています。
この仕組みを実現するキーとなるのが PAC ファイル です。
今回、新たにAuthorization endpoint と PAC File Hosting という機能が提供されます。これにより、従来は Workers や社内 Web サーバなどにホストする必要があった PAC ファイルを、Cloudflare の管理画面上でIdentity認証つきProxyエンドポイントとセットで直接ホスティングできるようになります!
結果として、WARP を導入できない端末でも、Identity 認証を含む Secure Web Gateway の制御が適用できるようになり、Cloudflare のクライアントレスソリューションがさらに充実することになります!
設定手順
それでは、早速設定画面へ。
詳しい手順はドキュメントも参照してください:
ネットワーク > リゾルバとプロキシー > プロキシエンドポイント に遷移すると、設定画面が新しくなっています。
エンドポイントを追加する > 認証エンドポイントを追加するでエンドポイントの作成とともに、ログイン方法、Accessのポリシーが適応できます。
保存してできたエンドポイントをPACファイルに適応するため、コピーしてしておきます。
次にPACファイル追加をクリック
そうすると、PACファイルJavaScriptが出てきますがテンプレートを利用すれば簡単に記述できますのでご安心ください。

PAC ファイルの記述例
以下は、Identity 認証を含む PAC ファイルの記述例です。Google WorkspaceをIdPとして利用しています:
function FindProxyForURL(url, host) {
// ============================
// 0) Normalize
// ============================
host = host.toLowerCase();
// ============================
// 1) IdP Bypass (Google Workspace) - CRITICAL
// ============================
// Avoid auth loops + make login reliable
if (
host === "accounts.google.com" ||
dnsDomainIs(host, ".accounts.google.com") ||
host === "oauth2.googleapis.com" ||
dnsDomainIs(host, ".googleusercontent.com") ||
dnsDomainIs(host, ".gstatic.com") ||
dnsDomainIs(host, ".googleapis.com")
) {
return "DIRECT";
}
// ============================
// 2) Local / Private Bypass
// ============================
if (isPlainHostName(host) || shExpMatch(host, "*.local") || host === "localhost") {
return "DIRECT";
}
// If host is already an IP, check RFC1918 without dnsResolve()
if (isInNet(host, "10.0.0.0", "255.0.0.0") ||
isInNet(host, "172.16.0.0", "255.240.0.0") ||
isInNet(host, "192.168.0.0", "255.255.0.0") ||
isInNet(host, "127.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
// Only resolve DNS when needed (reduces slowness / weird failures)
var ip = dnsResolve(host);
if (ip !== null) {
if (
isInNet(ip, "10.0.0.0", "255.0.0.0") ||
isInNet(ip, "172.16.0.0", "255.240.0.0") ||
isInNet(ip, "192.168.0.0", "255.255.0.0") ||
isInNet(ip, "127.0.0.0", "255.0.0.0")
) {
return "DIRECT";
}
}
// ============================
// 3) (Optional) Bypass Access hostnames themselves
// ============================
// Helps avoid self-proxying during login/logout callbacks
if (dnsDomainIs(host, ".cloudflareaccess.com")) {
return "DIRECT";
}
// ============================
// 4) Proxy everything else via Cloudflare Gateway Proxy Endpoint
// ============================
// Use HTTPS proxy endpoint on 443; add DIRECT fallback for resiliency
return "HTTPS xxxxxxx.proxy.cloudflare-gateway.com:443; DIRECT";
}
重要な注意点
利用する IdP 宛の通信をバイパスしておかないと、ログイン時に無限ループに陥りますので、必ず 1) IdP Bypass は設定してください。
もちろん、4) Proxy everything else via Cloudflare Gateway Proxy Endpoint に設定する URL は、先ほど作成したエンドポイント URL を記載しておきます。これで、バイパスした通信以外はこの Proxy endpoint を経由するようになります。
端末上の動作確認
実際にSecure Web Gatewayポリシーが適用されるかを確認してみます。
PAC ファイル作成後に取得できる、PAC ファイルの URL をコピーし、端末もしくはブラウザーに設定しておきます。
端末への設定方法
- macOS の場合: Apple サポートページを参照
- Windows の場合: ネットワークとインターネット > プロキシ から設定
PAC ファイル利用時も、端末のシステム証明書ストアに Cloudflare の CA 証明書をインストールする必要があります。WARP を利用していれば自動でインストールされますが、クライアントレスの場合は別途追加が必要になります。
動作確認
諸々設定をしてブラウザーを立ち上げると、いきなり Access の認証画面が立ち上がります。
認証をしてブロックポリシーを設定したページに遷移すると...
クライアントレスでページがブロックされています!
ログではしっかりIdentity情報も記録されています。
サイトアクセスブロック以外にも、概ねSWGの機能が使えます。例えば、Perplexity利用時にアップロードを禁止するというポリシーを追加すると・・・
アップロードが延々成功しません。
ログを確認すると、しっかりIdentity情報付でブロックされたことが確認できました。ちなみにリモートブラウザー機能が使えることも確認できています。
いかがでしたでしょうか。PAC File HostingとAuthorization Proxyのおかげでクライアントレスのオプションが増え、Cloudflare Zero Trustの実装面での選択肢も増えたことと思います。







