3

Lotus私钥安全管理和数据为先的 FIP 探讨

 1 year ago
source link: https://mp.weixin.qq.com/s?__biz=Mzg3MDY1MDM1NQ%3D%3D&mid=2247483753&idx=1&sn=8bef592d638248ada21d48d04247b3eb&chksm=ce8bd9f5f9fc50e378c0543fc0058ffa43d862f38b6e98ab889976cd1f240380f3f83e79581a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Lotus私钥安全管理和数据为先的 FIP 探讨

Original Lion 原语云 2022-01-14 10:06 Posted on

    钱包是区块链的基石,他的本质是一个数学模型支撑的公私钥对,所以技术上我们通常也称为私钥,一般是用公钥加密数据,然后私钥去解密,只要能解密数据就意味着你拥有数据的所属权,这个签名和解密的过程也不是100%的安全,只是现代的计算机架构要算出碰撞需要很长的时间,依据算法复杂度从几年到几百年都有可能,但是这个问题一直都存在。这里我们分享下原语云建议的  Lotus 集群私钥的管理方式。

一,Lotus 私钥的认识和分类

     Lotus 的网络是一个复杂的系统,本身一个私钥可以满足全部的需求,但是为了安全一般会对私钥做如下的三个分类:

    Owner私钥:这个看名称也知道 - 所属者,这个私钥控制着整个存储集群,通常和网络共识交接的操作基本都会需要 owner 私钥来签名操作消息,例如:提现,终止扇区,更换所属者/质押/时空证明私钥等都需要owner私钥的签名,之所以把这个私钥单独拆分也是因为他的重要性,如果被盗取了,意味着整个存储集群都不是你的,包括全部的质押和后续的出块奖励,甚至数据都可以被重新生成,所以这个私钥一般都是离线管理的,用完就拔掉。    Worker 私钥:worker 私钥主要是用于质押过程中的扣款签名,按照质押上链的消息类型本身又可以分为前置私钥和后质私钥,通常一个就够了。出块过程中的 WinCount 计算也是通过 worker 地址来和有效的存储空间来做绑定的。

    Post 私钥:这个私钥单独用作时空证明的提交,也是为了更流畅的时空证明结果的提交,如果和 worker 私钥混用可能会导致时空证明结果提交延迟而过期的情况,经历过 Space Race 的工程师会更感同身受为什么会需要这么一个单独的私钥。

    如果一个存储集群的 owner 私钥丢了,这个丢了可能情形如下:
    1、是真的丢了:备份的私钥找不到了,因为存储私钥的硬件设备出现了损坏,或者真是不知道丢到哪儿了。

    2、私钥还能找到:但是被人盗取了,这个人利用盗取的私钥重新初始化了你的 Miner ,然后再更换了 owner 私钥为一个新的私钥。

    无论是上述那种情况,意味着这个存储集群已经不是你的了,因为无法提现,全部的出块奖励以及所有的质押也都拿不回来了。最痛苦的是第二种,出块奖励和质押都属于别人的了,如果对方再弄一些机器用一定的时间可以把全部的 CC 扇区数据都生成一遍,这样集群就完全属于他了,质押币在完美为他人服务。这种情况目前没有任何应对措施,这也是我认为目前 lotus 网络不合理的地方

二、Lotus 私钥的安全管理

    要如何保护这些私钥,避免不必要的麻烦呢?

    对于 worker 私钥:可以定期转入 FIL,按照增速转入1-3天的量,这样即使被盗取也损失有限。

    对于 post 私钥:从 post 给定单独的地址提交后,时空证明的 Gas 费已经可以忽略不计了,也就是如果 1 个 FIL 可以供很长一段时间的时空证明提交。

    对于 owner 私钥:介于他的重要性,这里作为重点讲述一下:

owner 私钥备份:

    1、在生成的 Lotus 服务器上运行如下命令来导出:

lotus wallet export <address>

address 就是 owner 私钥的地址,这条命令会把私钥打印到终端,通过鼠标选取复制即可,例如我的测试环境运行如下:

