+ 作るログイン
1 / 14
Cloudflare のすべて ― 1機能ずつ、仕組みと存在理由から / 全35本

Cloudflare 16:Access ― 社内ツールの前に立つ受付

発行
アニメモ公式
版
第2版
改訂
コマ
全14

Cloudflare Access が VPN やアプリごとのログインの代わりに、リクエストのたびに本人確認をする仕組みを説明します。IdP によるログイン、ポリシー(Include・Require・Exclude)、Cf-Access-Jwt-Assertion の JWT とオリジンでの検証、サービストークン、導入の手順、無料枠と落とし穴まで。

社内ツールを、社外から安全に使わせたい

会社には、社員だけが使うツールがたくさんあります。管理画面、社内 Wiki、監視のダッシュボード、経費の申請…。在宅勤務や出張が当たり前になると、これらを社外から使いたい場面が増えます。

これまでの代表的なやり方は2つでした。

やり方問題
VPN で社内の網に入る一度つなげば、社内のどこへでも行ける。1人のパスワードが漏れると、社内全体が危険になる。VPN 装置そのものの脆弱性もよく狙われる
ツールごとにログインを作る作りがバラバラで、弱いものが混ざる。退職した人のアカウントが消し忘れで残りがち。多要素認証もツールごとに設定が要る

どちらにも共通するのは、「社内の網の中にいれば信用する」「ツールが自分で本人確認を頑張る」という考え方です。

この号で見る Cloudflare Access は、考え方を変えます。網の中にいるかどうかでは信用しない。リクエストのたびに、誰なのかを確かめる。 そして、その確認をツールの手前にある Cloudflare のエッジでまとめて行います。

※この号の内容は 2026年9月時点の情報です。Cloudflare の Zero Trust 系の製品は、名前や管理画面の場所・料金がよく変わります。導入のときは必ず公式のドキュメントで確かめてください。

  • Cloudflare のすべて 16 ― Access
  • 1 / 14
  • 社内ツールを、社外から安全に使わせたい
  • 誰なのか、どう確かめる?
  • 社員
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • VPN:一度つなげば社内のどこへでも行ける。1人の漏れが全体の漏れになる
  • アプリごとのログイン:作りがバラバラ。退職者のアカウントが残りがち
  • VPN は「入れば全部」。アプリごとのログインはバラバラで弱い。

一言でいうと:アプリの前に立つ受付

Cloudflare Access は、社内ツール(アプリ)の手前に立ち、リクエストのたびに「誰か」を確かめて、決めた人だけを通す受付です。

ビルの入り口の受付を思い浮かべてください。社員証を見せた人だけがゲートを通れます。Access は、それを Web のリクエストでやります。

特徴中身
ツールに手を入れない本人確認はエッジで行う。古いツールでも、そのまま守れる
アプリごとに決められる「経理のツールは経理の人だけ」のように、アプリ単位で許可を分けられる
会社のアカウントとつながるGoogle・Microsoft などのアカウントでログイン。退職でアカウントを止めれば、全部のツールに入れなくなる
記録が残る誰が、いつ、どのツールに入ったかが一か所に残る

このように、「網の中だから信用する」をやめ、毎回確かめる考え方をゼロトラストと呼びます。Access は、Cloudflare のゼロトラスト製品群(管理画面では Cloudflare One と呼ばれます)の中心です。

社内ツールは、ふつう15号の Tunnel で Cloudflare とつなぎます。Tunnel が「届くようにし」、Access が「誰を通すか決める」という分担です。

  • Cloudflare のすべて 16 ― Access
  • 2 / 14
  • 一言でいうと:アプリの前に立つ受付
  • Cloudflare のエッジ ― Access
  • リクエスト
  • ① ログイン済み? まだなら IdP へ
  • 社員
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • 社内ツールの手前、Cloudflare のエッジで本人確認をする。ツールには手を入れない
  • 「社内の網にいるから信用する」をやめる。これがゼロトラスト
  • リクエストのたびに「誰か」を確かめ、決めた人だけを通す。

