Cloudflare Meet-up Tokyo Vol.2で発表した資料です https://cfm-cts.connpass.com/event/291753/
Cloudflare Zero Trustを利⽤したセキュアな開発環境へのアクセス⼿法の確⽴株式会社サイバーエージェント AI事業本部 黒崎 優太 (@kuro_m88)
View Slide
ࠇ࡚ ༏ଠגࣜձࣾαΠόʔΤʔδΣϯτ AIࣄۀຊ෦@kurochan@kuro_m88αΠόʔΤʔδΣϯτ CTO౷ׅࣨ
最近書いた記事• サイバーエージェントのGitHub CopilotのAnalyticsデータを公開! 利⽤開始から約3ヶ⽉でエンジニアの⽣産性は向上したのかhttps://developers.cyberagent.co.jp/blog/archives/9
インターネットゼミ• インターネットの勉強をするゼミ• 社内ゼミ制度• サイバーエージェントの実験⽤ASであるAS63 79 0を運⽤しています
普段の仕事• AI事業本部にて⼩売企業のDXを⽀援をする事業をやっています• スマホアプリ• データ分析基盤
本⽇話すこと• AI事業本部にて⼩売企業のDXを⽀援をする事業をやっています• スマホアプリ• データ分析基盤• 様々な取引先の様々なシステムを開発• 関わる⼈も様々• 接続先も様々• ⼈や役割によって違うアクセス範囲を適切に管理したい• 本⽇のテーマ!
Before Cloudflare Zero Trust
VPN!• VPNによるセキュリティ担保• WireGuardを採⽤• 個⼈的に知⾒があった• ハマりどころがほとんどない• 唯⼀のハマりどころは→くらいかもhttps://kurochan-note.hatenablog.jp/entry/9
WireGuardとOpenID Connectの連携https://speakerdeck.com/kurochan/wireguardtoopenid-connectfalselian-xi-wogoteshi-zhuang-sitemita
WireGuardとOpenID Connectの連携• 実装してみて、⼀応動いたが…• 便利だったようで⼀気に数⼗⼈使うようになった• 実装に必要な前提知識が意外と多くてメンテを誰かに引き継げる気がしなかった• WireGuard、OIDC CIBA Flow、nftables、netlink、Go⾔語でのこれらの動的操作• 固定IPだけに頼るのはイケてない• せっかく社内に内製IdPがあるので柔軟な認可の制御もしたい• VPC内アクセスとかもしたい
After Cloudflare Zero Trust
脱WireGuard• WireGuardの導⼊によって開発プロジェクト⽤のVPNの需要は把握• もっとやりたいことが増えてきた• 通信先によってアクセス元IPアドレスを変えたい• ⼈や役割によってアクセス可否を変えたい(認可をちゃんとやりたい)• 通信先によってVPNを切り替えるのが⾯倒• ちょうどいい製品を探し始めた
Cloudflare Zero Trust• いろんな機能があって充実している• アイデア次第で⾊々できそう• その分最初は使い⽅を迷うかも…?• スマホ対応は必須だった• スマホアプリの開発で開発環境のAPIのアクセス制御もしたいのでブラウザ対応だけではダメ• APIで操作するためのクライアントライブラリが公式で⽤意されている• https://github.com/cloudflare/cloudflare-go• 安い!!!!!!• $3/user• 現在85ユーザ使っているので、 $3 x8 5= $255/month• 通信量課⾦なし!!!!!!
Cloudflare Zero Trustの導⼊https://developers.cyberagent.co.jp/blog/archives/9
Cloudflare Zero Trustの導⼊• 構成の概要
DNS応答の書き換え• Cloudflare Zero TrustのFirewall Policyを利⽤• www.cyberagent.co.jp のDNSの応答を100.64.1.1に書き換える例
DNS応答の書き換え
cloudflaredに中継する• cloudflaredで100.64.0.1をlistenする• Cloudflare Zero Trustの設定で100.64.0.1/24をcloudflaredに転送する• nginxで本来の宛先にTCP Proxy
TCP Proxyをさせる理由• 普通に考えるとCloudflare Zero TrustでHTTPの転送をしたい• 通信先はHTTPSもある• cloudflared+nginxでHTTPSの転送をさせようとするとTLSを終端しないといけない• Cloudflare Zero TrustはHTTPSの終端にも対応• ただしCloudflare提供のroot証明書をクライアント(PC、スマホ)にインストールが必要• root証明書を信⽤してもらうということは通信内容の覗き⾒が可能、ログも残っちゃう• あくまでproxyがしたいのであって今回はMITMは不要• 必要ないのにroot証明書のインストールをさせるのはセキュリティ的な懸念も• TCP(L4)でproxyすることで暗号化したままアクセス制御が可能に!https://developers.cloudfl
認可制御• Cloudflare AccessのPrivate Network Applicationを利⽤
認可制御• Cloudflare AccessのPrivate Network Applicationを利⽤• アプリを作成するとNetwork Policyが2つ⽣成される• AllowとBlock
認可制御• Cloudflare AccessのPrivate Network Applicationを利⽤• アプリを作成するとNetwork Policyが2つ⽣成される• Allowするルール• 通信先が100.64.0.1• 認証しているユーザのメールアドレスが がいずれかのemail listに所属• users-project-aaa-dev• users-project-bbb-admin users-project-aaa-devusers-project-bbb-admin
認可制御• Cloudflare AccessのPrivate Network Applicationを利⽤• アプリを作成するとNetwork Policyが2つ⽣成される• Denyするルール• 通信先が100.64.0.1• すべてブロック
認可制御• Cloudflare AccessのPrivate Network Applicationを利⽤• アプリを作成するとNetwork Policyが2つ⽣成される• AllowとBlock• 認可制御したい単位でemail listを作成すれば⼈、役割に応じてアクセス制御可能!
認証• OIDCで社内IdPで認証する• セットアップ時に⼀回だけやればOK• WARP or1.1.1.1アプリでスライダをオンにするだけで接続完了!
認証• OIDCで社内IdPで認証する• セットアップ時に⼀回だけやればOK• WARP or1.1.1.1アプリでスライダをオンにするだけで接続完了!• クライアント側でやってもらうことがとても少ない!• アプリをインストールしてログインしてくださいという指⽰だけで済む• Split Tunnelの設定などもCloudflare Zero Trustの管理者側で制御可能
アカウント棚卸しとemail listの同期• OIDCでログイン & アカウント作成はできるが削除(棚卸し)ができない• 社内IdPのAPIとCloudflare Zero TrustのAPIを利⽤して同期• 社内IdPのAPIで社員の異動退職に伴う失効を管理• 社内IdPのAPIで社員に紐づくロールごとにCloudflare Zero Trustのemail listを同期• AWS Lambdaで3分に1回同期処理を実⾏• たぶん⽉額コスト10円くらい
One more thing…
cloudflared + nginxの置き換え• サーバのセットアップが⼿動で⾯倒だった• 接続先が増えるごとにサーバにsshしてnginxのconfigを書き換えていた• コンテナ化して配布、構築を楽にしたい欲がでてきた• ついでにcloudflaredとTCP Proxyを1つのコンテナにして起動を簡単にしたい• ついでに定期的にS3から設定ファイルを読んで⾃動更新してほしい• ついでにDNSで上書きする対象のInternal IPアドレスの管理も⾯倒なので IPv6single stackにして⾃動採番したい
TCP Proxyの⾃前実装• Goでデーモンを実装• 1分に1回S3から設定ファイルをダウンロードする• 差分を検出したらアップデート• Linuxのdummyインターフェイスにlistenが必要なIPアドレスを付与• Goでnetlink経由でインターフェイスを制御• 1万個IPアドレスを振っても⽬⽴った異常はなかったので実⽤性問題なし• TCP Proxyは勉強がてら書いてみた• proxyなので流れてきたデータを右から左に受け流す感じ• 負荷をかけてもメモリ使⽤量は30MBいかないくらい
IPv6アドレスの⾃動採番• fd00::/8IPv6ULA(IPv4でいうPrivate IPに似ている)から/64で cludflaredが利⽤するprefixを切り出す•56bitあるのでちゃんと管理しなくても乱数で決めておけばOK• fd00:caca::/64を使う例• ホスト名のsha2 5 6hashを取って上位64bitを取り出す• www.cyberagent.co.jp => ddc9529d2d9d21c4• prefixとsha25 6hashの上位64bitをくっつける• fd00:caca::ddc9:529d:2d9d:21c4• Cloudflare Zero TrustのDNS PolicyでOverride Policyを書く• www.cyberagent.co.jp => fd0 0:caca::ddc9:529d:2d9d:21c4• プロキシ先に関してのみCloudflareによりIPv6アドレスのみ返却されるのでIPv6Single Stackになるが、 TCP Proxyがあるので最終的な転送先がIPv4アドレスであっても問題ない
TCP Proxyのアプリでcloudflaredも管理する• TCP Proxyのプロセス内でcloudflaredを起動する• cloudflaredもGoで実装されているが内部実装が変わって壊れると⾯倒なのでサブプロセスとしてcloudflaredのバイナリを起動
まとめ• Cloudflare Zero Trustを使ってVPNの代替を実現しました• 85⼈くらいがこのシステムを活⽤しています!• 認可制御もできて運⽤コストも安くて⾮常に満⾜しています!• 他にもセキュリティ機能が⾊々あるので活⽤していきたい• Magic WANやMagic Transitも遊んでみたい• Enterprise契約が必要なので躊躇しています