【问题标题】:Expose securely your network to make possible anyone can hit your smart contract安全地公开您的网络,让任何人都可以访问您的智能合约
【发布时间】:2019-01-27 04:29:10
【问题描述】:

我正在使用 go-ethereum 实现一个以太坊 PoA 网络

我在网络上部署了一个 ERC20 代币,其想法是必须从互联网上的任何钱包访问网络(即 metamask、myetherwallet 等)

这个网络的想法是:

  • 拥有 N 个能够封存区块的完整节点(节点有未锁定的账户)
  • 部署作为 ERC20 代币的智能合约
  • 拥有一个暴露网络的节点以便从任何来源访问,例如 Metamask、MyEtherWallet、带有钱包的移动应用程序等。这个想法是 任何人如果他们有合适的客户,可以点击 ERC20 Token

为了实现这一点,我创建了 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. 只能从 localhost 访问(注意 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,如个人、管理员等

我的问题是

  • 这种方法安全吗?
  • 是否有另一种方法可以让世界上的任何人使用 Metamask 来访问我的智能合约,而无需在标准节点上打开 RPC 访问?

为什么我有这些问题

因为有很多地方不推荐开放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=external_address 本质上向世界上的任何人开放节点以访问它。 Forthermore, --rpcapi 'admin,personal,db,eth,net,web3,txpool,miner' 允许任何有权做任何事情的人。我能想象 来自互联网的某人正在暴力破解密码。

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

【问题讨论】:

    标签: ethereum go-ethereum metamask


    【解决方案1】:

    这种方法安全吗?

    你明白了,是的,但还有改进的余地。

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

    有没有另一种方法可以让世界上的任何人都可以使用 Metamask 来访问我的智能合约,而无需在标准节点上打开 RPC 访问?

    您是否考虑过研究公共 PoA 网络,例如 poa.net?这基本上允许您的用户将 metamask 或 mycrypto 连接到现有的 POA 基础架构。

    【讨论】:

    • 很好的答案。完全同意第2点。关于启用个人API,是的,因为帐户已经解锁,所以没有公开它的意义。关于仅公开保险箱 API,例如,我公开了管理 api,因为我想附加到 geth javascript 控制台并执行例如 admin.addPeer(),我的意思是,我需要对节点进行一些控制。我将看看 PoA 公共网络。再次感谢
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2022-11-09
    • 2022-08-18
    • 1970-01-01
    • 2015-09-12
    • 2019-06-05
    • 2019-04-07
    • 2022-11-12
    相关资源
    最近更新 更多