Linux 系统的 NAS 之路——防火墙与 SSH 安全管理
categories: 技术 tags: NAS, LinuxLinux 系统的 NAS 之路—防火墙与 SSH 安全管理
本期讲解 Linux 系统的基本安全防护,包括防火墙、SSH 免密与内外网安全配置,fail2ban 的使用。
防火墙
在 Cockpit 面板中可以轻松启用(默认已开启)管理防火墙

点击”编辑规则和区域“

简单介绍几个概念:
- 安全区域:防火墙将网络划分成不同的“区域”,每个区域对应不同的信任级别。比如
public区域用于不可信的外部网络,trusted区域允许所有连接。 - 服务端口:防火墙预定义了一些“服务”,本质就是协议和端口的组合(如
ssh对应 TCP 22 端口),方便一键放行常用的网络服务。 - 传入请求:外部设备发向本机的网络连接请求。防火墙主要就是控制哪些传入请求被允许。
- 传出请求:本机发向外部设备的网络连接请求。默认情况下传出请求通常不受限制,因为本机主动发起的连接一般被认为是安全的。
主要讲一下安全区域,一个网络接口只能有一个安全区域,每个安全区域可以配置不通的安全白名单,因此多网络接口的设备可以实现防火墙隔离。例如,可以配置接入接口 1 的设备访问整个服务器服务,接入接口 2 的设备只能访问 SSH 服务,等等。
SSH
免密登录
安全又方便,一定要配置。当前时间节点(26 年)推荐使用 ed25519 算法,安全性直接拉爆,几乎没有破解可能。
- RSA(依赖大整数分解):其安全性基于“分解两个大质数的乘积极其困难”。但目前已有专门的量子算法(Shor 算法),理论上量子计算机成熟后,可以在多项式时间内破解 RSA。
- Ed25519(依赖椭圆曲线离散对数):基于椭圆曲线上的数学难题。虽然量子计算同样对其构成威胁,但破解 Ed25519 所需的量子资源远高于破解同等级别的 RSA。在同等安全强度下(例如 128-bit 安全级别),Ed25519 的密钥长度(256 位)远短于 RSA(3072 位),这使得它在抵御量子攻击时,资源开销的天花板更高。
除此之外相比 RSA 还有很多优势,这里就不一一列举了。只要是新安装的服务器且系统不是老古董的话,都应该使用 ed25519 密钥。
sukipai@localhost:~$ ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/sukipai/.ssh/id_ed25519):
Enter passphrase for "/home/sukipai/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sukipai/.ssh/id_ed25519
Your public key has been saved in /home/sukipai/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:3+YJP2MiQkK+gtFyzMckZjQ0brD1zVBw2iJTj9sy87Q your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
|..+ +oo |
| =o+ X |
|..=.= = |
| .+oo+ |
| * *= o S |
|o = =*.. . . |
| = . +E o o |
|. . . . . .=+. |
| . . . o+o |
+----[SHA256]-----+
ssh-keygen -t ed25519 -C "your_email@example.com" 写一个个人邮箱,一路回车就可以了。
sukipai@localhost:~/.ssh$ cat id_ed25519*
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdj.....DNkDf8Npu5p1hBouUlRpY9vg6YAHq
GrPbyulGf7NGWUpvfPsrAAAAFnlvdXJfZW1haWxAZXhhbXBsZS5jb20BAgMEBQYH
-----END OPENSSH PRIVATE KEY-----
ssh-ed25519 AAAAC3NzaC1.....RpY9vg6YAHqGrPbyulGf7NGWUpvfPsr your_email@example.com
sukipai@localhost:~/.ssh$ ls
agent id_ed25519 id_ed25519.pub
保存好 id_ed25519,id_ed25519.pub 这两份密钥文件。
id_ed25519:私钥,必须严格保密,不要泄露给任何人。id_ed25519.pub:公钥,需要安全地放到远程服务器上。
关系别搞错了,如果私钥不幸泄露,立即停止并检查使用所有使用对应公钥的设备,重新生成密钥并部署。
外网禁止,内网允许密码登录
这是我当前采用的安全策略,最初我是完全禁止了密码登录,但有时候我会使用别人的电脑通过虚拟局域网接入我的内网,这时候如果将密钥部署在别人的电脑上,不就直接泄露了吗?
因此我开放了内网的密码登陆权限,直接我接入局域网,就可以通过密码登录。而接入局域网这一操作本身就已经是安全加密的,因此完全不存在安全问题。
完全这个操作也非常简单,只需在 /etc/ssh/sshd_config.d 中添加一个 99-user.conf 配置文件,并写入以下内容
# 放置在 /etc/ssh/sshd_config.d/,拒绝非内网密码登录
# 全局默认:禁止密码登录
PasswordAuthentication no
# 全局允许:密钥登录
PubkeyAuthentication yes
# 关闭交互式/二次验证,防止绕过密码限制
ChallengeResponseAuthentication no
# 禁止空密码、root 账号登录
PermitEmptyPasswords no
PermitRootLogin no
# 仅允许 10.0.0.0/24 网段内的设备使用密码登录
Match Address 10.0.0.0/24
passwordAuthentication yes
就可以完美实现前面所述的功能。
fail2ban 放爆破
Fail2ban 就像一个看门狗,它会盯着服务器的日志文件,一旦发现某个 IP 在短时间内多次登录失败,就立刻把这个 IP 扔进“小黑屋”(防火墙黑名单),有效防止暴力破解。
安装 fail2ban:
sudo dnf install fail2ban
不要直接修改主配置文件 /etc/fail2ban/jail.conf,因为软件升级会覆盖它。正确的做法是创建一个 jail.local 文件来覆盖设置。
执行命令创建配置文件:
sudo vi /etc/fail2ban/jail.local
然后写入以下配置,里面的内容可以酌情更改:
[DEFAULT]
# 所有监狱的通用设置:忽略本地IP,避免把自己锁在外面
ignoreip = 127.0.0.1/8 ::1
# 发现违规后,封禁时长(秒)
bantime = 3600
# 在多久时间窗口内统计失败次数(秒)
findtime = 600
# 在 findtime 时间内失败超过几次就封禁
maxretry = 5
# 针对 SSH 服务的专门设置
[sshd]
# 启用该规则
enabled = true
# 监听的日志文件路径
logpath = %(sshd_log)s
# 采用系统自带的 SSH 过滤规则
filter = sshd
# 动作:调用防火墙拦截,并发送邮件通知(如果有配置邮件的话)
action = %(action_mwl)s
配置保存后,重启服务并设为开机自启:
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# 查看所有被激活的监控规则(监狱)状态
sudo fail2ban-client status
# 专门查看 SSH 监控状态,能看到当前被封禁的 IP 列表
sudo fail2ban-client status sshd
由于 fail2ban 只是判断某个人该不该被 ban 掉,实际执行 ban 这个动作的是防火墙,因此 fail2ban 与防火墙高度相关,必须开启防火墙才能使用这个功能。
不过说实话,fail2ban 只是一个不起眼的保险,如果你按我推荐的方法配置 SSH 免密,或者把 SSH 端口改为高位端口(不用 22),攻击者连密码框都摸不到(公网只能密钥连接),根本不可能触发防 ban 机制。
如果你担心 fail2ban 弄乱防火墙规则,也可以不启用。