メインコンテンツまでスキップ

CloudflareのZero Trustを利用したGit認証機能の追加

· 約4分
arasan01

Cloudflare Zero Trust

Cloudflareが提供している製品です、Cloudflareで管理するドメインに対してアクセス時にOAuth認証やService Accountでの認証を追加します。この製品を利用することで自分が管理するアプリケーションのアクセスに対して柔軟に認証機能を提供します。現在は50人まで無料で使えます。

https://www.cloudflare.com/ja-jp/zero-trust

Cloudflareは様々な用途に対応するためツールを作成しています。

  • 開発ツールとして wrangler を提供しています。
  • ネットワークの管理ツールとして cloudflared を提供しています。
  • Cloudflareのネットワークに直接アクセスするツールとして WARPを提供しています。

Zero Trustの文脈ではWARPを利用して開発組織の権限を持つと認識させることができるため、Zero Trustを簡単に実現します。cloudflared を利用するとCLI上でのトークン取得ができます。WARPが利用できない環境での認証機能を利用できます。

Cloudflared

cloudflared にはngrokの代替となるlocalhostのhttps公開という機能があります。その他にもCloudflare Zero Trustへのトークン管理という側面もあります。

CLI上でのloginを実行した場合にはbrowserでのやり取りを通じてOAuthの認証やメールリンクでの認証が利用できます。これを実行するとCloudflare Zero Trustで利用されるJWTトークンが取得できます。

$ cloudflared access login <Zero Trust Setup URL>

このトークンでは内部的に以下のようなデータをやり取りします。これをCloudflareがよしなに解釈して認証を提供します。

// Header
{
"alg": "RS256",
"kid": "287374abddca37ff6b5ac4c80dbcaba36362983dfafddacc2737ac7738281288"
}

// Payload
{
"aud": [
"abab38aabb38203923ddb73837498fff2374987234dacb98b723a49d71239e84"
],
"email": "[email protected]",
"exp": 1293061349,
"iat": 1291851749,
"nbf": 1291851749,
"iss": "https://organization.cloudflareaccess.com",
"type": "app",
"identity_nonce": "AjofiewJFkjdfKK",
"sub": "edf0d58e-6a1d-5247-b604-6a0fd4a1ae27",
"sub": "afdf3483-aa23-1238-c373-87818adcb929",
"country": "JP"
}

Gitの認証機能

例えば、GitのホスティングサービスではGitHubを使うことで認可を操作します。これに加えてGit LFSなどの外部拡張を使う場合にはGitHubが提供しているLFSストレージへの包括的な認可まで一貫して提供します。

これをLFSサーバのみ自前で用意する、GitサーバとGit LFSサーバの両方を自前で管理することを考えます。OSSとしての開発であっても、任意のユーザが好き勝手にGitリポジトリへの編集をされると困るためアクセスするユーザは認証を通過させる必要があります。これをCloudflare Zero Trustで認証機能を後付で実現します。

例えば git clone をする場合にはcloneにヘッダーを追記することで外部の認証を通すことが可能になります。

$ brew install cloudflare/cloudflare/cloudflared
$ cloudflared access login <Zero Trust Setup URL>
$ git clone --config "http.extraHeader"="cf-access-token: $(cloudflared access token -app=<Zero Trust Setup URL>)" <repo-url>

コマンド参考: https://github.com/git-lfs/git-lfs/blob/main/t/t-extra-header.sh