云计算百科
云计算领域专业知识百科平台

为了服务器安全加固那点事,我写了个脚本

本文来自我的个人博客:为了服务器安全加固那点事,我写了个脚本

一台新服务器上线后会发生什么

前几天买了台雨云的服务器,第二天打开终端看一眼 /var/log/auth.log。

上线不到半小时,里面已经躺了上百条 Failed password。IP 来自俄罗斯、越南、美国、荷兰,还有几个我连名字都叫不上来的地方(就是如此神秘呵呵,可以拿来补习地理知识了)。它们不挑时间,凌晨三点也在扫,周末也不休息。大部分是字典攻击,挨个试 root、admin、user、test 这类弱口令。

其实我觉得啊,你的服务器只要有一个公网 IP,就已经在别人的扫描名单上了。不是“可能会被攻击”,是“正在被攻击”。

所以每次新机器到手,我都会花十几分钟做一遍安全加固:改 SSH 端口、关密码登录、装 Fail2ban、配防火墙、设密码策略、查空口令账户……

说难不算难,每个步骤单独拎出来也就一两行命令。但做多了就腻了。(当然,如果你安装了宝塔面板等,可以很轻松的在面板操作,但是不是每个服务器都会安装宝塔面板吧。)有时候忙起来忘了做某个步骤,过几天想起来再去看日志,已经被人扫了几天了。

这次趁着有空,我把这些事情整理成了一个脚本,叫 LXSecure。放 GitHub 上了:https://github.com/gzy318/LXSecure

1. LXSecure 是什么、能做什么

简单说就是把安全加固的那些操作按顺序自动化了。一共 14 个功能模块,每一个都可以单独运行,也可以一键全部跑完。用的时候有一个菜单界面,选数字就行,不需要记任何命令。

支持 Debian/Ubuntu、CentOS/RHEL 7+、Rocky Linux、AlmaLinux 这些主流发行版。

完整功能列表:

编号功能
0 退出
1 系统更新
2 SSH 安全加固
3 防火墙配置
4 Fail2ban
5 密码策略
6 文件权限加固
7 内核参数(多场景)
8 审计日志
9 恶意软件扫描
10 账户安全检查
11 AIDE 文件完整性
12 生成安全报告
13 自动安全更新
14 关闭不必要服务
15 Lynis 安全审计
16 执行全部加固

2. SSH 安全加固

SSH 是服务器的入口,也是被攻击最多的入口。脚本在这一块做了几件事。

2.1 修改 SSH 端口

22 是默认端口,扫描器第一个扫的就是它。脚本会提示输入一个新端口,建议用 10000 到 65535 之间的数。别用 2222、10086 这种太好猜的——扫描器扫完 22 之后,会接着扫一批常见的高位端口。

改端口有个坑:顺序错了你就把自己锁在门外了,贼搞笑哈哈,特别诡异。正确的顺序是先放行新端口,再改配置,最后重启服务。脚本的处理顺序是:先检测系统用的是 UFW、Firewalld 还是原生 iptables,用对应的命令先把新端口放行掉,再去改 /etc/ssh/sshd_config,最后才重启 sshd。

2.2 禁用 Root 密码登录、改用密钥

改成只允许密钥登录。这一步的前提是你得有一对密钥——公钥放服务器上,私钥留本地。脚本给了两个选项:可以粘贴自己已有的公钥,也可以让脚本直接生成一对新的。

2.3 生成 Ed25519 密钥对

如果你选自动生成,脚本会用 ssh-keygen -t ed25519 生成一对密钥。Ed25519 是基于椭圆曲线的签名算法,256 位的密钥长度就能提供和 RSA 4096 位相当的安全性,而且生成和验证速度更快。OpenSSH 从 6.5 版本就开始支持了,2014 年之后的系统基本都兼容。

密钥生成之后,脚本会把公钥写入 /root/.ssh/authorized_keys,然后提示下载私钥并删除服务器上的副本。私钥不应该留在服务器上,这是基本的安全意识。

2.4 其他 SSH 加固参数

脚本还会自动配置几个额外的 SSH 安全参数:

1.MaxAuthTries 3:单次连接最多尝试 3 次认证,超过就断开

2.ClientAliveInterval 300:300 秒无活动发送心跳包检测连接是否存活

3.ClientAliveCountMax 2:心跳包超时 2 次就断开连接

4.LogLevel VERBOSE:记录更详细的登录日志,便于事后追溯

2.5 实操建议