仕組み①:まだなら、いつものアカウントでログイン

社員が初めて app.example.com を開いたときの流れです。

順番何が起きるか
1リクエストがエッジに届く。Access は「この人はまだログインしていない」と判断する
2Access のログイン画面に移る。「Google でログイン」などの選択肢が出る
3社員は、いつもの会社のアカウントでログインする(多要素認証もここで)
4IdP が「この人は [email protected] です」と Access に伝える
5Access は次のページのポリシーで判定する

ここで大事なのは、Access 自身はパスワードを持たないことです。本人確認は、Google や Microsoft のような IdP(Identity Provider:本人確認を受け持つサービス)に任せます。図の左下の箱が IdP です。

こうすると、パスワードの管理や多要素認証は、会社がすでに使っているアカウントの仕組みにまとまります。社員が辞めたら、会社のアカウントを止めるだけで、Access で守っているすべてのツールに入れなくなります。ツールごとにアカウントを消して回る必要はありません。

  • Cloudflare のすべて 16 ― Access
  • 3 / 14
  • 仕組み①:まだなら、いつものアカウントでログイン
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • ② ポリシー:この人を通してよい?
  • 社員
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • ← IdP へ
  • 初めてのアクセスは、Access のログイン画面へ。「Google でログイン」などを選ぶ
  • IdP = 本人確認を受け持つサービス。会社のアカウントを止めれば、Access も通らなくなる
  • Access はパスワードを持たない。Google などの IdP に本人確認を任せる。

仕組み②:ポリシーで「この人を通すか」を決める

ログインで「誰か」が分かったら、次は「この人を、このアプリに通してよいか」です。これを決めるのがポリシーです。図では、小包(tanaka@ さんのリクエスト)がポリシーの段で審査されています。

ポリシーには、次のような条件を組み合わせて書けます。

条件の種類例
人メールアドレス、@example.com で終わるメール、IdP のグループ(経理部など)
場所アクセス元の国、IP アドレスの範囲
端末会社が管理している端末か、OS が最新か、ディスクが暗号化されているか(端末の状態=ポスチャ。17号)
ログイン方法多要素認証を使ったか、どの IdP でログインしたか

たとえば「@example.com のメールで、かつ会社の管理する端末から」なら許可、のように書きます。

当てはまらなければ、リクエストはエッジで止まり、社内ツールには1バイトも届きません。ツールにまだ見つかっていない脆弱性があっても、許可されていない人は、そこまでたどり着けないのです。

一度通った人には、しばらく有効な「通行証」が発行されます。有効な時間(セッションの長さ)はアプリごとに決められます。

  • Cloudflare のすべて 16 ― Access
  • 4 / 14
  • 仕組み②:ポリシーで「この人を通すか」を決める
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • ② ポリシー:この人を通してよい?
  • 社員
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • tanaka@
  • 例:「@example.com のメール」かつ「会社の管理する端末」なら許可
  • 当てはまらなければ、社内ツールには1バイトも届かない
  • 誰(メール・グループ)+ 条件(国・端末)を組み合わせる。

仕組み③:通すときは、身分証(JWT)を付けて送る

ポリシーを通ったリクエストは、社内ツールに送られます。このとき Access は、リクエストに身分証を付けます。それが JWT(JSON Web Token)です。

置き場所名前中身・役割
社内ツールへのリクエストのヘッダーCf-Access-Jwt-Assertion誰が来たか(メールなど)と、有効期限。Cloudflare の署名付き
ブラウザの CookieCF_Authorization同じ JWT。次からはログインせずに通れる

社内ツールは、このヘッダーを読めば「今来たのは [email protected] さんだ」と分かります。ツールの中で「誰が操作したか」を記録したり、画面に名前を出したりするのに使えます。ツール側でログイン画面を作らなくてよくなるのです。

