Open3

Cloudflare のAPIの使い方がわかりづらい.

tomozosantomozosan

Cloudflareのサービスをプログラムを使って制御したい

https://api.cloudflare.comを見れば良さそう.
ただし困ることが、、
この記事の方が書いてれたように、
headerにAPI keyとしてX-Auth-Key なんてのを入れないといけないのですが, Global API Keyなんていうなんでもできちゃう権限のAPI keyなのでCIやサービス連携などで大変使いづらいのでToken使いましょうやということ.

公式ドキュメントにもGlobal API keyは非推奨となっているし.

ただし、問題はhttps://api.cloudflare.comを見てもどこにもそのendpointに相当するtokenの権限の範囲の指定方法が載っていないので、CloudflareのAPI-tokens ダッシュボードで何を有効にすればそのエンドポイントのリソースにアクセスすることができるのか、手探りで探すしかないこと.

tomozosantomozosan

試しにmTLSにおけるクライアント証明書を取得するエンドポイントへのアクセス権を制御してみる.

  • 前提: Cloudflare でドメイン取得していること.

エンドポイントの仕様はここ↓
https://developers.cloudflare.com/api/operations/client-certificate-for-a-zone-list-client-certificates

例として↓のような記載がある.

curl --request GET \
  --url https://api.cloudflare.com/client/v4/zones/{zone_identifier}/client_certificates \
  --header 'Content-Type: application/json' \
  --header 'X-Auth-Email: xxxx' \
  --header 'X-Auth-Key: 123'

なおパスパラメータの{zone_identifier}は↓から取得できる.
where_is_zone_identifier.png

しかし先述の通りX-Auth-KeyはGlobal Keyなので使いたくない.
このドキュメントにはどこにも言及がないが
toekn で

curl --request GET \
  --url https://api.cloudflare.com/client/v4/zones/{zone_identifier}/client_certificates \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer xxxx'

でやる方法を探す.

どうやらエンドポイント名にzonesとあるので、Zone Permissionに関係するアクセス権を設定すれば良いらしい. 今回の目的はクライアントの証明書の読み取りのみであるのでSSL and Certificates:Readを設定してみる.

SSL certificate access image

ダッシュボードページ(https://dash.cloudflare.com/profile/api-tokens)->Create tokenに->Create Custom token
create custom token

下記のように設定していく. Permissionsに関してはドキュメントの文言とそのまま対応しているのでここはわかりやすい.
Token settings

Token作成を完了すると
token page
一度きりのtoken表示がなされるので、コピーしておく.

curl --request GET \
  --url https://api.cloudflare.com/client/v4/zones/{zone_identifier}/client_certificates \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer {コピーしたToken}'

↓はHTTPiでGUIで確認した例.
httpi example
X-Auth-Keyなしで、tokenベースでアクセスできた!

試しにPermissionをAPI Gateway:Editというなんかこれでも行けるかもと思えるようなものに変えてみると Responseに403 Authentication Errorが返ってきて、特定のエンドポイントに対応するリソースのみにアクセスを制限できている、ということが確認できた.