➜  lotus git:(yy_wdpost_worker) ✗ ./lotus wallet export t3ujlef6usceo6dblgpg5h6odkn3p354fn2y4eplpwgx5pplufdowohyaqjaohbiwrnhih3z5e7mar74fjxfoq7b2254797065223a22626c73222c22507269766174654b6579223a22456a52505036656e3745783653752f4f6e6a7873674b3457666f495675466f573243794b6b624151546a593d227d

下面那一串数字就是私钥,也是整个 miner 的核心。

    2、确认复制的内容是正确的
    新建一个文件,例如,owner.wallet 把私钥复制存储到 owner.wallet 文件,然后保存关闭文件。再次打开 owner.wallet 文件复制私钥内容运行如下命令来导入私钥:

lotus wallet import

    终端会提示输入私钥,把复制的私钥粘帖回车确认,如果提示 "key already exists" 就说明你复制的私钥内容是正确的,例如我的测试环境运行如下:

➜  lotus git:(yy_wdpost_worker) ✗ ./lotus wallet import                                                                                    Enter private key: 7b2254797065223a22626c73222c22507269766174654b6579223a22456a52505036656e3745783653752f4f6e6a7873674b3457666f495675466f573243794b6b624151546a593d227dERROR: saving to keystore: checking key before put 'wallet-t3ujlef6usceo6dblgpg5h6odkn3p354fn2y4eplpwgx5pplufdowohyaqjaohbiwrnhih3z5e7mar74fjxfoq': key already exists➜  lotus git:(yy_wdpost_worker) ✗

    提示上述错误,表示这个私钥已经存在了,也就是你复制的私钥是正确的,其他错误就说明你复制的导出的私钥是有问题的,就重复上述操作直到成功。


    确认导出成功后,把 owner.wallet 文件备份到多个硬件设备上,例如:硬盘/U盘/移动硬盘等都可以,而且建议备份至少三个硬件设备,例如 3 个U盘,也建议同时用打印机把 owner.wallet 里面的私钥打印到多张纸上面丢到保险柜里面进行保管,我这边建议两种备份方式都准备。这里切忌,一定不要通过邮件、聊天、在线文档等任何互联网第三方平台工具传输私钥内容

owner 私钥线上删除:

    通过上一步确认了私钥已经成功导出后,就可以把线上的 owner 私钥给删除了,因为环境就绪了后,后期质押/出块/时空证明这些都不需要 owner 私钥。这里删除是为了防止你的 lotus 服务器或者 miner 服务器被攻击了,可能是网络攻击也可能是物理攻击导致私钥被盗取了,就会出现上面描述的悲剧。这里一定要记得通过 delete 命令和 文件删除的方式彻底删除私钥,具体步骤如下:

# 1,先删除钱包lotus wallet delete <address># 2, 删除OR开头的文件cd lotus的keystore文件夹rm OR*

    注意:lotus 的 wallet delete 命令不会删除本地的私钥文件,执行了这个命令,并没有完全删除这个私钥,还需要到 lotus 的数据目录的 keystore 文件夹下把以 OR 开头的私钥文件给彻底删除。具体操作可以查看原语云的操作文档:https://docs.yycloud.pro/manual/lotus-basic-opt.html#_14-%E9%92%B1%E5%8C%85%E7%A7%81%E9%92%A5%E7%9A%84%E5%A4%87%E4%BB%BD%E5%92%8C%E5%88%A0%E9%99%A4

    备注:即使完成了上述两个步骤,如果把存储了 lotus 数据的磁盘拔走,也是有可能可以找回那个被删除的私钥文件的,随着磁盘写入数据的增多,这个概率逐步变成不可能,本质是要把存储了私钥的文件的磁盘块给覆盖掉,因为区块数据一直在同步,这种概率很小,这里主要是建议机房机柜最好都上锁

    这里记住一定不要在线上带着 owner 私钥运行,确认备份好后,要彻底删除,这个危险系数很高。

