PeerLink 的安全设计和最佳实践。
PeerLink 采用零信任安全模型:
graph TB
subgraph "零信任架构"
ID[身份认证<br/>DID + Ed25519]
ENC[端到端加密<br/>TLS 1.3]
AUTH[消息签名<br/>Signed Envelope]
ACL[访问控制<br/>允许列表]
end
ID --> ENC
ENC --> AUTH
AUTH --> ACL
每个 PeerLink 节点都有唯一的 DID 标识:
did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7
DID 结构:
did:peer:1z<base58-encoded-multibase-multicodec-did-doc-key>
{
"@context": "https://w3id.org/did/v1",
"id": "did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7",
"verificationMethod": [{
"id": "did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7#keys-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7",
"publicKeyMultibase": "z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
}],
"authentication": [
"did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7#keys-1"
],
"assertionMethod": [
"did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7#keys-1"
]
}密钥生成:
auto key_pair = peerlink::crypto::generate_ed25519_key_pair();
auto private_key = key_pair.private_key();
auto public_key = key_pair.public_key();密钥存储:
~/.peerlink/
├── identity.json # DID 文档(包含公钥)
├── private_key.pem # 私钥(加密存储)
└── config.yaml # 配置文件私钥加密:
security:
identity:
key_file: ~/.peerlink/private_key.pem
encryption:
algorithm: AES-256-GCM
key_derivation: PBKDF2-SHA256
iterations: 100000所有传输层连接都使用 TLS 1.3 加密。
密码套件:
std::vector<std::string> cipher_suites = {
"TLS_AES_128_GCM_SHA256",
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256"
};证书验证:
auto tls_config = peerlink::TlsConfig::create()
.set_verify_mode(peerlink::VerifyMode::Strict)
.set_ca_file("/etc/ssl/certs/ca-certificates.crt")
.set_certificate_file("/path/to/cert.pem")
.set_private_key_file("/path/to/key.pem");即使在 Relay 模式下,数据也是端到端加密的:
sequenceDiagram
participant A as Client A
participant R as Relay
participant B as Client B
Note over A: Encrypt with B's public key
A->>R: Encrypted data
Note over R: Cannot decrypt
R->>B: Encrypted data
Note over B: Decrypt with B's private key
Signed Envelope 格式:
{
"version": "1.0",
"payload": "base64encodedencryptedpayload",
"sender": "did:peer:...",
"recipient": "did:peer:...",
"timestamp": 1234567890,
"nonce": "randomnonce",
"encryption": {
"algorithm": "AES-256-GCM",
"key_id": "did:peer:...#keys-1"
},
"signature": "ed25519signature"
}sequenceDiagram
participant C as Client
participant S as Server
C->>S: CONNECT (did)
S->>C: CHALLENGE (nonce)
C->>S: RESPONSE (signature)
S->>C: AUTHORIZED (session_token)
允许列表:
security:
acl:
mode: allowlist # allowlist 或 denylist
allowed_peers:
- did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7
- did:peer:1zAbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcdef使用 API:
auto acl = client.get_acl();
acl.add_allowed_peer("did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7");
client.set_acl(acl);-
私钥存储:
- 始终加密存储私钥
- 使用强密码保护
- 定期轮换密钥
-
密钥备份:
# 导出密钥(加密) peerlink key export --output backup.pem --encrypt # 恢复密钥 peerlink key import --input backup.pem
-
硬件安全模块(HSM):
security: identity: key_store: type: hsm # 或 pkcs11, tpm module: /usr/lib/softhsm/libsofthsm2.so slot: 0 pin: env:HSM_PIN
-
使用 Let's Encrypt:
sudo certbot certonly --standalone -d peerlink.example.com
-
证书固定:
security: tls: pin_certificates: - "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
-
证书轮换:
# 自动续期 peerlink cert renew --auto
-
防火墙规则:
# 仅允许必要的端口 sudo ufw allow 443/tcp comment 'PeerLink Relay' sudo ufw allow 8443/tcp comment 'PeerLink Signaling' sudo ufw allow 3478/udp comment 'PeerLink STUN'
-
速率限制:
server: rate_limit: enabled: true max_connections: 100 max_requests_per_second: 10
-
DDoS 防护:
server: ddos_protection: enabled: true blacklist: - "192.0.2.0/24" whitelist: - "203.0.113.0/24"
logging:
security:
enabled: true
events:
- authentication
- authorization
- connection
- data_transfer
- key_rotation
format: json
output:
type: syslog # 或 file, elasticsearch
server: localhost:514{
"timestamp": "2024-01-15T10:30:00Z",
"event_type": "connection_established",
"peer_id": "did:peer:1zQmWvQxTqbGvZGh7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7Yh4z7",
"remote_peer_id": "did:peer:1zAbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcdef",
"session_id": "sess_abc123",
"connection_type": "UDP_DIRECT",
"success": true
}monitoring:
alerts:
- name: "High failure rate"
condition: "auth_failures > 10 in 1m"
action: notify
- name: "Unauthorized connection"
condition: "unauthorized_connections > 0"
action: block_and_notify- 数据加密: 所有传输数据都经过 TLS 1.3 加密
- 数据最小化: 只收集必要的日志信息
- 数据保留: 可配置日志保留期限
- 匿名 DID: DID 不包含个人身份信息
- 无追踪: 不记录设备位置或使用模式
- 本地优先: 数据优先存储在本地
部署前请确认:
- 使用强密码保护私钥
- 启用 TLS 1.3 并使用有效证书
- 配置防火墙规则
- 启用访问控制(允许列表)
- 配置安全日志
- 设置监控告警
- 定期更新到最新版本
- 进行安全审计