Cloudflare Access の認証をアプリケーションから行うためにサービストークンを使用する
ウィスキー、シガー、パイプをこよなく愛する大栗です。
Cloudflare Zero Trust の認証を担う Access は基本的にユーザーを識別します。しかし、アプリケーションへのアクセスはユーザーだけでなくアプリケーションが行う場合もあります。アプリケーションで認証を行う場合にはサービストークンを使用するので、試してみます。
サービストークン
サービストークンはアプリケーションやシステムに対して Cloudflare Access のポリシーに対して認証を行います。クライアント ID とクライアントシークレットで構成されるサービストークンを使用します。
サービストーク人による認証では以下の 2 種類の HTTP ヘッダーを使用します。
- CF-Access-Client-Id
- CF-Access-Client-Secret
やってみる
サービストークンを発行する
Cloudflare Zero Trust のコンソールで操作を行います。[Access]-[Service Auth] を開きます。ここでCreate Service Token
をクリックします。
Service token name に任意のトークンの名称を入力して、Service Token Duration でトークンの有効期限を設定してGenerate token
をクリックします。Service Token Duration は以下の 5 種類から選択します。ここでは Non-expiring を選択しました。
- 1 year
- 2 years
- 5 years
- 10 years
- Non-expiring
サービストークンが発行されるので、Header and client ID と Header and client secret をメモします。
サービストークンでアクセスを許可するポリシーを設定する
Cloudflare の Web サイト設定の画面で DNS を開きAdd record
をクリックします。
アクセスの設定を行うサイトを DNS に登録します。
サイトの DNS が登録されました。
Cloudflare Zero Trust のコンソールで操作を行います。[Access]-[Applications] を開きます。ここでAdd an application
をクリックします。
自前で運営しているサイトを対象にするため、ここで Self-hosted のSelect
をクリックします。
アプリケーション名とセッション継続期間、アプリケーションのドメインなどを入力してNext
をクリックします。
ポリシー名を入力して、ルールアクションでService Auth
を設定します。Configure rules で Selector でService Token
を選択して、Value で先ほど作成したサービストークンを選択します。そしてNext
をクリックします。
今回は CORS や Cookie などの設定が不要であるため、そのままAdd application
をクリックします。
サービストークンで認証を行うアプリケーションの設定を実施しました。
サービストークンを使用してアクセスする
まずは、サービストークンを使用せずにアクセスしてみます。ステータスは 403 となりアクセスできません。
% curl --head https://test1.example.com HTTP/2 403 date: Mon, 08 Aug 2022 06:43:57 GMT content-type: text/html cf-access-aud: abcd1234efgh5678abcd1234efgh5678abcd1234efgh5678abcd1234efgh5678 cf-access-domain: test1.example.com expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=vfnovra%2B0fR5UU7nHa9SVw3NDB2g%2F4HLjyIIzZuO%2F1I%2FY7OR9sMUn0yqc3xzt4kEncloVB%2BJ2W3x"}],"group":"cf-nel","max_age":604800} nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} server: cloudflare cf-ray: 123456ab1234abcd-KIX alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
次に、CF-Access-Client-Id
ヘッダーとCF-Access-Client-Secret
ヘッダーを設定してアクセスしてみると、ステータスが 200 で正常にアクセス可能になりました。
% curl --head -H 'CF-Access-Client-Id: 1234abcd5678efgh1234abcd5678efgh.access' \ -H 'CF-Access-Client-Secret: 1234abcd5678efgh1234abcd5678efgh1234abcd5678efgh1234abcd5678efgh' \ https://test1.example.com HTTP/2 200 date: Mon, 08 Aug 2022 07:39:27 GMT content-type: text/html; charset=UTF-8 set-cookie: CF_Authorization=abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcd1234; Expires=Tue, 09 Aug 2022 07:39:27 GMT; Path=/; Secure; HttpOnly; SameSite=none link: <https://test1.example.com/wp-json/>; rel="https://api.w.org/" cf-cache-status: DYNAMIC expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=vfnovra%2B0fR5UU7nHa9SVw3NDB2g%2F4HLjyIIzZuO%2F1I%2FY7OR9sMUn0yqc3xzt4kEncloVB%2BJ2W3x"}],"group":"cf-nel","max_age":604800} nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} server: cloudflare cf-ray: 123456ab1234abcd-KIX alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
さいごに
ポイントとしては、Application のポリシーでルールアクションにService Auth
を設定することです。最初はAllow
を設定してしまい、サービストークンを設定しても Idp のログインへリダイレクトしてしまいアクセスができませんでした。
Cloudflare Access は人によるアクセスだけでなくアプリケーションのアクセスでも対応可能ですので、API へアクセス行う場合などにご利用いただければと思います。