Securing your ETH staking validator node

本文档提供了保护 ETH staking 验证器节点安全性的快速步骤和最佳实践,包括创建具有 sudo 权限的非 root 用户、禁用 SSH 密码身份验证和使用 SSH 密钥、更新系统、禁用 root 帐户、设置 SSH 的双因素身份验证、保护共享内存、安装 Fail2ban、配置防火墙以及使用系统用户帐户等。


description: 保护你的节点的快速步骤。

保护你的 ETH 质押验证者节点的安全最佳实践

{% hint style="info" %} 2022-6 Gitcoin Grant Round 14: 在你的支持下,我们改进了本指南!

帮助资助我们并获得 POAP NFT。感谢你的支持! 🙏 {% endhint %}

:robot: 准备工作

  • 安装 Ubuntu Server 或 Ubuntu Desktop
  • 安装 SSH 服务器
  • SSH 客户端或终端窗口访问

如果你需要安装 SSH 服务器,请参考:

{% embed url="https://www.simplified.guide/ubuntu/install-ssh-server" %}

如果你需要适合你操作系统的 SSH 客户端,请参考:

{% embed url="https://www.howtogeek.com/311287/how-to-connect-to-an-ssh-server-from-windows-macos-or-linux/" %}

:man_mage:创建一个具有 sudo 权限的非 root 用户

{% hint style="info" %} 养成使用非 root 账户登录服务器的习惯。这将防止你在犯错时意外删除文件。例如,如果 root 用户错误地使用 rm 命令,可能会清除你的整个服务器。 {% endhint %}

{% hint style="danger" %} :fire:提示: 不要经常使用 root 账户。始终使用 susudo。 {% endhint %}

使用 SSH 客户端 SSH 登录到你的服务器

ssh username@server.public.ip.address
## 例子
## ssh myUsername@77.22.161.10

创建一个名为 ethereum 的新用户

sudo useradd -m -s /bin/bash ethereum

设置 ethereum 用户的密码

sudo passwd ethereum

将 ethereum 添加到 sudo 组

sudo usermod -aG sudo ethereum

:closed_lock_with_key: 禁用 SSH 密码认证,仅使用 SSH 密钥

