关于 Cosmos IRISnet Validator 安全部署的一些思考

编者注:本文由 HashQuark 研究团队与慢雾安全团队共同撰写。
一、部署方案处理的主要问题
这是 HashQuark 关于 Cosmos & IRISnet Validator 安全部署的一些思考,主要针对以下几个问题:
– 对 Validator 节点进⾏ DDoS 攻击
– 对 Validator 节点的入侵攻击
– Validator 节点软硬件宕机
– Validator 节点相关密钥的泄漏

二、总体架构图

关于 Cosmos & IRISnet Validator 安全部署的一些思考

三、针对 DDos 攻击问题处理的方案
Validator 节点搭建在内网中,通过 Sentry 节点进行同步区块和验证交易。通过部署同样的 Validator 节点进行热备,当主 Validator 故障时启动备份 Validator。通过 VPN 专线运行 Sentry, 以防止正常的 Sentry 被攻击和入侵,无法进行正常出块。
搭建节点日志监控平台进行收集、分析、可视化处理。
监控所有节点服务器的 CPU 负载、磁盘 IO 、网络 IO 、进程数等系统健康程度关键指标。
监控所有节点区块信息的:
– 当前区块高度(consensus_height)
– 当前在网络中的投票权重(consensus_validators_power)
– 当前共识的轮数(consensus_rounds)
– 当前 Missing Validator(consensus_missing_validators)
四、 针对节点被入侵的防护措施
1. 保持主机服务单一,只启动节点相关进程,不要一机多用。
2. 防止全网扫描定位私密的 Sentry,修改同步端口 26656 (同理 RPC 端口)至全网最大存活数量的端口 80、443 或 22,这样可以有效抬高攻击者定位成本。
3. 关闭不相关的其他服务端口,只开放对应需要的端口,并在 AWS 或 Google Cloud 上定制严格的安全规则(云服务商控制台和操作系统防火墙都需要设置此项)。
4. 更改 SSH 默认的 22 端口,配置 SSH 只允许用 key (并对 key 加密)登录,禁止密码登录,并限制访问 SSH 端口的 IP 只能为我方运维 IP。
5. 在预算充足的情况下,推荐部署优秀的 HIDS(或者强烈建议参考开源的 OSSEC 相关做法),及时应对服务器被入侵。
五、针对节点软硬件宕机的防范措施
1. 通过异地机房部署进行机房灾备。
2. 对电房电源进行备用冗余。
3. 库存高损耗的关键硬件进行备份冗余。
六、针对相关密钥的泄漏的安全措施
密钥是所有需要保护的元素中最重要的部分,推荐全部用硬件来进行。

关于 Cosmos & IRISnet Validator 安全部署的一些思考

对于 Validator Key 的保护
Validator Key 用于进行共识签名,如果泄漏将面临双重签名的风险,所以保证 Validator Key 的安全至关重要。这里推荐使用 Tendermint 官方开发的 KMS(当前还处于 alpha 阶段),它有以下几方面的优点:
– 对 Validator Key 高效可靠的访问
– 双重签名保护
– 即使 Validator 节点被入侵,基于硬件的签名,也能有效保护密钥的安全
对于 Account Key 的保护
Account Key 是最重要的密钥,用于——
– 共识提案的投票
– 提交新的共识议案
– 关于资金的所有操作
  推荐使用官方推荐的 Ledger Nano S 进行保护
七、一些缺陷
1. Master Validator 宕机切换备用 Validator 依靠人为的判断,可能造成误判能变成运行 Validator 进行双重签名。
2. 使用 Ledger Nano S 无法进行 auto-bonding 和自动治理提案。
3. 如果连接的 Sentry 过少,容易造成 Sentry 被劫持,破坏 Validator 进行正常的共识。
4. 收益地址指定到冷钱包不能进行 auto-bonding,只能进行 delegate 操作。
八、 配置细节
1. Validator
– max_num_inbound_peers =0
– max_num_outbound_peers =配置的 sentry 数量
– persistent_peers 为 Sentry 节点的 IP
– pex =false 关于 PEX 模式
– 关闭 RPC 端口
2. Sentry
– 关闭 RPC 端口
– max_num_inbound_peers =1
– private_peer_ids 设置为 Validator 节点 IP
– 部署私密的 Sentry,保证公开的 Sentry 流量过大拒绝服务时,Validator 仍可以继续同步出块。
3. 非 root 启动 gaiad
建议编译完成后,创建普通用户账号,并使用该账号启动 gaiad,避免使用 root,降低风险。
4. 部署区块监控脚本
发现 Validator 出块停止时及时告警,并自动切换备用服务器。