オープンソース
Yggdrasil上の友人間のシャード化・暗号化ストレージ
Sharded, encrypted storage between friends over Yggdrasil (github.com)
要約
yggstoreは、Yggdrasilオーバーレイネットワーク上で、友人同士がディスクスペースを貸し借りする分散型ストレージの概念実証です。各ファイルは暗号化され、複数の断片(シャード)に分割されて参加者全員のマシンに分散保存されるため、単一のマシンが故障してもデータは失われません。これにより、クラウドサービスを介さずに安全にファイルを共有できます。
全文翻訳
yggstore 概念実証: Yggdrasil オーバーレイ上のピア間でシャード化され、暗号化されたファイルストレージ。VPNコーディネーター不要。ノードIDは公開鍵から生成され、各ノードはグループメンバーのみに応答し、ストレージチャレンジはピアが提供されたものを保持しているかを確認します。
アイデア: グループ内の人々がお互いにディスクスペースを貸し借りします。各ファイルは暗号化され、断片にカットされ、全員のマシンに分散されるため、単一のマシンが故障しても生き残ります。残された小さなスタブ(stub)がキーを保持するため、スタブを誰かに送信する(メールなどであなたのために密封されたもの)ことは、クラウドサービスを介さずにファイルを送信する方法です。
ステータス: 実験的。暗号化は独立したレビューを受けていません。失うことのできないものの唯一のコピーとして使用しないでください。
初心者向け?ストレージボックスの設定方法(Windowsユーザー向け、中古ミニPC使用、ステップバイステップ)。ボックスがない場合?ゲートウェイを使用すると、月額料金を支払って、任意のS3プログラム(rclone、Cyberduck、Duplicati)からグループのストレージを使用できます。
メンバーは、自分のボックスが顧客のデータを保持するかどうかを選択し、クレジットを獲得します。すべてのバージョンが保持されます。履歴により、ファイルの古いバージョンや、特定の日付のフォルダを復元できます。新しいバージョンは変更された部分のみを保存します。
ノードは互いにメッセージを送信できます。ダイレクトメッセージや、任意のノードが公開してフォローできるトピックがあり、オフラインだったノードにも配信されます。プログラムもローカルAPIを通じて使用できます。
Yggdrasilのインストール不要: ノードはデーモン、TUNデバイス、またはrootなしで組み込みで実行できます。デーモン上のノードとも通信します。メッシュはメンバーのYggdrasilを直接リンクし続けるため、1つのトンネルまたは公開ピアを失っても誰も切断されません。
ウェブサイトはグループ上にライブできます。フォルダを公開すると、複数のマシンがそれをサービスするため、いずれかがダウンしてもサイトは稼働し続けます。ドメインへのメールはグループに到着できます。各メッセージは受信時にあなたのために暗号化され、ダッシュボードで読み取られます。
ライセンス: LICENSEを参照してください。貢献: CONTRIBUTING.md。セキュリティ問題: SECURITY.md。
仕組み
putはファイルを4 MiBチャンクに分割し、それぞれをAES-256-GCM(ファイルごとに1つのランダムキー、チャンクごとに新しいnonce)で暗号化し、各チャンクを4つのデータ+2つのパリティシャードに誤り訂正符号化します。シャードはコンテンツアドレス指定(ファイル名 = SHA-256)され、オンラインのピアに分散されます。6つ以上のピアがある場合、チャンクごとに1つのシャードのみをピアに配置します。FILE.ystubというスタブファイルには、キーを含むマニフェストが格納されます。スタブとピアへのアクセス権を持つ人なら誰でもファイルを読み取ることができます。
getはシャードを並列で取得し、ハッシュが一致しないものを拒否し、6つのシャードのうち任意の4つから各チャンクを再構築します。
アップロード時に、まだシャードを持っている間に、アップローダーは各シャードに対して20個の使い捨てチャレンジをFILE.ystub.challenges.jsonに事前計算します(これをプライベートに保ってください)。verifyは各シャードに1つずつ送信します。「このバイト範囲をこのnonceでハッシュせよ」という指示を出し、その応答をチェックします。
IDとアクセス
Yggdrasilアドレス(200::/7)はノードの公開鍵から派生するため、オーバーレイ上の接続のソースアドレスは呼び出し元を識別します。アドレスはノードIDです。各サーバーは、peers.jsonに含まれる呼び出し元(デフォルト拒否)にのみ応答し、オーバーレイアドレスにのみバインドし(または、組み込みYggdrasilを使用する場合、マシンのネットワークには何も配置しません)、元の書き込み者のみがシャードを削除できるようにします。
使用方法
リリースページからシステム用のyggstoreをダウンロードし(LinuxはPC、Raspberry Pi、arm64ボード用、Windows、macOS)、SHA256SUMSと比較してください。または、Go 1.24以降で自分でビルドしてください。
go build -o bin/yggstore ./cmd/yggstore
bin/yggstore id # ノードIDとpeers.jsonエントリを表示します
# 各マシンから1つのエントリを収集してpeers.jsonにコピーし、各マシンにコピーします
bin/yggstore serve -peers peers.json # 各マシンで(デフォルトポート7400)
bin/yggstore status -peers peers.json
bin/yggstore put -peers peers.json photo.jpg # -> photo.jpg.ystub
bin/yggstore verify photo.jpg.ystub
bin/yggstore get -o copy.jpg photo.jpg.ystub
bin/yggstore rm photo.jpg.ystub # そのシャードを削除します
peers.json:
[
{"name": "desktop", "addr": "[200:1234:5678::1]:7400", "admin": true},
{"name": "pi", "addr": "[201:abcd::1]:7400", "slow": true}
]
各チャンクは6つのシャードで構成され、どのノードも2つ以上のシャードを取得しないため、ノードを1つ失ってもデータは失われません。「slow": trueとマークされたノードは、チャンクごとに1つのシャードを取得し、他のノードには残りのスペースがあるため、アップロードを遅らせません。これはアップロードマシンのpeers.jsonのみが決定します。
同じマシンで実行されるノード(例: Dockerコンテナ)は、「host」タグを共有する必要があります。例: {"name": "t1", "addr": "...", "host": "desktop"}。
この場合、2シャード制限はマシンごとに適用され、アップロードには3つのノードではなく3つのマシンがオンラインである必要があります。
グループへの参加
管理ダッシュボードで、「招待」を開き、名前を入力して「招待を作成」を押します。送信するメッセージを取得します。これには、1回限りの招待(yggjoin1:…、7日間有効)が含まれます。
Yggdrasilが実行され、接続されていること(メッセージに公開ピアがリストされています)、およびyggstoreプログラムが必要です。その後、次を実行します。
yggstore join -service yggjoin1:… # -name NODE -me NAME -quota GB を使用してデフォルトを変更できます
joinは管理ノードにこのマシンを追加するように要求し(Yggdrasil経由で招待を提示)、メンバーリストを保存し、招待者を連絡先に追加し、-serviceオプションでユーザーサービスとしてノードとダッシュボードを開始します。
管理側では、新規参加者はpeers.json(所有者: その名前)と連絡先に追加され、リスト同期はすべてのノードに通知します。招待は一度だけ機能します。管理ノードは招待のハッシュのみを保持します。
既にメンバーであるマシン上のノードは、そのマシンに自動的にタグ付けされます。それ以外の場合は、2つのノードがボックスを共有していることがわかっている場合は、手動で「host」でタグ付けします。
joinエンドポイントは、非メンバーが実行できる唯一の呼び出しであり、有効な招待なしでは何も行いません(1分あたり6回の試行に制限されています)。
ノードの追加
「admin": trueのノード(デスクトップ)は、すべてのノードのリストを同期させます。各ノードは、どのリストを保持しているかを報告します。ダッシュボードは、別のリストを保持しているノードに自身のpeers.jsonを送信するため、ダッシュボードで追加されたノード、またはデスクトップのpeers.jsonの手動編集は、1分以内にすべてのノードに到達し、再起動は不要です。
ノードは、データフォルダ(peers.pushed.json)にプッシュされたリストを保持し、そのリストと自身の-peersファイルのうち、最後に変更された方を使用します。管理者のみがプッシュでき、プッシュは送信者が管理者であることを維持する必要があります。
マシンを追加するには: ダッシュボードで「ノードの追加」を開き、手順に従います。
要するに、新しいマシンはデスクトップのエントリのみを含むpeers.jsonで開始され、yggstore serveを実行します。その後、bin/yggstore id -name NAMEが表示するものを貼り付けます。
新しいアップロードはすぐにそれを使用します。既に保存されているファイルはそのまま残ります。
古いソフトウェアで実行されているノードは、ダッシュボードに「yggstoreを更新」と表示され、リストは送信されません。それらに新しいバイナリをインストールして再起動してください。リストが一度も送信されたことのないノードは、自身のpeers.jsonの管理ノードのエントリに「admin": trueが必要であり、それによって管理ノードからのリストを受け入れます。
共有
各ユーザーは自身のノードとダッシュボードを実行します。ダッシュボードはlocalhostのみでリッスンし、ファイルのキーを保持するスタブを保持するため、共有されることはありません。
共有されるのはノードのネットワークです。
アイテムを誰かに送信するには、[共有] → [連絡先]で共有コード(ys1…、ダッシュボードに表示)で追加し、アイテムの[共有]を押します。
送信する.ysendファイルを取得します。メールなどで送信します。その人だけが開くことができます。アイテムの名前、あなたのメモ、およびそのキーは内部に密封されており、開くことでどの共有コードが送信したかが証明されます。
受信者はアウトファイルにドロップすると、「あなたと共有」の下に表示され、復元できます。
このネットワークにノードが必要です。なぜなら、ノードはメンバーにのみシャードを提供するからです。
受信したアイテムは、あなたが失う可能性のあるあなたのものです。送信者がそれを削除すると、共有したすべての人にとって失われます。
受信したアイテムの[削除]は、あなたの側でそれを忘れるだけです。
受信したスタブは、Yggdrasilアドレスまたは自身のpeers.json内のノードのみを指すことができるため、細工されたファイルが復元連絡先を他のマシンにすることはできません。
あなたのプライベート共有キーは~/.yggstore/sharing.key(連絡先は~/.yggstore/contacts.json)です。これを失うと、開くことができなくなります。