Cloudflare のAPIの使い方がわかりづらい.
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 ダッシュボードで何を有効にすればそのエンドポイントのリソースにアクセスすることができるのか、手探りで探すしかないこと.
がんばってここからTokenとリソースのアクセス権の関係を探せば行けそう
試しにmTLSにおけるクライアント証明書を取得するエンドポイントへのアクセス権を制御してみる.
- 前提: Cloudflare でドメイン取得していること.
エンドポイントの仕様はここ↓
例として↓のような記載がある.
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}
は↓から取得できる.
しかし先述の通り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
を設定してみる.
ダッシュボードページ(https://dash.cloudflare.com/profile/api-tokens)->Create tokenに->Create Custom token
下記のように設定していく. Permissionsに関してはドキュメントの文言とそのまま対応しているのでここはわかりやすい.
Token作成を完了すると
一度きりの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で確認した例.
X-Auth-Key
なしで、tokenベースでアクセスできた!
試しにPermissionをAPI Gateway:Edit
というなんかこれでも行けるかもと思えるようなものに変えてみると Responseに403 Authentication Errorが返ってきて、特定のエンドポイントに対応するリソースのみにアクセスを制限できている、ということが確認できた.