owner 私钥的生成

    我建议可以在一个安全的环境运行一个 Lotus 区块同步节点,例如办公室/家里的 ADSL 拨号环境放一台 lotus 机器,用柜子锁起来,owner 私钥通过这个节点来创建,然后 miner 也通过这个 Lotus 节点去创建和初始化,之后把初始化后的 miner 数据拷贝到机房的 miner 机器去继续后续的工作,也就是正式的环境并不需要 owner 私钥,提现等这些操作可以在本地的隔离环境下的 miner 完成 (注意这个 miner 不做任何的出块或者时空证明计算),这固然是最安全的方式。

    如果 owner 私钥没法在隔离的办公室/居家环境中生成或者使用,owner 私钥确认备份好了后,后期的使用就要坚守插拔模式,需要的时候导入,用完了一定要立即从线上彻底删掉



三,数据为首的网络提案和问题分析    owner 私钥的重要性上面已经提到了,也提过如果被盗了,后果让人很绝望,目前 lotus 网络 owner 私钥处于 miner 的绝对统治地位,被盗取了,不仅出块奖励没了,原始的质押也无法拿回了,再去链上弄回来 PC1 计算的 ticket 数据,弄点机器还可以把这个 miner 全部的 CC 扇区计算回来,可以说已经完全没原来 miner 什么事了,这种事情貌似圈子里面也发生过几起,除了上面说的防护措施以外,接下来描述下原语云提案的 ”通过随机时空证明挑战修改 owner 私钥”。

    提案原文:https://github.com/lionsoul2014/FIPs/blob/master/FIPS/fip-draft_ocpc.md

    提案讨论:https://github.com/filecoin-project/FIPs/discussions/269

    原语云主张网络以数据为首 - 也就是只要 miner 还能提供正确的存储服务,就应该要能拿回属于他的奖励和质押,这里提到了一个以随机时空证明挑战的方式的来修改 owner 私钥的方案,大体思路如下:

    1、注册一个新的私钥,并且激活。

    2、用这个新的私钥发起一个随机时空证明挑战申请。

    3、网络返回挑战参数并且要求 Miner 在指定的区块高度前完成指定扇区的时空证明计算和提交(这个必须要求是有数据的人才能完成)。
    4、等待验证结果,并且要求在指定的高度内完成后续的 owner 私钥更换。
    5、随机挑战验证通过,通过类似如下的命令发起 owner 私钥的修改提案,修改 owner 私钥为指定的新私钥:

lotus-miner actor change-owner-key-proposal --proposal-key=PoSt_wallet --owner-key=new owner key

    6、利用新 owner 私钥再度签名确认提案,完成 owner 私钥的修改:

lotus-miner actor confirm-owner-key-proposal --proposal-key=new owner key --owner-key=new owner key

    上述逻辑的安全考虑和解决方案如下:

    1、数据拥有的真假问题:因为目前 lotus 的 CC 扇区可以通过PC1/PC2计算重新生成,也就是任何人可以生成任何 miner 的任何 CC 扇区,这个可以通过给 ticket 混入随机数 (有待验证) 或者通过在  CC 扇区里面混入一些不对外公开的随机 piece 来确保数据没法通过公开的区块数据来生成,当然,对于那些经常修复扇区数据的 miner 来说会增加一个本地元数据备份的烦恼,备份下也没啥麻烦的,另外扇区数据也没那么容易坏掉。

    2、随机挑战的可靠性问题,这个是一个概率问题,本身zk-snark就是一个概率准确性问题,只要挑战的扇区足够随机,数量站比足够大,完全是可靠的,例如直接挑战 miner 超过 50%的扇区。

    以上是原语云针对此 FIP 的一些分析和解决方案,此方案有可能存在考虑不周的地方,但是我们始终认为 一个分布式存储项目应该是以数据为主导,不同 miner 的数据不应该可以通过公开的链上数据直接计算出来,只要数据还能提供正确的服务,就应该得到该有奖励并且能够拿回为这些数据所做的质押,我们在此抛砖引玉,对此提案感兴趣的小伙伴欢迎参与探讨,争取得到一个更加完善的解决方案。

    另外,Lotus 目前已经是一个社区性很强的项目了,当前提案可能会让 Lotus 网络的共识发生重大改变,问题固然会有很多但是我们认为会一定程度上促进 lotus 生态的发展,如果方向在此,问题总会有解决办法的。

专注智能运维的 SaaS 云服务平台。提供海量服务器的可视化智能运维、Lotus智能运维云解决方案!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK