1. 项目概述与核心价值
最近在帮几个朋友的公司做安全巡检,发现一个挺普遍的现象:很多运维兄弟把Linux主机上线后,除了改个root密码,基本就放着不管了。等到等保测评或者被安全扫描工具扫出一堆“高危”漏洞时,才手忙脚乱地开始“整改”。这种“救火式”的安全加固,往往事倍功半,还容易引入新的问题。今天,我就结合2024年最新的威胁态势和自己在甲方、乙方多年的实战经验,系统性地聊聊Linux主机安全加固这件事。这不仅仅是应付检查的“整改清单”,更是一套可以融入日常运维流程的主动防御体系。无论你是负责几十台服务器的小团队运维,还是管理上万节点的大厂SRE,相信这套从身份鉴别、访问控制、入侵防范到安全审计的完整思路,都能给你带来实实在在的参考价值。
安全加固不是一劳永逸的“银弹”,而是一个持续的过程。它的核心价值在于,通过一系列可配置、可验证的技术手段,将主机的安全基线从“能用”提升到“抗揍”的水平,显著增加攻击者的成本和难度,为业务系统的稳定运行构建坚实的地基。接下来,我们就抛开那些华而不实的概念,直接进入实操环节,看看如何一步步打造一台“硬核”的Linux主机。
2. 安全加固的核心思路与设计原则
在动手敲命令之前,我们必须先理清思路。盲目的“加固”可能会破坏服务的兼容性,甚至导致业务中断。我总结的安全加固核心思路是 “最小权限、纵深防御、持续监控” 。
最小权限原则 是基石。它要求系统中的每个程序、每个用户都只拥有完成其任务所必需的最小权限。举个例子,一个负责备份的脚本,它只需要对特定目录有读权限,以及写入备份存储位置的写权限,绝不应该拥有root权限。在实践中,这意味着我们要精细地配置用户权限、文件权限和服务权限。
纵深防御原则 意味着不要只依赖一层防护。想象一下城堡,它有护城河、高墙、哨塔和內城。在主机安全里,这对应着网络防火墙、主机防火墙、服务自身配置、文件完整性校验等多个层次。即使攻击者突破了外层防线(如网络ACL),內层的防护(如SELinux/AppArmor)依然能发挥作用,限制其破坏范围。
持续监控原则 承认没有绝对的安全。加固后的系统状态是否会因为软件更新、配置变更或恶意攻击而改变?我们需要通过日志审计、文件完整性检查、入侵检测系统(如AIDE, OSSEC)等手段,持续地感知系统的安全状态,一旦发现异常能快速响应。
基于这些原则,本次加固将围绕以下几个核心层面展开,它们共同构成一个立体的防御网:
- 身份鉴别与访问控制 :确保只有合法用户能以正确的方式访问系统。
- 服务与端口最小化 :减少暴露在外的攻击面。
- 系统与内核安全强化 :利用操作系统自身的安全机制。
- 日志审计与入侵检测 :建立有效的监控和追溯能力。
- 漏洞管理与应急响应 :建立补丁管理和事件处理流程。
整个设计遵循“先评估、后整改、再验证”的流程。在动手前,强烈建议先对系统进行一次全面的基线检查,可以使用像 lynis 这样的开源审计工具,生成一份详细的报告,这样我们的加固工作才能有的放矢。
3. 身份鉴别与访问控制强化实操
这是防御的第一道大门,如果门禁形同虚设,后面再坚固的城墙也意义不大。这一部分我们主要解决“谁可以进来”和“进来后能干什么”的问题。
3.1 密码策略与PAM模块配置
默认的密码策略往往过于宽松。我们需要通过 /etc/login.defs 和PAM(可插拔认证模块)来强化它。
首先,编辑 /etc/login.defs ,设定全局密码策略:
PASS_MAX_DAYS 90 # 密码最长使用90天
PASS_MIN_DAYS 7 # 密码最短使用7天后才允许更改
PASS_MIN_LEN 12 # 密码最小长度12位
PASS_WARN_AGE 14 # 密码过期前14天开始警告
这个文件对新创建的用户生效。对于已存在的用户,需要使用 chage 命令逐一修改,例如 chage -M 90 -m 7 -W 14 username 。
更精细的控制在PAM中。编辑 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 文件(具体文件名可能因发行版而异,如RHEL/CentOS 7+是 /etc/pam.d/password-auth 和 /etc/pam.d/system-auth ,Ubuntu/Debian可能集成在 /etc/pam.d/common-* 中)。我们需要在 password 模块部分添加密码复杂度规则。
一个常见的配置是使用 pam_pwquality 模块(旧版可能是 pam_cracklib ):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password requisite pam_pwquality.so minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
参数解释:
-
minlen=12: 最小长度12。 -
lcredit=-1: 至少包含1个小写字母。 -
ucredit=-1: 至少包含1个大写字母。 -
dcredit=-1: 至少包含1个数字。 -
ocredit=-1: 至少包含1个特殊字符。 -
enforce_for_root: 对root用户同样生效。 -
retry=3: 密码设置失败重试3次。
实操心得 :修改PAM配置是高风险操作,务必先在测试环境验证,并确保有一个活跃的root会话(如通过Console或另一个未退出的SSH连接)以防配置错误导致所有用户无法登录。修改后,立即用
su或新建一个会话测试密码策略是否生效。
3.2 SSH服务安全加固
SSH是远程管理的命脉,也是攻击者最常攻击的入口。加固SSH是重中之重。配置文件位于 /etc/ssh/sshd_config 。
关键配置项与解释:
Port 2222 # 修改默认22端口,可减少自动化扫描攻击(但非绝对安全,需结合防火墙)
PermitRootLogin no # 禁止root用户直接登录,必须通过普通用户su或sudo提权
PubkeyAuthentication yes # 启用公钥认证
PasswordAuthentication no # 禁用密码认证,强制使用密钥对(最有效的加固手段之一)
PermitEmptyPasswords no # 禁止空密码登录
MaxAuthTries 3 # 最大认证尝试次数,防止暴力破解
ClientAliveInterval 300 # 客户端活跃检测间隔300秒
ClientAliveCountMax 2 # 客户端无响应最大次数,超过则断开连接(300*2=600秒后断开空闲连接)
AllowUsers user1 user2@192.168.1.0/24 # 仅允许特定用户(或从特定IP)登录,白名单机制
Protocol 2 # 强制使用SSH协议版本2
修改后执行 systemctl reload sshd 或 service sshd reload 使配置生效(不是restart,避免断开现有连接)。
关于密钥对: 禁用密码登录的前提是必须正确部署公钥。在客户端生成密钥对: ssh-keygen -t ed25519 -C “your_email@example.com” (ed25519算法比传统的RSA更安全高效)。将生成的 id_ed25519.pub 内容追加到服务器的 ~/.ssh/authorized_keys 文件中,并确保该文件权限为


347

被折叠的 条评论
为什么被折叠?



