安全地公开您的网络,以使任何人都可以达成您的智能合约

时间:2018-08-21 02:58:27

标签: ethereum go-ethereum metamask

我使用go-ethereum实现以太坊PoA网络

我已经在网络上部署了ERC20令牌,其想法是必须从Internet上的任何钱包(例如元掩码,myetherwallet等)访问该网络

该网络的想法是:

  • 具有N个完整的能够密封块的节点(这些节点具有未锁定的帐户)
  • 部署作为ERC20令牌的智能合约
  • 具有一个暴露网络的节点,以便可以从任何来源访问,例如Metamask,MyEtherWallet,带有钱包的移动应用等。这个想法是任何人如果他们有合适的客户,则可以点击ERC20令牌

为了达到这个目的,我创建了2个完整的节点,负责密封这些块。

我这样运行那些节点:

geth --datadir sealer1/  --syncmode 'full' --port 30351 --rpc --rpcaddr 'localhost' --rpcport 8502 --rpcapi='admin,personal,db,eth,net,web3,txpool,miner' --networkid 20 --gasprice '1' -unlock 'someaccount' --password s2/password.txt --mine

如您所见,这些节点有一些重要的事情:

  1. 解锁帐户
  2. 只能从本地主机访问(请注意rpcaddres)
  3. 这些节点是矿工

如果我向互联网公开这样的节点(允许从任何来源进行RPC访问),那么任何黑客都可以将以太币发送到另一个帐户,因此,我创建了第三个节点,即标准节点,它不公开rpc api,但允许端口8545上的连接(以便从metamask,myetherwallet等中命中)

我使用以下命令运行节点:

geth --datadir standard1/ --syncmode 'full' --port 30352 --rpc --rpcport 8545--rpccorsdomain '*' --rpcaddr 'SERVER_PUBLIC_IP' --networkid 20 --gasprice '1'  

您可以看到此节点:

  1. 不解锁帐户
  2. 允许从任何来源访问rpc
  3. 不公开rpc api,例如个人,管理员等

我的问题是

  • 此方法安全吗?
  • 是否有另一种方法可以允许世界上的任何人在不打开标准节点上的RPC访问权限的情况下使用Metamask击中我的智能合约?

我为什么有这些问题

由于许多地方不建议打开RPC端口,因此在以下情况下不安全:

  • 没有节点暴露于未锁定的帐户
  • 不要公开关键的rpc api,例如管理员和个人

足以安全地暴露我的节点。

以下是与打开RPC访问相关的一些问题:

https://blog.blockdaemon.com/ethereum-geth-configuration-made-in-ireland-7ba2e876c6e3 https://www.reddit.com/r/ethereum/comments/4z0mvi/ethereum_nodes_with_insecure_rpc_settings_are/

https://www.reddit.com/r/ethereum/comments/3ird55/holy_shit_my_eth_accounts_been_hacked/

https://www.reddit.com/r/ethereum/comments/4jav5u/mist_wallet_has_2_sec_vulnerability_for_rpc/

https://blog.3or.de/internet-wide-ethereum-json-rpc-scans.html

https://www.bokconsulting.com.au/blog/7218-ethers-stolen-from-miner-with-rpc-port-open/

https://blog.ethereum.org/2015/08/29/security-alert-insecurely-configured-geth-can-make-funds-remotely-accessible/

以下是以太坊推荐的团队负责人:

  

好的,您的设置似乎非常危险。 --rpcaddr =外部地址   本质上向世界上任何人开放该节点。   此外,--rpcapi'admin,personal,db,eth,net,web3,txpool,miner'   允许任何人有权做任何事情。我能想象   来自互联网的某人会强行强制使用密码。

https://github.com/ethereum/go-ethereum/issues/17417#issuecomment-413877558

1 个答案:

答案 0 :(得分:1)

  

这种方法安全吗?

您有大致的想法,是的,但是仍有改进的空间。

  1. 首先,我永远不会运行一个使用personal同时启用-unlock API的节点,该节点将永久使该帐户能够被任何有权访问您节点的人访问。想象一下,某人已经通过其他门访问了您的节点,他们将能够立即从该帐户花费您的资金,以从本地主机生成交易。请考虑只在该节点上公开 safe API还是完全删除 unlock 语句。
  2. 如果坚持如上所述配置密封节点,请添加一些加固。有多种选择,您可以使用强大的防火墙规则集来阻止来自外部网络的所有内容,但端口30351上的节点通信除外。或者,我要做的是隐藏此节点与公共Internet的完全断开连接,而只能通过从该节点到另一个 proxy 节点的p2p流量,该节点同时连接到您的节点和Internet上的其他节点。不过,这可能会带来网络稳定性方面的缺陷。
  

还有没有其他方法可以允许世界上任何人使用Metamask来打我的智能合约,而无需在标准节点上打开RPC访问权限?

您是否考虑过研究诸如poa.net之类的公共PoA网络?基本上,这使您的用户可以将metamask或mycrypto连接到POA的现有基础结构。