---
title: "Tailscale Apertureとは：AIゲートウェイの仕組みとエージェント権限・監査ログの設定例"
url: "https://www.issoh.co.jp/tech/details/18229/"
published: 2026-10-10
updated: 2026-10-10
categories: ["セキュリティ"]
publisher: "株式会社一創"
---

# Tailscale Apertureとは：AIゲートウェイの仕組みとエージェント権限・監査ログの設定例

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の公式ドキュメント](https://tailscale.com/docs/aperture)は、製品を「組織全体のLLMリクエストを保護・監視・ルーティングする集中型AIゲートウェイ」と定義しています。利用者向けのChat画面と、管理者向けのダッシュボードの2つの画面を持ちます。

### クライアントのIPからログイン名とタグを引くID解決と拒否の条件

[Apertureの動作解説](https://tailscale.com/docs/aperture/how-aperture-works)によると、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つきで残ります。集計は応答を返した後に非同期で行うため、応答は遅れません。

個人情報や顧客データを含むプロンプトを扱う部署では、本文を残すかを先に決めます。[設定リファレンス](https://tailscale.com/docs/aperture/configuration)の`database.retention.duration`に`"0"`を書くとゼロデータ保持になり、本文はディスクに書かれず、利用量の数値だけが残ります。空欄のままだと無期限ではなく、適用されるのは既定の保持期間（通常1年）です。

## Apertureの導入手順とClaude Codeを接続する設定ファイルの書き方

[導入手順のドキュメント](https://tailscale.com/docs/aperture/get-started)では、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の接続ガイド](https://tailscale.com/docs/aperture/how-to/use-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": ["alice@example.com"],
      "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発表のブログ](https://tailscale.com/blog/aperture-ga)で、Tailscale自身を操作するMCPの入口として、TailnetとTailnet SSHの2つのコネクタが加わりました。エージェントが「新しいマシンをtailnetに入れる」「マシンでコマンドを実行する」を行えるようになります。便利な分、渡し方を誤ると影響範囲が最も広い機能です。

### provision\_nodeとrun\_commandが実行できる操作と上限値

[組み込みコネクタのドキュメント](https://tailscale.com/docs/aperture/connectors/built-in-connectors)によると、ツールは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のドキュメント](https://tailscale.com/docs/features/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の設定手順と採用判断](https://www.issoh.co.jp/tech/details/18058/)で詳しく扱っています。

### ワイルドカード\*\*の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エージェント開発の支援内容](https://www.issoh.co.jp/service/ai/agent/)をご覧ください。

## Apertureの採用条件と見送る場面・Cloudflare AI Gatewayとの違い

AIゲートウェイという分類自体の役割と選定軸は、[AIゲートウェイの役割と導入判断](https://www.issoh.co.jp/column/details/13818/)で整理しています。ここではApertureに固有の判断に絞ります。

### Tailscale導入済みでAPIキーが端末に散らばるチームは採用

採用してよいのは、社員の端末とCIが既にtailnetに参加し、Claude CodeやCodexを複数人で使っているチームです。[Apertureの概要ページ](https://tailscale.com/docs/aperture/what-is-aperture)が挙げる課題は、端末に散らばるAPIキーと、誰がどのモデルをどれだけ使ったか見えない状態の2つです。Tailscaleの認証をそのまま使えるため、利用者ごとの予算と記録が追加の認証基盤なしで手に入ります。Tailscale本体の暗号化の仕組みと料金は[Tailscaleの安全性と料金の解説](https://www.issoh.co.jp/tech/details/5403/)で確認できます。

### Tailscale未導入やFedRAMPが要る案件で見送る判断の基準

Tailscaleを使っていない組織が、AIゲートウェイのためだけに全端末へクライアントを配るのは過剰です。この場合は既存のクラウドやIdPに沿った製品を選びます。AWS上でClaudeを使う構成なら[Claude apps gateway for AWSの構成要件](https://www.issoh.co.jp/tech/details/16384/)も比較対象になります。

米国政府系の案件でFedRAMP認証が条件なら、Tailscaleは比較ページで「未取得」と自ら記載しているため見送ります。もう1つの見送り条件は、組み込みコネクタを本番運用の前提にする計画です。2026年9月末時点でalphaなので、本番サーバーの操作を任せる設計には使いません。

### IDの出どころで分かれるCloudflare AI Gatewayとの比較表

Tailscale側の[比較ページ](https://tailscale.com/compare/cloudflare-ai-gateway)は、違いをIDの出どころに置いています。ベンダー自身の比較である点を割り引いて読んでください。

| 観点       | Aperture          | Cloudflare AI Gateway |
| -------- | ----------------- | --------------------- |
| 利用者の識別   | Tailscaleのログイン・タグ | アプリが渡すメタデータ           |
| モデル単位の許可 | grantsで指定         | ルールなし（比較ページの記載）       |
| MCP      | 複数サーバーを1入口に集約     | ゲートウェイ情報を返すMCPサーバー    |
| ゼロ保持     | あり                | あり（任意）                |
| FedRAMP  | 未取得               | 取得済み                  |

既にCloudflareで公開系の通信を集約している組織ならCloudflare側、社内の開発端末とCIをTailscaleで束ねている組織ならApertureが手間の少ない選択です。境界を持たずに利用者と端末で認可する考え方は、[ゼロトラストの解説](https://www.issoh.co.jp/column/details/13096/)と同じ設計思想です。

## 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エージェントへの接続手順](https://www.issoh.co.jp/tech/details/15365/)が参考になります。

## 関連記事

- [Tailscaleの安全性は大丈夫？暗号化の仕組み・脆弱性リスク・料金・使い方を解説【2026年最新】](https://www.issoh.co.jp/tech/details/5403/)：Aperture の土台になるTailscale本体の仕組みと料金です。
- [Tailscale SSHの設定手順：鍵配布なしで使うポリシー・チェックモード・録画と採用判断](https://www.issoh.co.jp/tech/details/18058/)：run\_commandの到達範囲を決めるSSHルールの書き方です。
- [AIゲートウェイとは？役割・LLMゲートウェイとの関係と導入判断を解説【2026年版】](https://www.issoh.co.jp/column/details/13818/)：製品を選ぶ前の、AIゲートウェイという分類の整理です。
- [Claude apps gateway for AWSとは？Bedrock接続の構成要件と導入判断](https://www.issoh.co.jp/tech/details/16384/)：AWS中心の組織で比較対象になるゲートウェイです。
- [ゼロトラストとは？境界型防御との違い・NIST7原則と導入判断を解説](https://www.issoh.co.jp/column/details/13096/)：利用者と端末で認可するApertureの前提となる考え方です。

---

出典: [Tailscale Apertureとは：AIゲートウェイの仕組みとエージェント権限・監査ログの設定例](<https://www.issoh.co.jp/tech/details/18229/>)（株式会社一創）
