本文来自我的个人博客:为了服务器安全加固那点事,我写了个脚本
一台新服务器上线后会发生什么
前几天买了台雨云的服务器,第二天打开终端看一眼 /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
网硕互联帮助中心




评论前必须登录!
注册