万一新端口连不上,请 VNC 救援模式进去修复——所有 VPS 服务商都有这个功能。

3. 防火墙配置:自动适配、只管放行需要的端口

不同 Linux 发行版用的防火墙工具不一样——Ubuntu 默认是 UFW,CentOS 7+ 是 Firewalld,老系统可能是原生 iptables。脚本会先检测系统里装了什么,然后用对应的方式配置。

默认只开放三个端口:SSH 端口(就是你刚改的那个)、80 和 443。其他端口全部关闭。配置的时候脚本会问要不要额外放行其他端口,比如 8080、3306 之类的,按需添加就行。

UFW 启用之前会先把 SSH 端口放行掉——先放行再启用,不会出现启用防火墙后把自己踢出去的情况。

4. Fail2ban:盯着认证日志封 IP

Fail2ban 的原理很简单:盯着认证日志看,同一个 IP 如果在短时间内失败次数太多,就调用防火墙把它封掉。它和防火墙是配合关系——防火墙定义哪些端口能进,Fail2ban 在防火墙里动态添加黑名单。

脚本配置了两个 jail:

1.sshd:5 次失败封 1 小时

2.sshd-ddos:10 次失败封 2 小时

为什么要配两个?有些攻击是分布式的,单个 IP 失败次数不多但整体数量很大,sshd-ddos 就是针对这种情况。

Fail2ban 的配置文件在 /etc/fail2ban/jail.local。如果发现某个 IP 段持续在扫,可以手动把 bantime 改成 86400(24 小时)甚至更长。日志在 /var/log/fail2ban.log,封禁不生效的时候去这里看原因。常见问题是日志路径不对——不同发行版 sshd 的日志位置不一样,需要确认 jail.local 里的 logpath 设置正确。

5. 密码策略:改 login.defs 和 PAM

多用户服务器上密码策略是绕不开的。脚本会改 /etc/login.defs 里的四个参数:

1.PASS_MAX_DAYS:90 天,密码到期必须改

2.PASS_MIN_DAYS:2 天,不能频繁改回旧密码

3.PASS_MIN_LEN:8 位

4.PASS_WARN_AGE:7 天,到期前提醒

同时通过 PAM 模块配置密码复杂度——必须包含大小写字母、数字和特殊字符。Debian/Ubuntu 上装 libpam-pwquality,RHEL 系装 libpwquality,然后修改对应的 PAM 配置文件。

6. 内核参数调优:三种场景自己选

这是 LXSecure 里我个人觉得最有意思的部分。有些脚本是套用同一套内核参数,不管什么用途。但跑 Web 服务和跑数据库对内核的要求完全不一样(我这个其实是从宝塔面板的Linux工具箱插件中获得的灵感)。

我分了三种场景:

6.1 🛡️ 安全优先——适用于公网 Web 服务器、API 服务

开启的关键防护:

net.ipv4.tcp_syncookies = 1:防御 SYN flood 攻击

net.ipv4.conf.all.rp_filter = 1:防止 IP 欺骗

kernel.dmesg_restrict = 1:限制普通用户查看内核日志

kernel.kptr_restrict = 2:隐藏内核指针地址

kernel.randomize_va_space = 2:开启 ASLR(地址空间布局随机化)

net.ipv4.tcp_syn_retries = 2:减少 SYN 重试次数,降低半连接消耗

net.ipv4.tcp_fin_timeout = 15:缩短 FIN-WAIT 超时,快速释放连接

6.2 🚀 高性能——适用于数据库服务器、游戏服务器、高并发场景

优化的参数:

net.core.rmem_max = 16777216:接收缓冲区扩大到 16MB

net.core.wmem_max = 16777216:发送缓冲区扩大到 16MB

fs.file-max = 1000000:最大文件句柄数提升到 100 万

vm.swappiness = 10:减少磁盘交换,优先使用内存

net.core.somaxconn = 65535:增加监听队列长度

net.ipv4.tcp_max_syn_backlog = 65535:增加 SYN 队列长度

6.3 ⚖️ 均衡模式——适用于个人开发机、通用场景

在安全和性能之间取一个折中值,适合大多数情况。各项参数介于前两者之间。

这些参数会写入 /etc/sysctl.conf,然后执行 sysctl -p 生效。如果不知道选哪个,选安全优先就行——大部分场景够用了。以后发现性能不够,再单独跑这个模块切到高性能模式。

7. AIDE:给系统文件拍张快照