JWT は、中身(誰か・いつまで有効か)に署名が付いたデータです。署名は Cloudflare だけが作れる鍵で付けられているので、誰かが中身を書き換えると、署名が合わなくなります。

ただし、この仕組みが意味を持つのは、社内ツールの側で署名を確かめたときだけです。次のページで、その方法を見ます。

  • Cloudflare のすべて 16 ― Access
  • 5 / 14
  • 仕組み③:通すときは、身分証(JWT)を付けて送る
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • JWT 付き
  • ② ポリシー:この人を通してよい?
  • 社員
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • ヘッダー Cf-Access-Jwt-Assertion に、署名付きの身分証(メールなど)が入る
  • ブラウザ側には Cookie(CF_Authorization)が残り、次からはログイン不要
  • 社内ツールは、ヘッダーの JWT で「誰が来たか」を知る。

オリジンで JWT を検証する

「Cf-Access-Jwt-Assertion ヘッダーがあるから、Access を通ってきたのだろう」と信じてはいけません。もし誰かが Access を迂回して社内ツールに直接リクエストを送れるなら、そのヘッダーを自分で書いて送れてしまうからです。

そこで、社内ツールの側で JWT の署名を検証します。たとえば jose というライブラリを使うと、次のように書けます。

ts
import { createRemoteJWKSet, jwtVerify } from "jose";

const TEAM = "https://your-team.cloudflareaccess.com";
const JWKS = createRemoteJWKSet(new URL(`${TEAM}/cdn-cgi/access/certs`));

export async function whoIs(req: Request): Promise<string> {
  const token = req.headers.get("cf-access-jwt-assertion");
  if (!token) throw new Error("Access を通っていない");
  const { payload } = await jwtVerify(token, JWKS, {
    issuer: TEAM,
    audience: "アプリの AUD タグ",
  });
  return String(payload.email);
}
確かめること意味
署名/cdn-cgi/access/certs の公開鍵で。鍵は定期的に入れ替わるので、URL から取り直す
発行元(issuer)自分のチームの Access が発行したか
宛先(audience)このアプリ用に発行されたか。AUD タグはアプリの設定画面にある
有効期限jwtVerify が自動で確かめる

宛先を確かめないと、別のアプリ用の JWT を使い回されるおそれがあります。

  • Cloudflare のすべて 16 ― Access
  • 6 / 14
  • オリジンで JWT を検証する
  • const TEAM = "https://your-team.cloudflareaccess.com";
  • const JWKS = createRemoteJWKSet(new URL(`${TEAM}/cdn-cgi/access/certs`));
  • const token = req.headers.get("cf-access-jwt-assertion");
  • const { payload } = await jwtVerify(token, JWKS, {
  • issuer: TEAM, audience: "アプリの AUD タグ" });
  • // payload.email がログインした人
  • ヘッダーがあるだけで信じない。署名・発行元・宛先(AUD)を必ず確かめる
  • 署名を確かめれば、「Access を通ってきた」ことを証明できる。

ログインの方法(IdP)を選ぶ

Access は、たくさんの IdP とつなげます。会社の状況に合わせて選びます。

IdP向いている場面
ワンタイム PINメールアドレスに届くコードで入る。IdP の準備がいらないので、まず試すのに最適。外部の協力会社の人にも使える
GoogleGoogle Workspace を使っている会社、個人の Gmail で入る小さなチーム
GitHub開発者向けのツール。GitHub の組織やチームで絞り込める
Microsoft Entra ID・Okta など会社のアカウント管理の本命。グループ(部署)をポリシーに使える
SAML・OIDC に対応したもの一覧に無い IdP も、標準の方式でつなげる

複数の IdP を同時に使うこともできます。たとえば「社員は Entra ID、外部の協力会社の人はワンタイム PIN」とし、ポリシーで「協力会社の人はこのアプリだけ」と絞ります。

