Tailscale Apertureは、社内から出るLLMへのリクエストを1か所に集め、Tailscaleのログイン情報で認可して記録するAIゲートウェイです。開発者の端末やCIに配っていたOpenAIやAnthropicのAPIキーを回収でき、誰がどのモデルにいくら使ったかを利用者単位で追えます。この記事で整理するのは、ID解決の仕組み、Claude Codeの接続設定、grantsとquotasの書き方で、設定例付きの解説です。後半では、AIエージェントにノード追加やSSHでのコマンド実行を許す組み込みコネクタの権限設計と、採用する条件・見送る場面を判断します。
まとめ:Apertureは共有APIキーをやめてIDで認可・記録するAIゲートウェイ
Apertureは、クライアントとLLMプロバイダーの間に入るプロキシです。クライアントは接続先URLを書き換えるだけで、APIキーを持たずにリクエストを送れます。認可の根拠はTailscaleが把握しているログイン名・端末・タグで、アプリが自己申告する値ではありません。
導入の判断は単純です。社内でTailscaleを既に使い、APIキーが端末やCIに散らばっているなら採用候補になります。Tailscaleを入れていない組織が、AIゲートウェイのためだけにtailnetを作るのは遠回りです。
AIエージェントにtailnetの操作を許す組み込みコネクタは、2026年9月末時点でalphaです。使うなら、grantsでツール単位に絞り、SSHポリシーでrootを拒否する設定を先に済ませてください。
Tailscale Apertureの仕組みとリクエストがIDで認可されるまでの流れ
Apertureの公式ドキュメントは、製品を「組織全体のLLMリクエストを保護・監視・ルーティングする集中型AIゲートウェイ」と定義しています。利用者向けのChat画面と、管理者向けのダッシュボードの2つの画面を持ちます。
クライアントのIPからログイン名とタグを引くID解決と拒否の条件
Apertureの動作解説によると、ApertureはリクエストのリモートIPをTailscaleに問い合わせ、ログイン名・端末ID・タグを得ます。IDはTailscaleの制御プレーン由来なので、鍵交換を破らない限り詐称できません。
ユーザーを持たないタグ付き端末は、タグを昇順に並べてカンマでつないだtag:api,tag:prodのような合成IDで扱われます。ユーザーもタグも無い端末はID解決に失敗し、アクセスを拒否されます。CIのランナーをApertureにつなぐなら、タグを付けたうえでの登録が必須です。
OpenAI・Anthropic・Bedrockなど6種類のAPI形式への振り分け
Apertureはリクエスト本文からモデル名を取り出し、利用者の権限を確かめてから、そのモデルを提供するプロバイダーへ転送します。対応するAPI形式は、OpenAI Chat Completions、OpenAI Responses、Anthropic Messages、Gemini、Amazon Bedrock、Gemini Enterprise Agent Platformの6種類です。
クライアントからは、Apertureがプロバイダーそのものに見えます。通信はクライアントからApertureまでがTailscaleの暗号化、Apertureからプロバイダーまでが通常のTLSです。同じモデルを複数のプロバイダーに登録した場合は、preferenceの値が高い方へ送られます。
記録されるリクエスト項目とゼロデータ保持で本文を残さない設定の範囲
既定では、リクエストとレスポンスの本文全体、ヘッダー(機密値は伏せ字)、入力・出力・キャッシュ・推論ごとのトークン数、モデル名、所要時間、ツールの使用回数が、ログイン名と端末IDつきで残ります。集計は応答を返した後に非同期で行うため、応答は遅れません。
個人情報や顧客データを含むプロンプトを扱う部署では、本文を残すかを先に決めます。設定リファレンスのdatabase.retention.durationに"0"を書くとゼロデータ保持になり、本文はディスクに書かれず、利用量の数値だけが残ります。空欄のままだと無期限ではなく、適用されるのは既定の保持期間(通常1年)です。
Apertureの導入手順とClaude Codeを接続する設定ファイルの書き方
導入手順のドキュメントでは、aperture.tailscale.comでサインアップし、プロバイダーを設定し、テストリクエストを送る3段階で進めます。利用者の端末は、Apertureと同じtailnetに参加している必要があります。
プロバイダー設定のbaseurlとmodelsを書く最小構成のJSON
管理画面のConfigurationでJSONを直接書くのが早道です。baseurlには/v1を含めません。パスはリクエスト側に含まれるためです。modelsが空だとリクエストを処理できないので、使わせるモデルIDを列挙します。
{
"providers": {
"anthropic": {
"baseurl": "https://api.anthropic.com",
"apikey": "<anthropic-api-key>",
"models": ["claude-sonnet-4-6", "claude-opus-4-8"],
"authorization": "x-api-key",
"compatibility": { "anthropic_messages": true }
}
}
}
Anthropicの認証ヘッダーはx-api-key、Geminiはx-goog-api-keyで、指定しなければbearerになります。APIキーはこの設定1か所にだけ置き、端末には配りません。
Claude CodeのベースURLをApertureに向ける設定と注意点
Claude Codeの接続ガイドどおり、~/.claude/settings.jsonに次の2項目を書きます。URLはhttpsではなくhttpです。tailnet内の通信はTailscaleが暗号化しています。
{
"apiKeyHelper": "echo '-'",
"env": {
"ANTHROPIC_BASE_URL": "http://<aperture-hostname>"
}
}
apiKeyHelperはダミーの値を返すだけで、本物の鍵はApertureが差し込みます。ClaudeのProやMaxのサブスクリプションで使う場合は事情が違います。プロバイダーをパススルーにし、ANTHROPIC_API_KEYとANTHROPIC_AUTH_TOKENは設定しません。設定するとOAuthトークンが上書きされます。
curlでmessagesを送りSessions画面で疎通を確かめる手順
クライアントを設定する前に、curlで経路だけを確かめると切り分けが楽になります。APIキーのヘッダーを付けずに送る点が、通常のAnthropic API呼び出しとの違いです。
curl -s http://<aperture-hostname>/v1/messages \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 25,
"messages": [{"role": "user", "content": "respond with: hello"}]
}'
成功すると、http://<aperture-hostname>/sessionsのSessions画面にリクエストが出ます。応答が拒否される場合は、次章のgrantsで自分にモデルが許可されているかを確かめます。
grantsとquotasでモデル・コネクタ・支出をユーザー単位に絞る設定
Apertureの権限は既定で拒否です。対応するgrantが1つも無ければ、どのモデルも呼べません。権限と予算は同じ設定ファイルに書きます。
既定で拒否のgrantsにsrcとmodelsのglobを書く設定例
次の例は、開発グループにSonnet系だけを1日5ドルの予算つきで許し、CIランナーのタグには予算を別に設け、1人を管理者にする設定です。HuJSONなのでコメントと末尾のカンマを書けます。
{
"quotas": {
// 利用者ごとに1日5ドル補充・最大10ドルまで貯まる
"daily:<user>": { "capacity": "$10.00", "rate": "$5.00/day", "on_exceed": "reject" },
// CIランナー全体で共有する予算
"ci-pool": { "capacity": "$30.00", "rate": "$30.00/day", "on_exceed": "reject" },
},
"grants": [
{
"src": ["group:engineering"],
"app": {
"tailscale.com/cap/aperture": [
{ "role": "user" },
{ "models": "anthropic/claude-sonnet*", "quotas": [{ "bucket": "daily:<user>" }] },
],
},
},
{
"src": ["tag:ci-runner"],
"app": {
"tailscale.com/cap/aperture": [
{ "models": "anthropic/claude-sonnet*", "quotas": [{ "bucket": "ci-pool" }] },
],
},
},
{
"src": ["[email protected]"],
"app": { "tailscale.com/cap/aperture": [{ "role": "admin" }] },
},
],
}
modelsはプロバイダー/モデル形式のglobで、*は区切りの/をまたがず、**は全プロバイダーの全モデルに一致します。group:でSCIM連携のグループを指定するには、visible groupsの有効化が必要です。
quotasのcapacityとrateで日次予算を超えたら429を返す設計
quotasはトークンバケット方式です。capacityが上限残高、rateが補充速度で、単位はminからmonthまで選べます。<user>と<node>はログイン名と端末IDに展開されるため、1行で全員に個別の財布を持たせられます。
超過時の動作は2026年9月末時点でrejectだけで、HTTP 429が返ります。エージェントの自動処理は429を一時的な失敗と見なして再試行しがちです。予算切れで止まったときに再試行を繰り返さないよう、呼び出し側のリトライ条件も合わせて見直します。
pre_requestフックで機密データを送信前にブロックする使い方
hooksは、リクエストの内容を外部のWebhookへ渡して判定させる仕組みです。pre_requestイベントだけが同期で、応答のactionでallow・block・modifyを返せます。個人情報の除去や、特定ツールの呼び出し禁止に使います。
注意すべきはfail_policyの既定がfail_openである点です。判定サーバーが落ちると、検査なしでリクエストが通ります。漏えい防止を目的にするならfail_closedを明示し、判定サーバーの停止が業務停止になることを受け入れて冗長化します。
AIエージェントにtailnetの操作権限を渡す組み込みコネクタの設計
2026年8月26日のGA発表のブログで、Tailscale自身を操作するMCPの入口として、TailnetとTailnet SSHの2つのコネクタが加わりました。エージェントが「新しいマシンをtailnetに入れる」「マシンでコマンドを実行する」を行えるようになります。便利な分、渡し方を誤ると影響範囲が最も広い機能です。
provision_nodeとrun_commandが実行できる操作と上限値
組み込みコネクタのドキュメントによると、ツールは3つです。数値は2026年9月29日検証版の記載です。
| ツール | できること | 主な制約 |
|---|---|---|
| provision_node | 使い捨ての認証キーを発行 | 利用者の承認15分以内・取得10分以内 |
| list_machines | SSH有効マシンの一覧 | 載っていても実行可とは限らない |
| run_command | 1コマンドを実行 | 既定user root・既定300秒・上限600秒 |
run_commandは呼び出しごとに新しいSSHセッションを開くため、作業ディレクトリや環境変数は引き継がれません。出力は約1MiBで切り詰められます。provision_nodeで追加したマシンにはcustom:createdByApertureとcustom:createdByAIの属性が付き、Apertureではなく管理コンソールのMachinesに表示されます。
run_commandの既定ユーザーrootをSSHポリシーで拒否する設定例
Tailnet SSHコネクタ自身は認証情報を持たず、Apertureのノードとして接続します。届く範囲を決めるのはtailnetポリシーのsshルールです。既定ユーザーがrootなので、ポリシー側で一般ユーザーだけを許します。書式はTailscale SSHのドキュメントに従います。
{
"grants": [
// Apertureのノードから作業用マシンの22番だけ到達させる
{ "src": ["tag:aperture"], "dst": ["tag:agent-sandbox"], "ip": ["tcp:22"] },
],
"ssh": [
{
"action": "accept",
"src": ["tag:aperture"],
"dst": ["tag:agent-sandbox"],
"users": ["agent"],
},
],
}
tag:apertureは説明用の名前です。管理コンソールでApertureのノードが実際に持つタグを確かめ、その値を書きます。usersに無いrootでの実行は拒否されるため、エージェントはuser引数にagentを指定する必要があります。本番サーバーには作業用タグを付けず、到達させないことが前提です。Tailscale SSHのルール設計全体はTailscale SSHの設定手順と採用判断で詳しく扱っています。
ワイルドカード**のgrantがコネクタのラベル制限を素通りする失敗
Apertureのgrantではコネクタを"connectors": ["TailnetSSH/tools/list_machines"]のようにツール単位で許可できます。ところが、"**"のような広いgrantを持つ利用者は、コネクタに付けたラベルに関係なく組み込みコネクタへ届きます。全モデルを許す感覚で**を配ると、run_commandまで開放される設定です。
組み込みコネクタは予約ラベルsystemを受け取れず、ID指定でしか許可できません。設定の手順としては、まずlist_machinesだけを特定グループに許し、run_commandは別のgrantで対象者を絞って足す、の2段階にします。
監査ログは1呼び出し1行で出力内容を記録しない仕様への備え方
run_commandの監査ログは1呼び出しにつき1行で、コマンドの出力は残りません。事故の調査で「何が表示されたか」まで追うなら、ログだけでは足りません。作業用マシン側でもシェルの記録を取るか、Tailscale SSHのセッション録画を組み合わせます。
エージェントに渡す権限の範囲、承認を挟む操作、記録の粒度は、モデルの性能より先に決めるべき設計項目です。社内のどの業務までエージェントに任せるかの線引きから一緒に整理する場合は、AIエージェント開発の支援内容をご覧ください。
Apertureの採用条件と見送る場面・Cloudflare AI Gatewayとの違い
AIゲートウェイという分類自体の役割と選定軸は、AIゲートウェイの役割と導入判断で整理しています。ここではApertureに固有の判断に絞ります。
Tailscale導入済みでAPIキーが端末に散らばるチームは採用
採用してよいのは、社員の端末とCIが既にtailnetに参加し、Claude CodeやCodexを複数人で使っているチームです。Apertureの概要ページが挙げる課題は、端末に散らばるAPIキーと、誰がどのモデルをどれだけ使ったか見えない状態の2つです。Tailscaleの認証をそのまま使えるため、利用者ごとの予算と記録が追加の認証基盤なしで手に入ります。Tailscale本体の暗号化の仕組みと料金はTailscaleの安全性と料金の解説で確認できます。
Tailscale未導入やFedRAMPが要る案件で見送る判断の基準
Tailscaleを使っていない組織が、AIゲートウェイのためだけに全端末へクライアントを配るのは過剰です。この場合は既存のクラウドやIdPに沿った製品を選びます。AWS上でClaudeを使う構成ならClaude apps gateway for AWSの構成要件も比較対象になります。
米国政府系の案件でFedRAMP認証が条件なら、Tailscaleは比較ページで「未取得」と自ら記載しているため見送ります。もう1つの見送り条件は、組み込みコネクタを本番運用の前提にする計画です。2026年9月末時点でalphaなので、本番サーバーの操作を任せる設計には使いません。
IDの出どころで分かれるCloudflare AI Gatewayとの比較表
Tailscale側の比較ページは、違いをIDの出どころに置いています。ベンダー自身の比較である点を割り引いて読んでください。
| 観点 | Aperture | Cloudflare AI Gateway |
|---|---|---|
| 利用者の識別 | Tailscaleのログイン・タグ | アプリが渡すメタデータ |
| モデル単位の許可 | grantsで指定 | ルールなし(比較ページの記載) |
| MCP | 複数サーバーを1入口に集約 | ゲートウェイ情報を返すMCPサーバー |
| ゼロ保持 | あり | あり(任意) |
| FedRAMP | 未取得 | 取得済み |
既にCloudflareで公開系の通信を集約している組織ならCloudflare側、社内の開発端末とCIをTailscaleで束ねている組織ならApertureが手間の少ない選択です。境界を持たずに利用者と端末で認可する考え方は、ゼロトラストの解説と同じ設計思想です。
Tailscale Apertureの料金・提供状況・対応ツールのよくある質問
Apertureの検討段階で出やすい質問を、公式ドキュメントとGA発表の記載をもとに回答します。仕様は頻繁に更新されるため、導入前に各ページの検証日を確かめてください。
Tailscale Apertureの料金はいくらですか?
2026年10月時点で、Tailscaleの料金ページにApertureの価格表は載っていません。GA発表では、新規インスタンスに初期のトークンが付き、主要モデルのトークンをApertureの中で追加購入できるほか、自前のサブスクリプションやAPIキーも持ち込めると説明されています。導入ガイドには、Personal以外のプランで自前のAPIキーを使うには営業への問い合わせが必要と書かれています。Tailscale本体はStandardが1ユーザー月8ドル、Premiumが18ドルです。
Apertureは正式版(GA)として提供されていますか?
Tailscaleは2026年8月26日のブログでGAを発表しました。ただし、製品ページには2026年10月時点でもAlpha・Betaの顧客向けの記載が残り、TailnetとTailnet SSHの組み込みコネクタはドキュメント上alphaです。ゲートウェイ本体は正式版、エージェントにtailnetを操作させる機能は試験段階、と分けて扱うのが安全です。国内の報道で見かける日付は、公式の発表日と照合してから使ってください。
ClaudeのProやMaxのサブスクリプションでも使えますか?
使えます。Claude Codeの接続ガイドで案内されているのは、Anthropicのプロバイダーをパススルーモードにし、クライアント側はANTHROPIC_BASE_URLだけを設定する手順です。ANTHROPIC_API_KEYやANTHROPIC_AUTH_TOKENを併せて設定すると、パススルーしたいOAuthトークンが上書きされて失敗します。この構成でもApertureの記録と予算管理は効きます。
LiteLLMなど自前のLLMプロキシと何が違いますか?
機能の重なりは大きく、モデルの振り分け、予算、ログはどちらにもあります。違いは利用者の識別方法です。自前プロキシは仮想キーを発行して利用者を見分けるため、そのキーの配布と失効の管理が残ります。ApertureはTailscaleの端末認証で識別するため、配る鍵そのものがありません。一方で、Apertureはtailnetの外から直接は使えず、Tailscaleへの依存が増えます。
tailnetの外にあるCIやサーバーから使えますか?
使えます。概要ページでは、GitHub Actionsのようなコンテナ環境で、エージェントやゲートウェイを公開インターネットに出さずに動かせると説明されています。CIのジョブをタグ付きでtailnetに参加させるのが基本の形です。tailnetに参加できない端末は、Aperture CLIのブリッジかts-unplugを経由する方法がドキュメントに載っています。MCPサーバーを自作してApertureのコネクタにつなぐ場合の作り方は、MCPサーバーの作り方とAIエージェントへの接続手順が参考になります。
関連記事
- Tailscaleの安全性は大丈夫?暗号化の仕組み・脆弱性リスク・料金・使い方を解説【2026年最新】:Aperture の土台になるTailscale本体の仕組みと料金です。
- Tailscale SSHの設定手順:鍵配布なしで使うポリシー・チェックモード・録画と採用判断:run_commandの到達範囲を決めるSSHルールの書き方です。
- AIゲートウェイとは?役割・LLMゲートウェイとの関係と導入判断を解説【2026年版】:製品を選ぶ前の、AIゲートウェイという分類の整理です。
- Claude apps gateway for AWSとは?Bedrock接続の構成要件と導入判断:AWS中心の組織で比較対象になるゲートウェイです。
- ゼロトラストとは?境界型防御との違い・NIST7原則と導入判断を解説:利用者と端末で認可するApertureの前提となる考え方です。