webサイトだけじゃなかった! Cloudflare Accessを使ってAPIサーバをセキュアに保ってみる
少し前、Cloudflare Accessでこんな記事を書いていました。
要は「Cloudflare Access使えばプライベートサイトが一瞬で作れる!最高!」というお話なのですが、最近Cloudflare Accessのもう一つの使い方を見つけてしまったのです・・・
経緯
筆者は定期的に「個人開発でイッセンマンを目指すぞ!」という衝動が湧いてしまうのですが、そのときにどうしても0-1開発では不必要なほどオーバーエンジニアリングなインフラ構成を考えてしまうクセがあります。
今回も例に漏れず、ぶっちゃけSupabaseとかFirebase、Amplifyを使えばササッとできるようなものに対して壮大なインフラ図を描いてしまったのです。
全体像についてはまた別の機会にお話しようかなと思います。今回はその内の一部のお話です。
BFFなサーバーとメインとなるAPIサーバをどうコスパよくセキュアにつなぐか?
まず個人開発なのにBFFとか考えようとしてる時点でお察しですね。まぁそれは置いておきましょう。
メインとなるAPIサーバはBFFとしか接続しない想定です。できるだけセキュアに保つためには「BFFからのリクエストでなければそもそもサーバーのコードを実行させないようにする」だと思っています。そうなるとプライベートネットワーク系なツールが必要になってきますね。AWSだと
とか、GCPだと
こんな感じですかね?APIGatewayだったりとか、まぁ手段は色々あるかと思います。
ただ筆者は何故か抵抗がありました。こういうツールを使うとどうしてもクラウドベンダーロックインになりそうというか、「オレの考えた最強の個人開発アーキテクチャ」から遠くなっちゃいそうな直感が働いていました。
Cloudflare Accessへ
ここでふと、「ネットワークとセキュリティといえばCloudflareがあるじゃん!てかCloudflare Accessあるからあれでなんかできるだろ!!」と思いついたのです!天才
Cloudflare Accessはステージング環境や社内プライベートサイトへのアクセス制御につかうくらいしかイメージしてなかったのですが、アクセストークンとか、固定IPでのアクセス制御とかありそう!と思いドキュメントを漁ってみました。
ありました
実践!!
試してみる
ダッシュボードでポチポチしてみます
まずはサービストークンを作りましょう。zero trustのダッシュボードへ行き、Access -> Service Authへ行きます。で、create service tokenを押します
有効期限と名前を入力
トークンが出てくるのでコピります
次にAccess -> Applications で設定します。細かい設定は割愛します!
具体的なルールを設定するところで2つの項目を設定してください。
- Action(Required) の項目を「Service Auth」にする
- 「Configure rules」で「Selector」をService Tokenにする。選択すると、valueのautocompleteに先程設定したサービストークン名が表示されます。
設定完了!
それではアクセスしてみましょう。urlは最初の記事ででてきた
これの使い回しです
ちゃんと弾かれてますね!!
一応curlで叩いて確認もしてみましょう
弾かれてますね!!
それではサービストークンを付与して試してみましょう
ちゃんとレスポンスが帰ってきてる!!!!!!!!!!!!!
やったー!!!!!!!!!
終わりに
サービストークンによって超簡単にサーバーへのアクセス制御ができるようになりましたね!今回は前の記事のためにホスティングしたwebサイトを使いまわしていますが、APIサーバーでも本質的には同じように使えますね。Cloudflare Accessはサーバー間の認証手段にも使えますのでぜひ活用してみてください!!!
皆さんもオレの考えた最強の構成を考えて個人開発していきましょう!!
余談
この文章を書いてるときに気づいたのですが、固定IPさえ持ってたらCloudflare Accessの設定だけで固定IP制限つけることができましたね・・・サービストークンすらいらない・・・
だけど最近のサーバーレスアプリケーションの時代だと固定IPからアクセスすることってなかなかないイメージがありますのでサービストークンによる認証手段は汎用性高く使えていくのではないかと思います!
例: Cloudflare Workers -> Cloudflare Accessで保護されてるurl
サービス開発のための技術をキャッチアップするのが楽しくて本質的な開発がすすまないやつ、皆さんもありませんか?今筆者はそれになってます。
Discussion