コンテンツにスキップ

Secure Distributed Brain Simulation Guide

[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。

Overview

EvoSpikeNetは、分散脳シミュレーションにおける通信のセキュリティを確保するために、以下のセキュリティ機能を実装しています:

  1. 事前共有キー(PSK): 事前に共有された秘密鍵を使用した暗号化
  2. Diffie-Hellman鍵交換: 動的な鍵生成による前方秘匿性
  3. 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増加
  • スループット: 大きな影響なし(圧縮と併用可能)

セキュリティ監査

定期的に以下を確認してください:

  1. ✅ PSKが安全に保管されているか
  2. ✅ 不要な暗号化が無効化されていないか
  3. ✅ ログに機密情報が含まれていないか
  4. ✅ 暗号化ライブラリが最新版か(cryptographyパッケージ)

参考資料