Cloudflare Access の認証をアプリケーションから行うためにサービストークンを使用する

Cloudflare Access はブラウザで人がアクセうするだけでなく、サービストークンでアプリケーションのアクセスも制御できます。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

Cloudflare Zero Trust の認証を担う Access は基本的にユーザーを識別します。しかし、アプリケーションへのアクセスはユーザーだけでなくアプリケーションが行う場合もあります。アプリケーションで認証を行う場合にはサービストークンを使用するので、試してみます。

Service tokens

サービストークン

サービストークンはアプリケーションやシステムに対して 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 へアクセス行う場合などにご利用いただければと思います。