AIDE(Advanced Intrusion Detection Environment)是一个基于主机的入侵检测系统,用密码校验和来监控文件和目录的完整性。它做的事情简单说就是拍照。

7.1 工作原理

第一步是初始化数据库——扫描系统上指定的文件和目录,记录每个文件的哈希值(支持 MD5、SHA1、SHA256 等)、权限、大小、修改时间、访问时间、ctime,生成一个基线数据库。第二步是定期对比——把当前状态和基线数据库做对比,哪个文件变了、怎么变的,一目了然。

7.2 实际应用场景

假设有人黑进了你的服务器,替换了 /bin/ps 和 /bin/netstat,让你看不到他正在运行的进程。AIDE 会发现这两个文件的哈希值和初始记录不一样,发邮件告警。

7.3 使用注意事项

首次初始化会花几分钟,因为它要扫描整个文件系统。建议在系统刚装好、还没装太多软件的时候跑,这样基线数据库比较“干净”。如果等装了一堆服务之后再初始化,数据库里会包含大量正常文件的变化,排查起来更费劲。

AIDE 只做文件完整性检查,不检查 rootkit 也不解析日志文件。脚本里配置了每日自动检查,结果发到 root 邮箱。如果服务器上配了邮件转发就能收到通知。

初始化如果失败,大概率是因为 /etc/aide/aide.conf 里包含了不存在的目录。可以编辑配置文件把那些目录注释掉,或者手动创建空目录。这个问题在最小化安装的系统上比较常见。

8. auditd:内核级的审计日志

auditd 是 Linux 内核自带的审计系统,比应用层日志更底层、更可靠。

8.1 auditd 和 AIDE 的区别

这两个东西容易搞混。AIDE 是主动扫描,定期去检查文件有没有变化。auditd 是被动监听,内核层面实时记录谁在什么时候访问了哪些文件、执行了哪些命令。

8.2 脚本配置的审计规则

脚本会把规则写入 /etc/audit/rules.d/lxsecure.rules,用 augenrules –load 加载。主要监控几类东西:

关键文件的写操作:

/etc/passwd、/etc/shadow、/etc/group

/etc/sudoers

/etc/ssh/sshd_config

/etc/crontab

敏感系统调用:

execve(执行程序)

openat(打开文件)

mount(挂载文件系统)

用户管理命令的执行:

useradd、userdel、usermod

sudo 操作日志。

8.3 实际应用场景

举个例子。你发现服务器上多了一个你不知道的账户。去查 auditd 的日志,能看到这个账户是什么时候创建的、从哪个 IP 登录的、创建之前执行过哪些命令。这些信息能帮你判断是被入侵了还是同事误操作。

8.4 日志管理

auditd 的日志会占用磁盘空间。脚本里限制了日志缓冲区大小(-b 8192),但如果系统日志量很大,建议配置 logrotate 或者定期清理。一般生产环境会保留 30 天到 90 天的审计日志,看合规要求。

9. rkhunter + chkrootkit:扫 rootkit

这两个都是经典的 rootkit 检测工具,侧重点不太一样。

9.1 rkhunter(Rootkit Hunter)

rkhunter 主要靠特征库匹配,检查系统二进制文件有没有被篡改、有没有可疑的内核模块、/dev 目录下有没有异常文件。它有自己的数据库,安装之后需要先跑一次 rkhunter –propupd 来生成系统初始状态。能检测大约 58 个已知的 rootkit 和一些嗅探器和后门程序。

9.2 chkrootkit

chkrootkit 更侧重于检测已知 rootkit 的特征——某个 rootkit 会在系统里留下什么样的文件、什么样的进程、什么样的网络连接。它不需要初始化数据库,直接跑就行。

两个工具各有优缺点,搭配着用效果更好。脚本会把两个都装上,并配置 rkhunter 每日自动扫描。

10. 账户安全检查:空口令和 UID 0

这个模块只做检查和报告,不做任何修改。

10.1 空口令账户检查

查 /etc/shadow 里有没有密码字段为空的账户。空口令账户意味着任何人都可以不输入密码登录,如果存在这样的账户,脚本会列出来,需要手动处理。有些系统默认会有一些无密码的服务账户,但它们的 shell 是 /sbin/nologin,实际上不能登录,这种就不需要管。脚本只会列出来,让管理员自己判断。

10.2 UID 0 异常账户检查

查 /etc/passwd 里除了 root 还有没有其他账户的 UID 是 0。UID 0 是超级用户,拥有最高权限。如果自己没有创建过这样的账户,那可能是被人留的后门。