ワンタイム PIN は便利ですが、「そのメールアドレスを受け取れる人」を確かめているだけです。会社のアカウントと違い、退職の管理や多要素認証とはつながりません。社員向けには、会社の IdP をつなぐのが基本です。

  • Cloudflare のすべて 16 ― Access
  • 7 / 14
  • ログインの方法(IdP)を選ぶ
  • ワンタイム PIN
  • メールに届くコードで入る。準備ゼロ
  • Google・GitHub
  • 個人や小さなチームでよく使う
  • Microsoft Entra ID・Okta
  • 会社のアカウント。グループも使える
  • SAML・OIDC
  • 対応していれば、ほかの IdP もつなげる
  • 複数を同時に
  • 社員は Entra ID、外部の人は PIN など
  • 会社のアカウントがあればそれを。無ければメールのワンタイム PIN。

導入:チームを作り、アプリとポリシーを登録する

Access の設定は、Cloudflare One(Zero Trust)の管理画面で行います。

順番やることポイント
1初回にチーム名を決めるyour-team.cloudflareaccess.com になる。ログイン画面や JWT の発行元の URL
2IdP を追加するまずはワンタイム PIN で試し、次に会社の IdP をつなぐ
3アプリを追加する種類は「セルフホスト」。守りたいホスト名(app.example.com)とパスを登録
4ポリシーを書く許可する人と条件。最初は自分のメールだけで試すと安全
5試すブラウザのシークレットウィンドウで開き、ログイン画面が出るか、許可されない人が止まるか確かめる

前提として、守るホスト名の DNS が Cloudflare にあり、プロキシ(オレンジの雲)を通っている必要があります(01号)。社内のサーバーなら、15号の Tunnel の公開ルートとして作っておきます。

アプリの設定画面には、前のページで使う AUD タグが表示されます。オリジンで JWT を検証するときに使うので、控えておきましょう。設定は Terraform でコードとして管理することもできます(34号)。

  • Cloudflare のすべて 16 ― Access
  • 8 / 14
  • 導入:チームを作り、アプリとポリシーを登録する
  • 1. チーム名
  • your-team.cloudflareaccess.com が決まる
  • 2. IdP を追加
  • まずはワンタイム PIN、次に会社の IdP
  • 3. アプリを追加
  • セルフホスト:app.example.com を登録
  • 4. ポリシー
  • 許可する人と条件を書く
  • 5. 試す
  • シークレットウィンドウで開いて確認
  • Cloudflare One(Zero Trust)の画面で、アプリを1つずつ登録する。

ポリシーの書き方:含める・必須・除く

ポリシーの条件は、3つの枠に分けて書きます。

枠意味論理
Include(含める)対象になる人どれか1つに当たればよい(OR)
Require(必須)対象の人が必ず満たすべき条件すべて満たす必要がある(AND)
Exclude(除く)当たったら外すどれか1つでも当たれば外れる(NOT)

図の例を読むと、「@example.com のメールの人、または GitHub の example-org のメンバー」のうち、「日本から、かつ管理された端末で」アクセスしていて、「[email protected] ではない」人を許可する、という意味になります。

ポリシーの動作には、次の4つがあります。

動作意味
Allow条件に当たる人を通す
Block条件に当たる人を止める
Bypass確認をしない(誰でも通す)。公開してよいパスにだけ使う
Service Auth人ではなく、サービストークンなどの機械の認証で通す

1つのアプリに複数のポリシーを付けることもできます。

  • Cloudflare のすべて 16 ― Access
  • 9 / 14
  • ポリシーの書き方:含める・必須・除く
  • アプリ:app.example.com 動作:Allow(許可)
  • Include(どれか1つ) メールが @example.com で終わる
  • GitHub の組織 example-org のメンバー
  • Require(全部) 国:日本 / 端末の状態:管理された端末
  • Exclude(当たれば除外) [email protected]
  • 動作には Allow・Block・Bypass(確認しない)・Service Auth(機械用)がある
  • Include のどれか ∧ Require の全部 ∧ Exclude に当たらない。

