Secure Distributed Brain Simulation Guide
[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。
Overview
EvoSpikeNetは、分散脳シミュレーションにおける通信のセキュリティを確保するために、以下のセキュリティ機能を実装しています:
- 事前共有キー(PSK): 事前に共有された秘密鍵を使用した暗号化
- Diffie-Hellman鍵交換: 動的な鍵生成による前方秘匿性
- AES-256-GCM暗号化: 認証付き暗号化による盗聴・改ざん防止
セキュリティモード
1. 事前共有キー(PSK)モード
最も簡単で推奨される方式。全ノードが同じ事前共有キーを使用します。
PSKの生成
# 256ビット(64文字のhex)のランダムキーを生成
python3 -c "import os; print(os.urandom(32).hex())"
使用方法
<!-- from evospikenet.zenoh_comm import ZenohCommunicator, ZenohConfig -->
# PSKを設定
psk = "your-64-char-hex-key-here"
config = ZenohConfig(psk=psk)
comm = ZenohCommunicator("node-1", config)
# 全ての通信が自動的に暗号化されます
comm.publish("topic", {"data": "secret"}, serialize="json")
環境変数での設定
export EVOSPIKENET_PSK="your-64-char-hex-key-here"
import os
config = ZenohConfig(psk=os.getenv("EVOSPIKENET_PSK"))
2. Diffie-Hellman鍵交換モード
ノード間で動的に鍵を交換します。前方秘匿性があり、最も安全です。
使用方法
ノード1:
comm = ZenohCommunicator("node-1", ZenohConfig())
# 鍵交換を開始
public_key = comm.initiate_key_exchange("node-2")
print(f"Public key: {public_key.hex()}")
# ノード2の公開鍵を受信後
peer_public_key = bytes.fromhex("...")
comm.complete_key_exchange(peer_public_key)
ノード2:
comm = ZenohCommunicator("node-2", ZenohConfig())
# 鍵交換を開始
public_key = comm.initiate_key_exchange("node-1")
print(f"Public key: {public_key.hex()}")
# ノード1の公開鍵を受信後
peer_public_key = bytes.fromhex("...")
comm.complete_key_exchange(peer_public_key)
デモスクリプト
PSKモードのデモ
# PSKを生成
PSK=$(python3 -c "import os; print(os.urandom(32).hex())")
echo "PSK: $PSK"
# ノード1を起動(ターミナル1)
python3 examples/secure_distributed_brain_demo.py \
--node-id node-1 \
--peer-id node-2 \
--psk "$PSK" \
--mode psk
# ノード2を起動(ターミナル2)
python3 examples/secure_distributed_brain_demo.py \
--node-id node-2 \
--peer-id node-1 \
--psk "$PSK" \
--mode psk
DH鍵交換モードのデモ
# ノード1を起動(ターミナル1)
python3 examples/secure_distributed_brain_demo.py \
--node-id node-1 \
--peer-id node-2 \
--mode dh
# 表示された公開鍵をコピー
# ノード2を起動(ターミナル2)
python3 examples/secure_distributed_brain_demo.py \
--node-id node-2 \
--peer-id node-1 \
--mode dh
# お互いの公開鍵を交換して入力
Docker環境での使用
docker-compose.yml設定例
services:
brain-node-1:
image: evospikenet:latest
environment:
- EVOSPIKENET_PSK=${EVOSPIKENET_PSK}
- NODE_ID=pfc-0
networks:
- brain-network
brain-node-2:
image: evospikenet:latest
environment:
- EVOSPIKENET_PSK=${EVOSPIKENET_PSK}
- NODE_ID=motor-0
networks:
- brain-network
networks:
brain-network:
driver: bridge
.envファイル
# 全ノードで共有するPSKを設定
EVOSPIKENET_PSK=your-generated-psk-here
セキュリティのベストプラクティス
1. PSK管理
- ✅ 推奨: 環境変数またはシークレット管理システム(AWS Secrets Manager、HashiCorp Vault等)を使用
- ❌ 非推奨: ソースコードにハードコード
- ✅ 推奨: 定期的にPSKをローテーション
- ✅ 推奨: 本番環境と開発環境で異なるPSKを使用
2. 鍵交換
- ✅ 推奨: DH鍵交換を使用して前方秘匿性を確保
- ✅ 推奨: 初回接続時に公開鍵を安全なチャネル(HTTPS、SSH等)で交換
- ⚠️ 注意: 中間者攻撃を防ぐため、公開鍵のフィンガープリントを検証
3. ネットワーク
- ✅ 推奨: 信頼できるネットワーク内でのみ通信
- ✅ 推奨: ファイアウォールで不要なポートを閉じる
- ✅ 推奨: VPNまたはプライベートネットワークを使用
4. ログとモニタリング
- ✅ 推奨: 暗号化エラーをログに記録
- ❌ 非推奨: キー情報をログに出力しない
- ✅ 推奨: 不審な復号化失敗を監視
トラブルシューティング
復号化エラー
WARNING - Decryption failed for topic: ...
原因: - PSKが一致していない - セッションキーが確立されていない - データが破損している
解決策: 1. 全ノードで同じPSKを使用しているか確認 2. DH鍵交換が完了しているか確認 3. ネットワーク接続を確認
鍵交換失敗
ERROR - Key exchange failed: ...
原因: - 公開鍵のフォーマットが不正 - ネットワークエラー
解決策: 1. 公開鍵を正しくコピーしているか確認(改行・スペースなし) 2. ネットワーク接続を確認
パフォーマンスへの影響
- 暗号化オーバーヘッド: 約5-10%のCPU使用率増加
- レイテンシ: 約1-2ms増加
- スループット: 大きな影響なし(圧縮と併用可能)
セキュリティ監査
定期的に以下を確認してください:
- ✅ PSKが安全に保管されているか
- ✅ 不要な暗号化が無効化されていないか
- ✅ ログに機密情報が含まれていないか
- ✅ 暗号化ライブラリが最新版か(
cryptographyパッケージ)