YaCy improved-search English

信頼と NAT 越えの設計

設計書 docs/trust-and-nat.md の要約。細部はそちらが正。

1. 目的と脅威モデル

脅威本家この設計での扱い
検索結果の捏造(どのクエリにも広告・マルウェアの URL を返す)形式検査のみ。検証に失敗しても remote の結果は残る結果の文書に作者(crawl したピア)の署名を求め、既定では作者がコーディネータの一覧に載っていることを求める
他ピアの名を騙る、seed の改ざんピア ID は乱数。seed に署名なしピア ID = Ed25519 の鍵の hash。seed の中核に本人が署名し、hello のチャレンジで鍵の所有を確かめる
偽ピアの大量生成(Sybil)3 日待てば DHT 検索先になる検索の信頼は一覧(入場管理)で決める。一覧に無いピアの文書は既定で使わない
DHT の保存ピアによる改ざん検出できない保存ピアを信頼しなくてよい。作者の署名で改ざんが分かるので、できるのは返さないことだけ
信頼されたピアが広告を混ぜる、外部エンジンを中継する―禁止しないが、一覧に宣言タグとして書かせ、利用者の方針で使うか決める

守らないもの: 保存ピアが結果を返さないこと、信頼された作者自身の虚偽(タグと監査で扱う)、検索語の秘匿。

2. 身元

2.1 seed の署名

seed は受け取った側が IP・種別・フラグ・最終確認時刻などを書き換えて中継する。そこで本人しか決めない項目だけに署名する。

署名する中核署名しない(観測値・受け手が書き換える)
Hash, PK, Name, Port, PortSSL, BDate, SigT(署名時刻), Tags(自己申告タグ), Reach, P2PA, RDSIP, IP6, PeerType, Flags, 各種カウンタ, LastSeen, news, TV

2.2 hello のチャレンジ

IP は署名の対象外なので、その住所で本当に鍵の持ち主が応答しているかを hello で確かめる。

3. 信頼の委譲と一覧

コーディネータの鍵(利用者が設定。複数可、先頭ほど優先)
  └─ 委任書: 「このオペレータの鍵に、この網の一覧を作らせる」(版付き。失効も新しい版で出す)
       └─ ピアの一覧: 「これらのピアを、この優先度・このタグで信頼する」(オペレータが署名。版付き)
{"payload": "<base64url(JSON のバイト列)>", "signer": "<base64url 公開鍵>", "sig": "<base64url 署名>"}

{"type": "yacy-delegation-v1", "network": "freeworld", "operator": "<pk>", "version": 3, "revoked": false}
{"type": "yacy-peerlist-v1", "network": "freeworld", "version": 12,
 "peers": [{"pk": "<pk>", "priority": 100, "tags": ["ads"]}]}

3.1 宣言タグ

共通の最小語彙を決め、コーディネータは x-<name>: の接頭辞で独自のタグを足せる。

タグ意味
ads結果に広告を混ぜる
proxy:<engine>外部の検索エンジンの結果を中継する
curated人手で選別した索引
unfiltered選別しない
adult成人向けの内容を含む

一覧のタグが正。seed のタグは自己申告で、表示にだけ使う。trust.policy.excludeTags に当たる作者の文書は捨て、結果には作者のタグを付ける。

4. 一覧の配り方

5. 文書の出所(作者の署名)

判定条件既定の扱い
SELF作者が自ピア使う
TRUSTED署名が正しく、作者が信頼集合にいる使う。作者の優先度とタグを付ける
SIGNED署名は正しいが、作者が信頼集合にいない捨てる(開放モードでは「未検証」)
UNSIGNED出所の署名が無い捨てる(開放モードでは「未検証」)
INVALID署名が合わない、鍵と作者が合わない、URL かタイトルが変わっている必ず捨てる

6. NAT 越え

 NAT の内側                               公開側
┌──────────────────────┐          ┌──────────────────┐          ┌──────────────────────┐
│ YaCy ── sidecar ─────┼── 外向き ─▶ relay(sidecar)  ◀─ 外向き ─┼── sidecar ── YaCy    │
│  :8090   :8095 /:4001│  予約    │  :4001           │  回線    │  :8095     :8090     │
└──────────────────────┘          └──────────────────┘          └──────────────────────┘
          ◀──────────────── DCUtR(穴あけ)で直結に切り替え(成功すれば)────────────────▶

7. 設定値

キー既定意味
trust.seed.acceptUnsignedfalse署名の無い(旧実装の)seed を受け入れる
trust.coordinators空信頼するコーディネータの鍵(, 区切り、先頭ほど優先)
trust.bundle.urls空信頼の一覧の束を取りに行く URL
trust.search.acceptUnverifiedfalse開放モード: 信頼集合外・署名なしの文書も「未検証」として検証済みの後ろに出す
trust.policy.excludeTags空このタグを持つ作者の文書を捨てる
trust.selfTags空自分の seed に載せる自己申告のタグ
trust.signedOnlyfalseコーディネータが無いとき、署名されたピアをすべて信頼する(閉じた網向け)
p2p.sidecar.url空sidecar の制御 API(空なら NAT 越えは無効)
p2p.sidecar.yacyPort8096sidecar が運んだ要求を受けるループバックの接続口
p2p.modeautoauto / direct / leecher
p2p.relay.dhtStoragefalseリレー経由でも DHT の保存先になる
remotesearch.maxtime5000他ピアの応答を待つ時間(ms、最大 10000)。結果は届いた順に表示する

鍵・委任書・一覧・束はコマンドラインの TrustTool で作る。FORK.md を参照。

8. 既知の制約