機械からのアクセス:サービストークン

Access で守ったアプリに、人ではないものがアクセスしたい場合があります。CI から社内の API を叩く、夜間のバッチが社内のサーバーからデータを取る、といった場面です。機械は、ブラウザで Google にログインできません。

そのために使うのがサービストークンです。管理画面で作ると、Client ID と Client Secret の組が発行されます。機械は、これを2つのヘッダーに入れて送ります。

curl https://api.example.com/report \
  -H "CF-Access-Client-Id: xxxx.access" \
  -H "CF-Access-Client-Secret: yyyy"

アプリの側では、動作を Service Auth にしたポリシーで「このサービストークンなら通す」と書きます。

注意理由
Secret は作成時にしか表示されない控え忘れたら作り直す
期限を決めて入れ替える漏れたときの被害を小さくする
CI のシークレット機能に入れるコードやログに直接書かない

サービストークンで通ったリクエストにも JWT が付くので、オリジンで同じように検証できます。

  • Cloudflare のすべて 16 ― Access
  • 10 / 14
  • 機械からのアクセス:サービストークン
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • ② ポリシー:この人を通してよい?
  • CI・バッチ
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 人ではない
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • トークン
  • CF-Access-Client-Id と CF-Access-Client-Secret の2つのヘッダーを付けて送る
  • ポリシーは Service Auth で「このトークンなら通す」。期限を決めて入れ替える
  • 人がログインできない CI やバッチは、ID と秘密の組で通す。

料金と制限:少人数なら無料で始められる

Access を含む Cloudflare の Zero Trust は、使う人の数(シート)で料金が決まります。

プラン中身
無料50人まで。Access も Gateway(17号)も使える。ログの保存期間は短い
有料(従量)1人あたりの月額。人数の上限が無くなり、ログの保存期間などが増える
企業向け(契約)大規模向けの機能とサポート

小さな会社やチーム、個人の開発なら、無料の枠で本格的に使えます。自宅のサーバーを Tunnel で出し、自分だけが入れるように Access で守る、という使い方も無料でできます。

注意したいのは、シートの数え方です。一度ログインした人は、一定期間シートを使っている扱いになります。外部の人をワンタイム PIN で招くと、その人も数に入ります。人数が上限に近い場合は、使わなくなった人のシートを外す操作が要ることがあります。

アプリの数やポリシーの数などにも上限があります。数字は公式の Limits のページで確かめてください。

2026年9月時点の情報です。料金・上限は変わるので、公式で確かめてください。

  • Cloudflare のすべて 16 ― Access
  • 11 / 14
  • 料金と制限:少人数なら無料で始められる
  • 無料プラン:50人まで。Access も Gateway も使える
  • 有料:1人あたりの月額。ログの保存期間やサポートが増える
  • アプリの数・ポリシーの数などに上限あり(公式の Limits)
  • 一度ログインした人はシートを使う。人数の数え方を確認
  • 2026年9月時点の情報。料金・上限は変わるので公式で確かめること
  • Zero Trust は人数(シート)で数える。無料枠は50人まで。

よくある落とし穴

落とし穴何が起きるか対策
オリジンに直接届く道が残っているAccess を通らずに入れるTunnel でつなぎ、受け口を閉じる(15号)。または Cloudflare 以外からの接続を拒否
JWT を検証していない迂回路があると、ヘッダーを偽造されて素通りオリジンで署名・発行元・宛先を検証する
Include に Everyone を入れた「誰でもログインできる人」が全員許可になる必ずメールのドメインやグループで絞る
Bypass を広く使ったそのパスは誰でも見える公開してよいもの(ヘルスチェックなど)だけに使う
セッションが長すぎる権限を外しても、しばらく入れてしまうアプリの重要度に合わせて短くする
サービストークンを使い回した漏れたときに止める範囲が大きい用途ごとに作り、期限を決める

