本文来自我的个人博客为了服务器安全加固那点事我写了个脚本一台新服务器上线后会发生什么前几天买了台雨云的服务器第二天打开终端看一眼/var/log/auth.log。上线不到半小时里面已经躺了上百条Failed password。IP 来自俄罗斯、越南、美国、荷兰还有几个我连名字都叫不上来的地方就是如此神秘呵呵可以拿来补习地理知识了。它们不挑时间凌晨三点也在扫周末也不休息。大部分是字典攻击挨个试 root、admin、user、test 这类弱口令。其实我觉得啊你的服务器只要有一个公网 IP就已经在别人的扫描名单上了。不是“可能会被攻击”是“正在被攻击”。所以每次新机器到手我都会花十几分钟做一遍安全加固改 SSH 端口、关密码登录、装 Fail2ban、配防火墙、设密码策略、查空口令账户……说难不算难每个步骤单独拎出来也就一两行命令。但做多了就腻了。当然如果你安装了宝塔面板等可以很轻松的在面板操作但是不是每个服务器都会安装宝塔面板吧。有时候忙起来忘了做某个步骤过几天想起来再去看日志已经被人扫了几天了。这次趁着有空我把这些事情整理成了一个脚本叫LXSecure。放 GitHub 上了https://github.com/gzy318/LXSecure1. LXSecure 是什么、能做什么简单说就是把安全加固的那些操作按顺序自动化了。一共14 个功能模块每一个都可以单独运行也可以一键全部跑完。用的时候有一个菜单界面选数字就行不需要记任何命令。支持 Debian/Ubuntu、CentOS/RHEL 7、Rocky Linux、AlmaLinux 这些主流发行版。完整功能列表编号功能0退出1系统更新2SSH 安全加固3防火墙配置4Fail2ban5密码策略6文件权限加固7内核参数多场景8审计日志9恶意软件扫描10账户安全检查11AIDE 文件完整性12生成安全报告13自动安全更新14关闭不必要服务15Lynis 安全审计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 300300 秒无活动发送心跳包检测连接是否存活3.ClientAliveCountMax 2心跳包超时 2 次就断开连接4.LogLevel VERBOSE记录更详细的登录日志便于事后追溯2.5 实操建议万一新端口连不上请 VNC 救援模式进去修复——所有 VPS 服务商都有这个功能。3. 防火墙配置自动适配、只管放行需要的端口不同 Linux 发行版用的防火墙工具不一样——Ubuntu 默认是 UFWCentOS 7 是 Firewalld老系统可能是原生 iptables。脚本会先检测系统里装了什么然后用对应的方式配置。默认只开放三个端口SSH 端口就是你刚改的那个、80 和 443。其他端口全部关闭。配置的时候脚本会问要不要额外放行其他端口比如 8080、3306 之类的按需添加就行。UFW 启用之前会先把 SSH 端口放行掉——先放行再启用不会出现启用防火墙后把自己踢出去的情况。4. Fail2ban盯着认证日志封 IPFail2ban 的原理很简单盯着认证日志看同一个 IP 如果在短时间内失败次数太多就调用防火墙把它封掉。它和防火墙是配合关系——防火墙定义哪些端口能进Fail2ban 在防火墙里动态添加黑名单。脚本配置了两个 jail1.sshd5 次失败封 1 小时2.sshd-ddos10 次失败封 2 小时为什么要配两个有些攻击是分布式的单个 IP 失败次数不多但整体数量很大sshd-ddos 就是针对这种情况。Fail2ban 的配置文件在/etc/fail2ban/jail.local。如果发现某个 IP 段持续在扫可以手动把bantime改成 8640024 小时甚至更长。日志在/var/log/fail2ban.log封禁不生效的时候去这里看原因。常见问题是日志路径不对——不同发行版 sshd 的日志位置不一样需要确认jail.local里的logpath设置正确。5. 密码策略改 login.defs 和 PAM多用户服务器上密码策略是绕不开的。脚本会改/etc/login.defs里的四个参数1.PASS_MAX_DAYS90 天密码到期必须改2.PASS_MIN_DAYS2 天不能频繁改回旧密码3.PASS_MIN_LEN8 位4.PASS_WARN_AGE7 天到期前提醒同时通过 PAM 模块配置密码复杂度——必须包含大小写字母、数字和特殊字符。Debian/Ubuntu 上装libpam-pwqualityRHEL 系装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接收缓冲区扩大到 16MBnet.core.wmem_max 16777216发送缓冲区扩大到 16MBfs.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给系统文件拍张快照AIDEAdvanced 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、usermodsudo 操作日志。8.3 实际应用场景举个例子。你发现服务器上多了一个你不知道的账户。去查 auditd 的日志能看到这个账户是什么时候创建的、从哪个 IP 登录的、创建之前执行过哪些命令。这些信息能帮你判断是被入侵了还是同事误操作。8.4 日志管理auditd 的日志会占用磁盘空间。脚本里限制了日志缓冲区大小-b 8192但如果系统日志量很大建议配置 logrotate 或者定期清理。一般生产环境会保留 30 天到 90 天的审计日志看合规要求。9. rkhunter chkrootkit扫 rootkit这两个都是经典的 rootkit 检测工具侧重点不太一样。9.1 rkhunterRootkit Hunterrkhunter 主要靠特征库匹配检查系统二进制文件有没有被篡改、有没有可疑的内核模块、/dev目录下有没有异常文件。它有自己的数据库安装之后需要先跑一次rkhunter --propupd来生成系统初始状态。能检测大约 58 个已知的 rootkit 和一些嗅探器和后门程序。9.2 chkrootkitchkrootkit 更侧重于检测已知 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-automaticCentOS 7 用yum-cron启用定时自动更新。12. 关闭不必要服务少一个服务就少一个漏洞服务器上有很多默认开启但根本用不上的服务。脚本会禁用三个cups打印服务bluetooth蓝牙avahi-daemonmDNS 广播这些服务在桌面环境里有用但在服务器上完全是多余的。少一个运行中的服务就少一个可能被利用的漏洞入口。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 enable3.配置 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. 项目地址GitHubhttps://github.com/gzy318/LXSecure
为了服务器安全加固那点事,我写了个脚本
本文来自我的个人博客为了服务器安全加固那点事我写了个脚本一台新服务器上线后会发生什么前几天买了台雨云的服务器第二天打开终端看一眼/var/log/auth.log。上线不到半小时里面已经躺了上百条Failed password。IP 来自俄罗斯、越南、美国、荷兰还有几个我连名字都叫不上来的地方就是如此神秘呵呵可以拿来补习地理知识了。它们不挑时间凌晨三点也在扫周末也不休息。大部分是字典攻击挨个试 root、admin、user、test 这类弱口令。其实我觉得啊你的服务器只要有一个公网 IP就已经在别人的扫描名单上了。不是“可能会被攻击”是“正在被攻击”。所以每次新机器到手我都会花十几分钟做一遍安全加固改 SSH 端口、关密码登录、装 Fail2ban、配防火墙、设密码策略、查空口令账户……说难不算难每个步骤单独拎出来也就一两行命令。但做多了就腻了。当然如果你安装了宝塔面板等可以很轻松的在面板操作但是不是每个服务器都会安装宝塔面板吧。有时候忙起来忘了做某个步骤过几天想起来再去看日志已经被人扫了几天了。这次趁着有空我把这些事情整理成了一个脚本叫LXSecure。放 GitHub 上了https://github.com/gzy318/LXSecure1. LXSecure 是什么、能做什么简单说就是把安全加固的那些操作按顺序自动化了。一共14 个功能模块每一个都可以单独运行也可以一键全部跑完。用的时候有一个菜单界面选数字就行不需要记任何命令。支持 Debian/Ubuntu、CentOS/RHEL 7、Rocky Linux、AlmaLinux 这些主流发行版。完整功能列表编号功能0退出1系统更新2SSH 安全加固3防火墙配置4Fail2ban5密码策略6文件权限加固7内核参数多场景8审计日志9恶意软件扫描10账户安全检查11AIDE 文件完整性12生成安全报告13自动安全更新14关闭不必要服务15Lynis 安全审计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 300300 秒无活动发送心跳包检测连接是否存活3.ClientAliveCountMax 2心跳包超时 2 次就断开连接4.LogLevel VERBOSE记录更详细的登录日志便于事后追溯2.5 实操建议万一新端口连不上请 VNC 救援模式进去修复——所有 VPS 服务商都有这个功能。3. 防火墙配置自动适配、只管放行需要的端口不同 Linux 发行版用的防火墙工具不一样——Ubuntu 默认是 UFWCentOS 7 是 Firewalld老系统可能是原生 iptables。脚本会先检测系统里装了什么然后用对应的方式配置。默认只开放三个端口SSH 端口就是你刚改的那个、80 和 443。其他端口全部关闭。配置的时候脚本会问要不要额外放行其他端口比如 8080、3306 之类的按需添加就行。UFW 启用之前会先把 SSH 端口放行掉——先放行再启用不会出现启用防火墙后把自己踢出去的情况。4. Fail2ban盯着认证日志封 IPFail2ban 的原理很简单盯着认证日志看同一个 IP 如果在短时间内失败次数太多就调用防火墙把它封掉。它和防火墙是配合关系——防火墙定义哪些端口能进Fail2ban 在防火墙里动态添加黑名单。脚本配置了两个 jail1.sshd5 次失败封 1 小时2.sshd-ddos10 次失败封 2 小时为什么要配两个有些攻击是分布式的单个 IP 失败次数不多但整体数量很大sshd-ddos 就是针对这种情况。Fail2ban 的配置文件在/etc/fail2ban/jail.local。如果发现某个 IP 段持续在扫可以手动把bantime改成 8640024 小时甚至更长。日志在/var/log/fail2ban.log封禁不生效的时候去这里看原因。常见问题是日志路径不对——不同发行版 sshd 的日志位置不一样需要确认jail.local里的logpath设置正确。5. 密码策略改 login.defs 和 PAM多用户服务器上密码策略是绕不开的。脚本会改/etc/login.defs里的四个参数1.PASS_MAX_DAYS90 天密码到期必须改2.PASS_MIN_DAYS2 天不能频繁改回旧密码3.PASS_MIN_LEN8 位4.PASS_WARN_AGE7 天到期前提醒同时通过 PAM 模块配置密码复杂度——必须包含大小写字母、数字和特殊字符。Debian/Ubuntu 上装libpam-pwqualityRHEL 系装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接收缓冲区扩大到 16MBnet.core.wmem_max 16777216发送缓冲区扩大到 16MBfs.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给系统文件拍张快照AIDEAdvanced 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、usermodsudo 操作日志。8.3 实际应用场景举个例子。你发现服务器上多了一个你不知道的账户。去查 auditd 的日志能看到这个账户是什么时候创建的、从哪个 IP 登录的、创建之前执行过哪些命令。这些信息能帮你判断是被入侵了还是同事误操作。8.4 日志管理auditd 的日志会占用磁盘空间。脚本里限制了日志缓冲区大小-b 8192但如果系统日志量很大建议配置 logrotate 或者定期清理。一般生产环境会保留 30 天到 90 天的审计日志看合规要求。9. rkhunter chkrootkit扫 rootkit这两个都是经典的 rootkit 检测工具侧重点不太一样。9.1 rkhunterRootkit Hunterrkhunter 主要靠特征库匹配检查系统二进制文件有没有被篡改、有没有可疑的内核模块、/dev目录下有没有异常文件。它有自己的数据库安装之后需要先跑一次rkhunter --propupd来生成系统初始状态。能检测大约 58 个已知的 rootkit 和一些嗅探器和后门程序。9.2 chkrootkitchkrootkit 更侧重于检测已知 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-automaticCentOS 7 用yum-cron启用定时自动更新。12. 关闭不必要服务少一个服务就少一个漏洞服务器上有很多默认开启但根本用不上的服务。脚本会禁用三个cups打印服务bluetooth蓝牙avahi-daemonmDNS 广播这些服务在桌面环境里有用但在服务器上完全是多余的。少一个运行中的服务就少一个可能被利用的漏洞入口。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 enable3.配置 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. 项目地址GitHubhttps://github.com/gzy318/LXSecure