# ローカルセキュリティ

> LMSP サービスのセキュリティ要件。ループバックへのバインド、ペアリングとベアラートークン、スコープ、悪意ある Web ページに対する Origin と Host の検査、LAN モード、ログの規則を定めます。

Source: https://madeforagent.com/ja/lmsp/1.0/security/
Language: ja
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 10.1 基本方針 {#baseline}

localhost だけで待ち受ければ絶対に安全というわけではない。悪意ある Web ページが、ローカルのポートへの到達を試みる可能性があるためである。そこで LMSP は、複数の対策を組み合わせる。

- サービスは、既定でループバックアドレスにバインドし**なければならない**。LAN モードが有効でない限り（[10.5 節](https://madeforagent.com/ja/lmsp/1.0/security.md#lan)）、`0.0.0.0` やその他のループバック以外のアドレスで待ち受け**てはならない**。
- サービスは、初回の実行時に、エントロピーの高いランダムなサービスシークレットを生成し、組み込みの既定値ではなくそれを使ってトークンを発行・検証する**べきである**。
- コアインターフェースへのすべてのリクエストは、[4.2 節](https://madeforagent.com/ja/lmsp/1.0/endpoints.md#conventions)に挙げたブートストラップ用エンドポイントを除き、有効なベアラートークンを携え**なければならない**。ループバックから来たというだけでは、決して十分ではない。

## 10.2 ペアリングとトークン {#pairing}

クライアントは、ローカルのペアリングコードによって、自分専用のベアラートークンを得る。ユーザーは、サービスが提供する任意の方法でペアリングコードを表示させ、クライアントがそれを送信する。

```http
POST /lmsp/v1/pair
Content-Type: application/json
```

```json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
```

| リクエストフィールド | 意味 |
| --- | --- |
| `client_name` | クライアントの表示名。ユーザーに表示される。 |
| `pairing_code` | ユーザーがサービスから取得したコード。 |
| `scopes` | 要求するスコープの任意のリスト。既定は `["inference"]`。 |

サービスはトークンで応答する。`token_type` は常に `Bearer` である。

```json
{
  "client_id": "cli_01J8MAT3W6X9B2D5F8H1K4N7QZ",
  "access_token": "lmsp_example_3f9a1c52e7d84b60",
  "token_type": "Bearer",
  "scopes": ["inference"]
}
```

その後、クライアントはすべてのリクエストで `Authorization: Bearer <token>` を送る。

- ペアリングコードは、使い捨てで**なければならず**、5 分以内に期限切れとなる**べきである**。少なくとも 40 ビットのエントロピーを持つ**べきである**。サービスは、失敗した試行にレート制限をかけ**なければならない**。誤った、または期限切れのコードには、`401` と `unauthorized` で応答する。
- トークンはクライアントごとに独立しているため、ユーザーは、他のクライアントに影響を与えずに 1 つのクライアントを失効させられる。サービスは、ユーザーがペアリング済みクライアントを一覧し、失効させられるようにする**べきである**。
- クライアントは、トークンを OS のキーチェーンや資格情報マネージャーに保存する**べきである**。サービスは、各トークンのハッシュだけを保存する**べきである**。
- トークンがない、無効、または失効している場合は、`401`、`unauthorized`、`WWW-Authenticate: Bearer` ヘッダーで応答する。有効なトークンであっても、エンドポイントが必要とするスコープを持たない場合は、`403` と `forbidden` で応答する。

## 10.3 スコープ {#scopes}

権限は、別々のスコープに分けられている。モデルのダウンロード、モデルの削除、ツールの実行が、inference スコープに便乗することは決してない。

| スコープ | 許可すること |
| --- | --- |
| `inference` | モデルカタログの読み取り、レスポンスとタスクの作成、クライアント自身のタスクの読み取りとキャンセル。 |
| `models:manage` | モデルのロードとアンロード。 |
| `models:install` | 予約済み。モデルのダウンロードと削除。 |
| `tools:execute` | 予約済み。サービス側でのツールの実行。 |

タスクと保存済みレスポンスは、それを作成したクライアントに属する。サービスは、他のクライアントからのリクエストに対し、それらが存在しないかのように応答する**べきである**（`task_not_found` または `response_not_found`）。

## 10.4 ブラウザーとネットワークの保護 {#browser}

- サービスは、既定でクロスオリジンのブラウザーリクエストを拒否し、明示的に設定された `Origin` の値だけを許可し**なければならない**。それ以外の `Origin` を持つリクエストには、`403` と `forbidden` で応答する。
- オリジンが許可されている場合、サービスはその CORS プリフライトリクエストに応答し、`Access-Control-Allow-Origin` に、`*` ではなく、そのオリジンそのものを入れて送る。
- サービスは、DNS リバインディングを防ぐために、`Host` ヘッダーを検証し**なければならない**。受け付けるのは、サービスが提供するホスト名、すなわちループバックの名前とアドレス、および LAN モード用に設定された名前だけである。それ以外の値には、`403` と `forbidden` で応答する。

## 10.5 LAN モード {#lan}

LAN モードとは、ループバックアドレスの外でも待ち受けることを指す。

- サービスは、ユーザーが明示的にオンにしない限り、LAN モードを有効にし**てはならない**。
- LAN モードでは、サービスは認証を要求し**なければならず**、TLS も有効にする**べきである**。クライアントは、ユーザーが明示的に許可しない限り、ループバック以外のアドレスにプレーンな HTTP でトークンを送る**べきではない**。
- mDNS アドバタイズが許されるのは、LAN モードで、かつユーザーが LAN 発見もオンにしている場合だけである（[3.2 節](https://madeforagent.com/ja/lmsp/1.0/discovery.md#mdns)）。

## 10.6 ログとプライバシー {#logging}

- モデルのパス、ログ、プロンプト、生成内容は、mDNS アドバタイズに含まれ**てはならない**。
- 既定では、サービスはメタデータ（時刻、エンドポイント、ステータスコード、ID、トークン数、所要時間）だけを記録する**べきである**。完全なプロンプトや生成内容は記録する**べきではない**。
- ヘルスレスポンスとエラーの詳細は、モデルのパス、プロンプト、アクセストークン、その他の機微な情報を含ん**ではならない**。