いちばん大事なのは1つ目です。Access は「エッジを通るリクエスト」だけを審査します。エッジを通らない道が1本でも残っていれば、そこが裏口になります。 Tunnel と組み合わせ、社内ツールの受け口を閉じることで、初めて Access が唯一の入り口になります。

  • Cloudflare のすべて 16 ― Access
  • 12 / 14
  • よくある落とし穴
  • オリジンの IP・ポートが開いたまま → Access を通らず直接入れる
  • JWT を検証していない → ヘッダーを偽造されたら素通り
  • Include に Everyone → 世界中の人が「許可」になる
  • Bypass を安易に使う → そのパスは誰でも見える
  • Tunnel でつなぎ、オリジンで JWT を検証し、最小の人だけ許可
  • Access を迂回できる道を残さない。JWT は必ず検証する。

ほかの号とのつながり

号つながり
15 Tunnel社内ツールを受け口なしでつなぐ。Access とセットで使う
17 Gateway と WARP端末の状態(ポスチャ)を調べ、ポリシーの条件に使える。社員の端末側の通信も守る
01 DNS守るホスト名は Cloudflare のプロキシを通す
18 WorkersWorker の前に Access を置いて、管理用の API を守る
33 企業ネットワークAccess は、ネットワークとセキュリティをまとめる SASE の一部
34 Terraformアプリとポリシーをコードで管理する

Zero Trust の3つの号は、1つの形になります。Tunnel がつなぎ、Access が確かめ、Gateway が端末の側を守る。次の17号では、社員の端末から出ていく通信を守る Gateway と WARP を見ます。

  • Cloudflare のすべて 16 ― Access
  • 13 / 14
  • ほかの号とのつながり
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • ② ポリシー:この人を通してよい?
  • 社員
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • 15 Tunnel
  • 17 Gateway と WARP:端末の状態(ポスチャ)をポリシーの条件に使う
  • 18 Workers:Worker の前に Access を置く / 33 企業ネットワーク:SASE の一部
  • Tunnel でつなぎ、Access で確かめ、Gateway で端末側を守る。

まとめ:網ではなく、人とリクエストを信じる

項目内容
何か社内ツールの手前で、リクエストのたびに本人確認をする受付
なぜVPN は「入れば全部」、ツールごとのログインはバラバラで弱い
ログインAccess はパスワードを持たず、IdP(Google・Entra ID・ワンタイム PIN など)に任せる
ポリシーInclude(OR)・Require(AND)・Exclude(NOT)。人・場所・端末で決める
後ろへの伝え方Cf-Access-Jwt-Assertion ヘッダーの JWT。Cookie は CF_Authorization
オリジンJWT の署名・発行元・宛先を検証する。迂回路を塞ぐ
機械サービストークン(Client ID と Secret のヘッダー)
料金50人まで無料。それ以上は1人あたりの月額

「社内にいるから安全」ではなく、「毎回確かめたから安全」。これが Access の考え方です。

  • Cloudflare のすべて 16 ― Access
  • 14 / 14
  • まとめ:網ではなく、人とリクエストを信じる
  • Cloudflare のエッジ ― Access
  • ① ログイン済み? まだなら IdP へ
  • JWT 付き
  • ② ポリシー:この人を通してよい?
  • 社員
  • ③ 通すときは JWT を付けて送る
  • 社内ツール
  • 家・カフェ・出張先
  • Tunnel でつなぐ(15号)
  • IdP
  • Google・GitHub など
  • IdP でログイン → ポリシーで判定 → JWT を付けて社内ツールへ
  • オリジンは JWT を検証し、迂回路を塞ぐ。機械はサービストークン。50人まで無料
  • リクエストのたびに誰かを確かめ、JWT で後ろに伝える。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]