节点操作系统加固:Linux系统安全基线、最小权限原则、SSH安全配置、防火墙规则
各位同学,今天我们来聊聊节点操作系统的加固。说实话,我见过太多区块链项目因为操作系统层面的疏漏被攻破。节点跑在Linux上,Linux本身是安全的,但默认配置往往不够。咱们得亲手把它拧紧。
核心思路:操作系统是节点的地基。地基不稳,上面跑再多智能合约审计、再多加密算法,都是白搭。
一、Linux系统安全基线
什么叫安全基线?说白了,就是一套「最低安全标准」。我习惯把基线分成三个层面:内核参数、系统服务、文件权限。
1.1 内核参数调优
内核参数里有些开关,默认是打开的,但对节点来说很危险。比如IP转发、ICMP重定向这些,攻击者可以利用它们做中间人攻击。
# 我常用的内核加固脚本片段
# 禁用IP转发
net.ipv4.ip_forward = 0
# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# 启用反向路径过滤(防IP欺骗)
net.ipv4.conf.all.rp_filter = 1
# 限制SYN洪水攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
把这些参数写入 /etc/sysctl.d/99-hardening.conf,然后执行 sysctl -p 生效。嗯,这里要注意:改内核参数前最好先在测试环境跑一遍,别把生产节点的网络搞断了。
1.2 最小化系统服务
你想想看,一个区块链节点需要跑多少服务?其实只需要:SSH、节点客户端、监控代理。其他的一律关掉。
我的经验:我曾经接手过一个被入侵的节点,攻击者就是通过一个没用的CUPS打印服务进去的。从那以后,我每装一台新机器,第一件事就是跑 systemctl list-units --type=service --state=running,把不认识的服务全干掉。
# 禁用常见无用服务
systemctl disable cups.service
systemctl disable avahi-daemon.service
systemctl disable bluetooth.service
systemctl disable postfix.service
1.3 文件权限基线
Linux文件权限,看似简单,但坑很多。我见过有人把私钥文件设成 chmod 777,理由是「方便备份」——这简直是给攻击者送大礼。
| 文件/目录 | 推荐权限 | 说明 |
|---|---|---|
| /etc/shadow | 600 | 密码哈希,只有root能读 |
| /etc/ssh/sshd_config | 600 | SSH配置,防泄露 |
| 节点数据目录 | 700 | 只允许节点用户访问 |
| 私钥文件 | 400 | 只读,且只有所有者 |
二、最小权限原则
最小权限原则,说白了就是「给够用就行,多一分都不给」。我见过很多运维图省事,直接给节点进程开root权限。这非常危险——一旦节点进程被攻破,攻击者直接拿到整台机器的控制权。
2.1 创建专用用户
每个节点服务都应该有自己的系统用户。比如以太坊节点用 geth 用户,比特币节点用 bitcoin 用户。
# 创建专用用户,没有登录权限
useradd -r -s /sbin/nologin -m -d /var/lib/geth geth
# 设置目录权限
chown -R geth:geth /var/lib/geth
chmod 700 /var/lib/geth
避坑指南:我曾经见过有人用 useradd -M 不创建家目录,结果节点日志写不进去,排查了半天。所以记得加 -m 参数创建家目录。
2.2 使用sudo提权
如果节点进程需要执行某些特权操作(比如绑定低端口),不要直接给root,而是用sudo精确授权。
# 在 /etc/sudoers.d/ 下创建文件
# 允许geth用户执行特定命令
geth ALL=(root) NOPASSWD: /usr/bin/setcap
geth ALL=(root) NOPASSWD: /usr/bin/iptables
2.3 文件系统挂载选项
对于节点数据分区,我习惯加上 noexec、nosuid、nodev 这些挂载选项。这样即使攻击者上传了恶意文件,也没法执行。
# /etc/fstab 示例
/dev/sdb1 /var/lib/geth ext4 defaults,noexec,nosuid,nodev 0 2
三、SSH安全配置
SSH是节点管理的生命线,也是最常见的攻击入口。我每天都能在节点日志里看到成百上千次SSH暴力破解尝试。
3.1 核心配置项
打开 /etc/ssh/sshd_config,以下配置必须改:
# 禁用root直接登录
PermitRootLogin no
# 只允许密钥认证
PasswordAuthentication no
# 指定允许登录的用户
AllowUsers admin geth
# 修改默认端口(非必须,但能减少扫描)
Port 2222
# 限制登录尝试次数
MaxAuthTries 3
# 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 2
我个人习惯:我会把SSH端口改到10000以上,虽然这不是真正的安全措施,但能过滤掉90%的自动化扫描脚本。剩下的10%,靠密钥认证和fail2ban来挡。
3.2 密钥管理
密钥认证比密码安全得多,但密钥本身也要保护好。我建议使用ED25519算法,比RSA更安全、性能更好。
# 生成ED25519密钥对
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519
# 将公钥部署到节点
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@node-ip
3.3 使用fail2ban
fail2ban是个好东西,它能自动封禁暴力破解的IP。我所有节点都必装。
# 安装fail2ban
apt install fail2ban
# 配置SSH防护
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
systemctl restart fail2ban
四、防火墙规则
防火墙是节点的第一道防线。我习惯用iptables,虽然配置起来麻烦点,但可控性最强。当然,ufw也可以,看个人喜好。
4.1 默认策略
默认策略应该是「拒绝所有,放行必要」。这是安全的基本原则。
# 清空现有规则
iptables -F
iptables -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
4.2 放行必要端口
区块链节点需要开放的端口很少。以以太坊节点为例:
| 端口 | 协议 | 用途 | 建议 |
|---|---|---|---|
| 30303 | TCP/UDP | P2P节点通信 | 对全网开放 |
| 8545 | TCP | JSON-RPC API | 仅内网或绑定localhost |
| 2222 | TCP | SSH管理 | 仅白名单IP |
# 放行SSH(仅限管理IP)
iptables -A INPUT -p tcp --dport 2222 -s 192.168.1.0/24 -j ACCEPT
# 放行P2P端口
iptables -A INPUT -p tcp --dport 30303 -j ACCEPT
iptables -A INPUT -p udp --dport 30303 -j ACCEPT
# 放行已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放行回环接口
iptables -A INPUT -i lo -j ACCEPT
避坑指南:我曾经在配置防火墙时,忘了放行回环接口,结果节点内部通信全断了,RPC调用全部超时。排查了半小时才发现是这个问题。所以 -i lo -j ACCEPT 这条一定要加。
4.3 使用ipset管理黑名单
对于频繁扫描的IP,我习惯用ipset做动态封禁,比iptables规则更高效。
# 创建ipset集合
ipset create blacklist hash:ip timeout 86400
# 添加封禁IP
ipset add blacklist 1.2.3.4
# 在iptables中引用
iptables -A INPUT -m set --match-set blacklist src -j DROP
五、知识体系总览
下面这张图,是我自己总结的节点操作系统加固框架。你可以把它当成一个检查清单,每加固一台节点,就对照着过一遍。
这张图把四个核心模块串起来了。你想想看,安全基线是「做什么」,最小权限是「怎么做」,SSH和防火墙是「怎么防」。四者缺一不可。
最后说一句:操作系统加固不是一次性工作。我每个月都会重新检查一遍配置,看看有没有新漏洞、有没有新服务被意外开启。安全是个持续的过程,不是一锤子买卖。
公众号:蓝海资料掘金营,微信deep3321