11. 自动安全更新:只装安全更新、不全量升级

全量升级在生产环境里是有风险的——可能会引入不兼容的变更,导致服务出问题。但安全更新不打又不行。

11.1 Debian/Ubuntu

用 unattended-upgrades,脚本配置只允许从 *-security 源安装更新,其他软件包版本保持不变。同时开启自动修复中断的 dpkg、自动删除不再需要的依赖。

11.2 RHEL 系

CentOS 8+/RHEL 8+ 用 dnf-automatic,CentOS 7 用 yum-cron,启用定时自动更新。

12. 关闭不必要服务:少一个服务就少一个漏洞

服务器上有很多默认开启但根本用不上的服务。脚本会禁用三个:

cups:打印服务

bluetooth:蓝牙

avahi-daemon:mDNS 广播

这些服务在桌面环境里有用,但在服务器上完全是多余的。少一个运行中的服务,就少一个可能被利用的漏洞入口。

13. Lynis:深度安全审计

Lynis 是一个开源的 Unix/Linux 安全审计工具,2007 年就有了,执行超过 2000 项配置检查。检查范围很广——系统配置、软件包管理、用户和组、文件系统、网络配置、SSH、Web 服务、数据库等等。

这个功能在脚本里是独立运行的,不包含在“全部加固”中。因为 Lynis 审计一次大概需要 10 到 20 分钟,适合单独执行做深度评估。审计结果会输出到 /var/log/lynis_audit.log,可以根据报告里的建议进一步优化系统配置。

14. 防锁死设计

写这个脚本的时候最看重的一个原则是:别把用户锁在门外。

改 SSH 端口也好、配置防火墙也好,最怕的就是操作失误导致 SSH 连不上。特别是对于新手,一旦连不上了就慌了。所以脚本里凡是有可能影响 SSH 连接的操作,都有保护措施:

1.改端口:先放行新端口 → 再改配置 → 最后重启服务

2.配置 UFW:先用 ufw allow 放行 SSH 端口 → 再执行 ufw enable

3.配置 iptables:先把默认策略设成 ACCEPT → 加完所有规则 → 最后把默认策略改成 DROP

这样就算某个步骤出错了,当前连接也不会断,还有机会进去检查和修复。

当然,如果用户改完端口之后自己手快把终端关了然后发现新端口连不上……那脚本也救不了。这种情况只能去 VPS 后台用 VNC。不过 VNC 算是最后的保险,所有 VPS 服务商都有这个功能。

15. 一些实操中踩过的坑

15.1 VPS 服务商的额外防火墙

改 SSH 端口之前,确认一下 VPS 服务商有没有额外防火墙。很多服务商在控制面板里还有一个独立的防火墙或者安全组,那个不归系统管——改了系统端口但面板防火墙没放行的话照样连不上。

15.2 Fail2ban 日志路径问题

Fail2ban 的日志在 /var/log/fail2ban.log,如果发现封禁不生效,去这里看。常见原因是日志路径不对,不同发行版 sshd 的日志位置不一样,需要确认 jail.local 里的 logpath 设置正确。

15.3 AIDE 初始化失败

AIDE 首次初始化如果失败,大概率是因为 /etc/aide/aide.conf 里包含了不存在的目录。可以编辑配置文件把那些目录注释掉,或者手动创建空目录。这个问题在最小化安装的系统上比较常见。

15.4 auditd 日志膨胀

auditd 的日志会占用磁盘空间。脚本里限制了日志缓冲区大小,但如果系统日志量很大,建议配置 logrotate 或者定期清理。一般生产环境会保留 30 天到 90 天的审计日志,看合规要求。

16. 怎么用

交互式管理(安装/卸载/状态/运行/更新)

bash <(curl \\-sSL https://raw.githubusercontent.com/gzy318/LXSecure/main/install.sh)

直接运行(不安装)

wget https://raw.githubusercontent.com/gzy318/LXSecure/main/lxsecure.sh
chmod +x lxsecure.sh
sudo ./lxsecure.sh

跑完之后会在当前目录生成一份安全报告,带时间戳,里面汇总了所有加固的结果,可以存着归档。

17.使用截图

安装脚本:

主脚本:

18. 项目地址

GitHub:https://github.com/gzy318/LXSecure

赞(0)
未经允许不得转载:网硕互联帮助中心 » 为了服务器安全加固那点事,我写了个脚本
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!