本文档提供了保护 ETH staking 验证器节点安全性的快速步骤和最佳实践,包括创建具有 sudo 权限的非 root 用户、禁用 SSH 密码身份验证和使用 SSH 密钥、更新系统、禁用 root 帐户、设置 SSH 的双因素身份验证、保护共享内存、安装 Fail2ban、配置防火墙以及使用系统用户帐户等。
{% hint style="info" %} 2022-6 Gitcoin Grant Round 14: 在你的支持下,我们改进了本指南!
帮助资助我们并获得 POAP NFT。感谢你的支持! 🙏 {% endhint %}
如果你需要安装 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/" %}
{% hint style="info" %}
养成使用非 root 账户登录服务器的习惯。这将防止你在犯错时意外删除文件。例如,如果 root 用户错误地使用 rm
命令,可能会清除你的整个服务器。
{% endhint %}
{% hint style="danger" %}
:fire:提示: 不要经常使用 root 账户。始终使用 su
或 sudo
。
{% 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
{% hint style="info" %} 强化 SSH 的基本规则是:
su
或 sudo
)sudo
,以便记录命令在本地计算机上创建一个新的 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 参数。
{% 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
系统管理员不应频繁以 root 身份登录,以维护服务器安全。相反,你可以使用需要低级别权限的 sudo 执行。
## 要禁用 root 账户,只需使用 -l 选项。
sudo passwd -l root
## 如果由于某种有效的原因,你需要重新启用该账户,只需使用 -u 选项。
sudo passwd -u root
{% 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
它会问你一系列问题,这是一个推荐的配置:
.google_authenticator
文件:yes你可能已经注意到在此过程中出现的巨大 QR 码,下面是你在无法访问手机时要使用的紧急备用代码:将它们写在纸上并保存在安全的地方。
现在,在你的手机上打开 Google Authenticator 并添加你的密钥以使双因素身份验证工作。
{% hint style="danger" %} 注意:如果你在通过 SSH 访问的远程计算机上启用 2FA,你需要按照本教程的步骤 2 和 3 来使 2FA 工作。 {% endhint %}
{% 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
{% 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
标准 UFW 防火墙可用于控制对你节点的网络访问。
对于任何新安装,ufw 默认情况下处于禁用状态。使用以下设置启用它。
{% 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 %}
如果你想维护安全的服务器,你应该每隔一段时间验证一次侦听网络端口。这将为你提供有关你的网络的基本信息。
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
{% 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 %}
网络 | 将静态内部 IP 分配给你的验证器节点和日常笔记本电脑/PC。这与 ufw 和 Fail2ban 的白名单功能结合使用非常有用。通常,这可以在你路由器的设置中配置。有关说明,请查阅你路由器的手册。 |
电源中断 | 如果发生电源中断,你希望你的验证器机器在有电时立即重启。在 BIOS 设置中,将 Restore on AC / Power Loss 或 After Power Loss 设置更改为始终开启。更好的是,安装不间断电源 (UPS)。 |
清除 bash 历史记录 | <p>当按下向上箭头键时,你可以看到可能包含敏感数据的先前命令。要清除此内容,请运行以下命令:</p><p><code>shred -u ~/.bash_history && touch ~/.bash_history</code></p> |
{% hint style="info" %} 请务必查看 清单 | 如何确认 ETH2 验证器运行正常。 {% endhint %}
{% hint style="success" %} 恭喜你完成本指南。:sparkles:
你觉得我们的指南有用吗?通过小费向我们发送信号,我们将继续更新它。
它确实激励我们不断创建最好的加密指南。
使用 cointr.ee 查找我们的捐赠 地址。:pray:
感谢你的任何反馈和所有 pull request。:first_quarter_moon_with_face: {% endhint %}
{% 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!