{% hint style="info" %} 强化 SSH 的基本规则是:

  • 禁止使用密码进行 SSH 访问(使用私钥)
  • 不允许 root 用户通过 SSH 登录(应由适当的用户通过 SSH 登录,然后使用 susudo
  • 对用户使用 sudo,以便记录命令
  • 记录未经授权的登录尝试(并考虑使用软件来阻止/禁止尝试多次访问你服务器的用户,例如 fail2ban)
  • 将 SSH 限制为你需要的 IP 范围(如果你愿意) {% endhint %}

在本地计算机上创建一个新的 SSH 密钥对。在本地计算机上运行此命令。系统会要求你键入一个文件名来保存密钥。这将是你的 keyname

你可以选择 ED25519 或 RSA 公钥算法。

{% tabs %} {% tab title="ED25519" %}

ssh-keygen -t ed25519

{% endtab %}

{% tab title="RSA" %}

ssh-keygen -t rsa -b 4096

{% endtab %} {% endtabs %}

将公钥传输到你的远程节点。适当更新 keyname.pub

ssh-copy-id -i $HOME/.ssh/keyname.pub ethereum@server.public.ip.address

使用新的 ethereum 用户登录

ssh ethereum@server.public.ip.address

禁用 root 登录和基于密码的登录。编辑 /etc/ssh/sshd_config 文件

sudo nano /etc/ssh/sshd_config

找到 ChallengeResponseAuthentication 并更新为 no

ChallengeResponseAuthentication no

找到 PasswordAuthentication 并更新为 no

PasswordAuthentication no

找到 PermitRootLogin 并更新为 prohibit-password

PermitRootLogin prohibit-password

找到 PermitEmptyPasswords 并更新为 no

PermitEmptyPasswords no

可选: 找到 Port 并将其自定义为你的 随机 端口。

{% hint style="info" %} 使用 1024 到 49141 之间的随机端口号。 检查可能存在的冲突。 {% endhint %}

Port <端口号>

验证新的 SSH 配置的语法。

sudo sshd -t

如果语法验证没有错误,请重启 SSH 进程

sudo systemctl restart sshd

验证登录是否仍然有效

{% tabs %} {% tab title="标准 SSH 端口 22" %}

ssh ethereum@server.public.ip.address

{% endtab %}

{% tab title="自定义 SSH 端口" %}

ssh ethereum@server.public.ip.address -p <自定义端口号>

{% endtab %} {% endtabs %}

{% hint style="info" %} 或者,如果你使用了自定义 SSH 端口,你可能需要添加 -p <端口号> 标志。

ssh -i <你的 SSH_key_name.pub 的路径> ethereum@server.public.ip.address

{% endhint %}

可选: 通过更新你的本地 ssh 配置,使登录更容易。

为了简化登录到服务器所需的 ssh 命令,请考虑更新你的本地 $HOME/.ssh/config 文件:

Host ethereum-server
  User ethereum
  HostName <server.public.ip.address>
  Port <自定义端口号>

这将允许你使用 ssh ethereum-server 登录,而无需显式传递所有 ssh 参数。

:robot: 更新你的系统

{% hint style="warning" %} 保持你的系统使用最新的补丁进行更新至关重要,以防止入侵者访问你的系统。 {% endhint %}

sudo apt-get update -y && sudo apt dist-upgrade -y
sudo apt-get autoremove
sudo apt-get autoclean

启用自动更新,这样你就不必手动安装它们。

sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

:bear: 禁用 root 账户

系统管理员不应频繁以 root 身份登录,以维护服务器安全。相反,你可以使用需要低级别权限的 sudo 执行。

## 要禁用 root 账户,只需使用 -l 选项。
sudo passwd -l root
## 如果由于某种有效的原因,你需要重新启用该账户,只需使用 -u 选项。
sudo passwd -u root

:tools: 为 SSH 设置双因素身份验证 [可选]

{% hint style="info" %} 安全外壳 SSH 通常用于访问远程 Linux 系统。因为我们经常使用它来连接包含重要数据的计算机,所以建议添加另一个安全层。这就是双因素身份验证 (2FA) 的用武之地。 {% endhint %}

sudo apt install libpam-google-authenticator -y

要使 SSH 使用 Google Authenticator PAM 模块,请编辑 /etc/pam.d/sshd 文件:

sudo nano /etc/pam.d/sshd

添加以下行:

auth required pam_google_authenticator.so

现在你需要使用以下命令重启 sshd 守护进程:

sudo systemctl restart sshd.service

修改 /etc/ssh/sshd_config

sudo nano /etc/ssh/sshd_config

找到 ChallengeResponseAuthentication 并更新为 yes

ChallengeResponseAuthentication yes

找到 UsePAM 并更新为 yes

UsePAM yes

保存文件并退出。

运行 google-authenticator 命令。

google-authenticator

它会问你一系列问题,这是一个推荐的配置:

  • 将Token设为“基于时间”:yes
  • 更新 .google_authenticator 文件:yes
  • 禁止多次使用:yes
  • 增加原始生成时间限制:no
  • 启用速率限制:yes

你可能已经注意到在此过程中出现的巨大 QR 码,下面是你在无法访问手机时要使用的紧急备用代码:将它们写在纸上并保存在安全的地方。

现在,在你的手机上打开 Google Authenticator 并添加你的密钥以使双因素身份验证工作。

{% hint style="danger" %} 注意:如果你在通过 SSH 访问的远程计算机上启用 2FA,你需要按照本教程步骤 2 和 3 来使 2FA 工作。 {% endhint %}

:jigsaw: 保护共享内存

{% hint style="info" %} 你应该做的第一件事是保护系统上使用的共享内存。如果你不知道,共享内存可用于攻击正在运行的服务。因此,请保护该部分系统内存。

要了解有关保护共享内存的更多信息,请阅读这篇 techrepublic.com 文章。 {% endhint %}

{% hint style="warning" %}

一个特殊情况

你可能需要以读/写模式挂载该内存空间(例如特定的服务器应用程序(如 DappNode,需要访问共享内存)或标准应用程序(如 Google Chrome)的原因)。在这种情况下,请对 fstab 文件使用以下行,并按照以下说明进行操作。

none /run/shm tmpfs rw,noexec,nosuid,nodev 0 0

上面的行将以读/写访问权限挂载共享内存,但不允许执行程序、更改正在运行的程序的 UID 或在命名空间中创建块或字符设备。这是对默认设置的网络安全改进。

谨慎使用

通过一些试验和错误,你可能会发现某些应用程序(如 DappNode)在只读模式下无法使用共享内存。为了获得最高的安全性,如果与你的应用程序兼容,实现此安全共享内存设置是一项值得的工作。

来源:techrepublic.com {% endhint %}

编辑 /etc/fstab

sudo nano /etc/fstab

将以下行插入到文件底部并保存/关闭。这将共享内存设置为只读模式。

tmpfs    /run/shm    tmpfs    ro,noexec,nosuid    0 0

重启节点以使更改生效。

sudo reboot

:chains:安装 Fail2ban

{% hint style="info" %} Fail2ban 是一种入侵预防系统,它监视日志文件并搜索与登录尝试失败相对应的特定模式。如果从特定 IP 地址(在指定的时间内)检测到一定数量的登录失败,则 fail2ban 会阻止从该 IP 地址的访问。 {% endhint %}

sudo apt-get install fail2ban -y

编辑监视 SSH 登录的配置文件。

sudo nano /etc/fail2ban/jail.local

将以下行添加到文件底部。

{% hint style="info" %} :fire: IP 地址白名单提示ignoreip 参数接受你可以指定允许连接的 IP 地址、IP 范围或 DNS 主机。这是你要指定你的本地计算机、本地 IP 范围或本地域的位置,用空格分隔。

## 例子
ignoreip = 192.168.1.0/24 127.0.0.1/8

{% endhint %}

[sshd]
enabled = true
port = <22 或你的随机端口号>
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
## 白名单 IP 地址
ignoreip = <白名单 IP 地址列表,你的本地日常笔记本电脑/电脑>

保存/关闭文件。

重启 fail2ban 以使设置生效。

sudo systemctl restart fail2ban

:bricks:配置你的防火墙

标准 UFW 防火墙可用于控制对你节点的网络访问。

对于任何新安装,ufw 默认情况下处于禁用状态。使用以下设置启用它。

  • 端口 22(或你的随机端口号)TCP 用于 SSH 连接
  • 用于 p2p 流量的端口
    • Lighthouse 使用端口 9000 tcp/udp
    • Teku 使用端口 9000 tcp/udp
    • Prysm 使用端口 13000 tcp 和端口 12000 udp
    • Nimbus 使用端口 9000 tcp/udp
    • Lodestar 使用端口 30607 tcp 和端口 9000 udp
  • 端口 30303 tcp/udp eth1 节点

{% tabs %} {% tab title="Lighthouse" %}

## 默认情况下,拒绝所有传入和传出流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 允许 ssh 访问
sudo ufw allow ssh #<端口 22 或你的随机 ssh 端口号>/tcp
## 允许 p2p 端口
sudo ufw allow 9000/tcp
sudo ufw allow 9000/udp
## 允许 eth1 端口
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## 启用防火墙
sudo ufw enable

{% endtab %}

{% tab title="Prysm" %}

## 默认情况下,拒绝所有传入和传出流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 允许 ssh 访问
sudo ufw allow ssh #<端口 22 或你的随机 ssh 端口号>/tcp
## 允许 p2p 端口
sudo ufw allow 13000/tcp
sudo ufw allow 12000/udp
## 允许 eth1 端口
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## 启用防火墙
sudo ufw enable

{% endtab %}

{% tab title="Teku" %}

## 默认情况下,拒绝所有传入和传出流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 允许 ssh 访问
sudo ufw allow ssh #<端口 22 或你的随机 ssh 端口号>/tcp
## 允许 p2p 端口
sudo ufw allow 9000/tcp
sudo ufw allow 9000/udp
## 允许 eth1 端口
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## 启用防火墙
sudo ufw enable

{% endtab %}

{% tab title="Nimbus" %}

## 默认情况下,拒绝所有传入和传出流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 允许 ssh 访问
sudo ufw allow ssh #<端口 22 或你的随机 ssh 端口号>/tcp
## 允许 p2p 端口
sudo ufw allow 9000/tcp
sudo ufw allow 9000/udp
## 允许 eth1 端口
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## 启用防火墙
sudo ufw enable

{% endtab %}

{% tab title="Lodestar" %}

## 默认情况下,拒绝所有传入和传出流量
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 允许 ssh 访问
sudo ufw allow ssh #<端口 22 或你的随机 ssh 端口号>/tcp
## 允许 p2p 端口
sudo ufw allow 30607/tcp
sudo ufw allow 9000/udp
## 允许 eth1 端口
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## 启用防火墙
sudo ufw enable

{% endtab %} {% endtabs %}

## 验证状态
sudo ufw status numbered

{% hint style="danger" %} 不要将 Grafana(端口 3000)和 Prometheus 端点(端口 9090)暴露给公共互联网,因为这会引入新的攻击面!一个安全的解决方案是通过具有 Wireguard 的 ssh 隧道访问 Grafana。 {% endhint %}

仅在家庭路由器防火墙或其他网络防火墙后面的本地家庭质押设置上打开以下端口。

:fire: 在 VPS/云节点上打开这些端口是危险的。

## 允许 grafana 网络服务器端口
sudo ufw allow 3000/tcp
## 启用 prometheus 端点端口
sudo ufw allow 9090/tcp

确认设置已生效。

# 验证状态
sudo ufw status numbered
     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
# SSH
[ 2] 3000/tcp                   ALLOW IN    Anywhere
# Grafana
[ 3] 9000/tcp                   ALLOW IN    Anywhere
# eth2 p2p traffic
[ 4] 9090/tcp                   ALLOW IN    Anywhere
# Prometheus
[ 5] 30303/tcp                  ALLOW IN    Anywhere
# eth1 node
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
# SSH
[ 7] 3000/tcp (v6)              ALLOW IN    Anywhere (v6)
# Grafana
[ 8] 9000/tcp (v6)              ALLOW IN    Anywhere (v6)
# eth2 p2p traffic
[ 9] 9090/tcp (v6)              ALLOW IN    Anywhere (v6)
# Prometheus
[10] 30303/tcp (v6)             ALLOW IN    Anywhere (v6)
# eth1 node

[可选但推荐] 可以通过以下命令设置列入白名单(或允许来自特定 IP 的连接)。

sudo ufw allow from <你的本地日常笔记本电脑/电脑>
## 例子
## sudo ufw allow from 192.168.50.22

{% hint style="info" %} :confetti_ball: 端口转发提示: 你需要将端口转发和打开到你的验证器。使用 https://www.yougetsignal.com/tools/open-ports/https://canyouseeme.org/ 验证它是否有效。 {% endhint %}

:telephone_receiver: 验证侦听端口

如果你想维护安全的服务器,你应该每隔一段时间验证一次侦听网络端口。这将为你提供有关你的网络的基本信息。

sudo ss -tulpn
## 示例输出。确保端口号看起来正确。
## Netid  State    Recv-Q  Send-Q    Local Address:Port   Peer Address:Port   Process
## tcp    LISTEN   0       128       127.0.0.1:5052       0.0.0.0:*           users:(("lighthouse",pid=12160,fd=22))
## tcp    LISTEN   0       128       127.0.0.1:5054       0.0.0.0:*           users:(("lighthouse",pid=12160,fd=23))
## tcp    LISTEN   0       1024      0.0.0.0:9000         0.0.0.0:*           users:(("lighthouse",pid=12160,fd=21))
## udp    UNCONN   0       0         *:30303              *:*                 users:(("geth",pid=22117,fd=158))
## tcp    LISTEN   0       4096      *:30303              *:*                 users:(("geth",pid=22117,fd=156))

或者你可以使用 netstat

sudo netstat -tulpn
## 示例输出。确保端口号看起来正确。
## Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
## tcp        0      0 127.0.0.1:5052          0.0.0.0:*               LISTEN      12160/lighthouse
## tcp        0      0 127.0.0.1:5054          0.0.0.0:*               LISTEN      12160/lighthouse
## tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      12160/lighthouse
## tcp6       0      0 :::30303                :::*                    LISTEN      22117/geth
## udp6       0      0 :::30303                :::*                    LISTEN      22117/geth

:woman_astronaut: 使用 系统用户帐户 - 最小权限原则 [高级用户 / 可选]

{% hint style="info" %} 仅推荐给高级用户

最小权限原则:每个 eth2 进程都分配一个 系统用户帐户,并以所需的最少权限运行才能正常运行。此最佳实践可防止在特定进程中发现的漏洞或利用可能使访问其他系统进程的场景。 {% endhint %}

## 为 eth1 服务创建系统用户帐户
sudo adduser --system --no-create-home eth1

## 为验证器服务创建系统用户帐户
sudo adduser --system --no-create-home validator

## 为信标链服务创建系统用户帐户
sudo adduser --system --no-create-home beacon-chain

## 为 slasher 创建系统用户帐户
sudo adduser --system --no-create-home slasher

{% hint style="danger" %} :fire: 面向高级用户的注意事项

如果你决定使用 系统用户帐户,请记住使用相应的用户替换 systemd 单元文件

## 信标链服务单元文件示例
User            = beacon-chain

此外,确保在适用的情况下将正确的文件所有权分配给你的 系统用户帐户

## prysm 验证器的密码文件示例
sudo chown validator:validator -R $HOME/.eth2validators/validators-password.txt

{% endhint %}

:sparkles: 其他验证器节点最佳实践

网络 将静态内部 IP 分配给你的验证器节点和日常笔记本电脑/PC。这与 ufw 和 Fail2ban 的白名单功能结合使用非常有用。通常,这可以在你路由器的设置中配置。有关说明,请查阅你路由器的手册。
电源中断 如果发生电源中断,你希望你的验证器机器在有电时立即重启。在 BIOS 设置中,将 Restore on AC / Power LossAfter Power Loss 设置更改为始终开启。更好的是,安装不间断电源 (UPS)。
清除 bash 历史记录 <p>当按下向上箭头键时,你可以看到可能包含敏感数据的先前命令。要清除此内容,请运行以下命令:</p><p><code>shred -u ~/.bash_history && touch ~/.bash_history</code></p>

{% hint style="info" %} 请务必查看 清单 | 如何确认 ETH2 验证器运行正常。 {% endhint %}

:robot: 通过构建验证器开始质押

访问我们的主网指南

{% hint style="success" %} 恭喜你完成本指南。:sparkles:

你觉得我们的指南有用吗?通过小费向我们发送信号,我们将继续更新它。

它确实激励我们不断创建最好的加密指南。

使用 cointr.ee 查找我们的捐赠 地址。:pray:

感谢你的任何反馈和所有 pull request。:first_quarter_moon_with_face: {% endhint %}

:rocket: 参考资料

{% embed url="https://medium.com/@BaneBiddix/how-to-harden-your-ubuntu-18-04-server-ffc4b6658fe7" %}

{% embed url="https://linux-audit.com/ubuntu-server-hardening-guide-quick-and-secure/" %}

{% embed url="https://www.digitalocean.com/community/tutorials/how-to-harden-openssh-on-ubuntu-18-04" %}

{% embed url="https://ubuntu.com/tutorials/configure-ssh-2fa#1-overview" %}

{% embed url="https://linuxize.com/post/install-configure-fail2ban-on-ubuntu-20-04/" %}

https://gist.github.com/lokhman/cc716d2e2d373dd696b2d9264c0287a3#file-ubuntu-hardening-md

{% embed url="https://www.lifewire.com/harden-ubuntu-server-security-4178243" %}

{% embed url="https://www.ubuntupit.com/best-linux-hardening-security-tips-a-comprehensive-checklist/" %}

  • 原文链接: github.com/coincashew/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
coincashew
coincashew
江湖只有他的大名,没有他的介绍。