跳转至

Linux操作系统安全加固

概述

Linux 安全加固是提升系统抗攻击能力的关键措施,也是安全测试和等保合规的核心工作。本文从身份鉴别、访问控制、安全审计、漏洞补丁等多个维度,系统介绍了 Linux 系统的安全加固方法和实践。

Linux安全加固概述

什么是安全加固?

安全加固:在信息系统上线前或运行过程中,通过配置优化、漏洞修复、策略调整等技术手段,消除或减少系统的安全风险,提升系统的抗攻击能力。

加固的意义防患于未然。与其被攻击后紧急修复,不如提前做好防护,降低被攻击的概率和攻击成功后的损失。

基线检查

基线(Baseline):经过专家评审、实践验证的最低安全配置要求。

  • 阿里云安全基线:https://help.aliyun.com/document_detail/68386.html
  • 基线检查工具:自动化扫描系统配置是否符合安全基线要求

加固依据的标准

标准 全称 说明
GB/T 25070-2019 《信息安全技术 网络安全等级保护安全设计技术要求》 等保2.0安全设计标准
GB/T 36627-2018 《信息安全技术 网络安全等级保护测试评估技术指南》 等保测评指南

专业解读:中国的"网络安全等级保护制度"(简称"等保")是法律强制要求(《网络安全法》)。运营者应当按照要求开展等保定级、备案、测评、整改。等保2.0于2019年12月1日正式实施,覆盖范围从传统信息系统扩展到云计算、物联网、移动互联、工业控制等新兴领域。


身份鉴别加固

删除多余、无用账号

系统中存在的无用账号是潜在的安全风险点,攻击者可能利用这些账号进行枚举或暴力破解。

cat /etc/passwd                # 查看所有用户
cat /etc/shadow                # 查看密码状态
userdel xxx                    # 删除无用账号(-r同时删除主目录)

专业解读:应重点检查以下账号:测试账号、离职员工账号、共享账号、默认安装的应用账号(如test、guest、demo等)。

密码策略加固

检查空口令

空口令(无密码)账号是极大的安全隐患,任何人都可以直接登录。

# 查找/etc/shadow中密码字段为空的用户
awk -F: '($2 == ""){print $1}' /etc/shadow

# 为空口令用户设置密码
passwd xxx(用户名)

口令有效期配置

编辑 /etc/login.defs 文件,设置密码过期策略:

vim /etc/login.defs
参数 说明 建议值
PASS_MAX_DAYS 密码最长有效期(天数) 90
PASS_MIN_DAYS 密码最短有效期(天数) 7
PASS_MIN_LEN 密码最小长度 8
PASS_WARN_AGE 密码过期前多少天开始提醒用户 7

专业解读login.defs 只对新创建的用户生效。已存在的用户需要用 chage 命令修改:

chage -M 90 -m 7 -W 7 username

口令强度策略

通过PAM(Pluggable Authentication Modules,可插拔认证模块)强制密码复杂度。

编辑 /etc/pam.d/system-auth

vim /etc/pam.d/system-auth

# 添加或修改以下行:
password requisite pam_cracklib.so retry=3 difok=2 minlen=8 lcredit=-1 dcredit=-1 ucredit=-1 ocredit=-1
参数 说明
retry=3 密码修改时最多允许尝试3次
difok=2 新密码与旧密码至少要有2个字符不同
minlen=8 密码最小长度为8位(此配置优先于login.defs)
ucredit=-1 至少包含1个大写字母
lcredit=-1 至少包含1个小写字母
dcredit=-1 至少包含1个数字
ocredit=-1 至少包含1个特殊字符

专业解读:PAM是Linux的统一认证框架,/etc/pam.d/ 目录下的文件定义了各种服务的认证策略。pam_cracklib.so 会检查密码是否基于字典单词,防止设置过于简单的密码(如password123)。

登录失败策略

防止暴力破解密码,需限制登录失败次数并设置锁定时间。

编辑 /etc/pam.d/sshd(针对SSH登录):

vim /etc/pam.d/sshd

# 在第一行下方添加:
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=1800
参数 说明
deny=3 连续失败3次后锁定账号
unlock_time=300 普通用户锁定300秒(5分钟)后自动解锁
even_deny_root 对root用户也生效(否则攻击者会专门爆破root)
root_unlock_time=1800 root用户锁定1800秒(30分钟)后自动解锁

手动解锁用户

pam_tally2 --user=root --reset   # 重置root用户的失败计数,立即解锁
pam_tally2 -u username -r        # 解锁指定用户

专业解读:pam_tally2在较新系统中已被 pam_faillock 取代。CentOS 8/RHEL 8应使用:

auth required pam_faillock.so preauth silent audit deny=3 unlock_time=300
auth required pam_faillock.so authfail audit deny=3 unlock_time=300


访问控制加固

IP访问控制

通过TCP Wrappers机制限制哪些IP可以访问SSH服务。

允许访问的IP

编辑 /etc/hosts.allow

sshd:192.168.1.*:allow        # 允许192.168.1.x网段SSH访问
sshd:192.168.1.74:allow       # 允许特定IP访问
sshd:all:allow                  # 允许所有IP(不推荐)

拒绝访问的IP

编辑 /etc/hosts.deny

sshd:all:deny                   # 拒绝所有IP(配合hosts.allow使用,白名单模式)
sshd:47.106.218.*:deny          # 拒绝特定网段
sshd:192.168.1.74:deny        # 拒绝特定IP

专业解读: - TCP Wrappers按照 先allow后deny 的顺序匹配 - 如果 hosts.allow 匹配成功,则直接允许,不再检查 hosts.deny - 生产环境推荐白名单模式hosts.deny 中写 sshd:all:deny,只在 hosts.allow 中放行信任的IP - 配置完成后需重启SSH服务:systemctl restart sshd

防范端口扫描

攻击者通常通过端口扫描探测目标开放的端口和服务。

关闭不必要的服务

systemctl list-unit-files | grep enable    # 查看所有开机自启的服务
systemctl stop xxx                         # 停止不需要的服务
systemctl disable xxx                      # 禁止开机自启

修改默认端口号: 将SSH的默认22端口改为其他端口,可以减少自动化攻击。

vim /etc/ssh/sshd_config
# 修改:Port 2222

systemctl restart sshd

专业解读:修改SSH端口是"安全模糊化"(Security through Obscurity)手段,不能替代强密码或密钥认证,但确实能过滤掉大部分自动化扫描攻击。

防火墙策略(iptables)

除了firewalld,也可使用iptables配置更细粒度的规则:

# 防范特定类型的端口扫描(FIN/URG/PSH扫描、SYN/RST扫描等)
-A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j REJECT
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j REJECT
-A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j REJECT

专业解读:现代CentOS 7/8默认使用firewalld作为iptables的前端,但底层仍然是netfilter框架。iptables 命令直接操作规则,重启后失效(除非保存)。firewalld使用zone概念管理规则,更易于维护。

root权限控制

root账号是Linux系统的最高权限账号,必须严格控制。

禁止root用户远程登录

vim /etc/ssh/sshd_config

# 修改或添加:
PermitRootLogin no

systemctl restart sshd

专业解读:禁止root远程登录后,管理员应先以普通用户登录,再通过 su -sudo 切换到root。这样即使普通用户密码泄露,攻击者还需知道root密码才能提权,增加了攻击难度。

禁止其他用户su提权

限制只有wheel组的用户才能使用su切换到root:

vim /etc/pam.d/su

# 确保包含以下两行:
auth sufficient pam_rootok.so
auth required pam_wheel.so group=wheel

然后将允许提权的用户加入wheel组:

usermod -G wheel username

禁止其他用户sudo提权

通过 visudo 精细控制sudo权限:

visudo

# 仅允许特定用户执行特定命令:
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

禁止SUID提权

SUID(Set User ID)是一种特殊权限,允许普通用户以文件所有者的身份执行该文件。

# 查找系统上所有root拥有的SUID文件
find / -user root -perm -4000 -print 2>/dev/null

# 移除不必要的SUID权限
chmod ugo-s /usr/bin/some_command

专业解读:SUID是权限提升(Privilege Escalation)的常见利用点。经典的例子:/usr/bin/passwd 有SUID权限(-rwsr-xr-x),普通用户可以用它修改自己的密码(需要写入/etc/shadow,而普通用户无写权限)。如果自定义程序错误地设置了SUID且存在漏洞,攻击者可能借此提权到root。


安全审计加固

auditd审计

auditd是Linux内核的审计子系统,可以详细记录系统中发生的安全相关事件。

功能: - 监控文件和目录的访问、修改、删除 - 记录系统调用 - 记录用户登录注销行为 - 追踪命令执行

日志位置/var/log/audit/audit.log

# 查看audit日志
ausearch -h                    # 查看帮助
ausearch -f /etc/passwd        # 查找与/etc/passwd相关的事件
ausearch -u username           # 查找特定用户的审计记录
ausearch -ts today             # 查找今天的记录

专业解读:auditd配置复杂但功能强大,常用于等保合规、入侵溯源。配置规则文件在 /etc/audit/rules.d/。启用auditd会对系统性能有一定影响,需根据实际需求配置监控范围,避免过度审计。

参考资料: - https://docs.oracle.com/zh-cn/learn/ol-auditd/ - https://blog.csdn.net/m0_74282605/article/details/128718297


漏洞补丁加固

及时更新软件

软件漏洞是攻击者入侵系统的主要途径之一,必须建立及时的补丁更新机制。

yum check-update               # 列出可更新的软件清单
yum info updates               # 列出可更新软件包的详细信息
yum updateinfo list updates security   # 列出可用的安全补丁
yum upgrade 包名                # 升级指定软件
yum update                     # 升级系统版本和所有软件(谨慎使用)

内核升级

内核漏洞影响最大,因为内核拥有最高权限。

# 更新到最新内核(需安装elrepo源)
yum --enablerepo=elrepo-kernel install kernel-lt -y

专业解读: - 内核升级后,需要重启系统才能使用新内核 - 新内核可能存在兼容性问题,生产环境建议在测试环境验证后再部署 - 保留旧内核:修改 /etc/default/grub 设置默认启动项,确保新内核有问题时可以回退


常见安全产品

安全产品分类

类别 产品 功能
主机安全 主机杀毒(EDR) 恶意软件检测与清除、进程行为监控
漏洞管理 漏洞扫描器 自动发现系统漏洞、配置弱点
边界防护 防火墙、WAF 网络层/应用层流量过滤
入侵检测 IDS / IPS 检测/阻断入侵行为
运维安全 堡垒机 统一运维入口、操作审计、权限管控
威胁感知 态势感知平台 全网安全态势监控、关联分析
DDoS防护 抗DDoS设备/云服务 大流量攻击清洗
欺骗防御 蜜罐 诱捕攻击者、收集攻击手法

2022中国网络安全产业全景图: https://www.freebuf.com/articles/339788.html

专业解读:企业安全建设应遵循"纵深防御"(Defense in Depth)理念,在网络边界、主机、应用、数据等多个层面部署防护措施,不依赖单一产品。等保2.0要求的安全设备包括:防火墙、入侵防范、恶意代码防范、日志审计、数据备份等。


加固清单和脚本

基线配置文档

linux基线配置文档2.2.docx — 包含详细的加固检查项和配置标准。

自动化加固脚本

脚本 用途
CentOS_Check_Script.sh 基线检查脚本,扫描系统配置是否符合安全要求
CentOS_Protective_Script.sh 自动执行加固措施
linuxcheeklist2.2.sh 综合检查脚本

专业解读:自动化脚本可以大幅提高加固效率,但不能直接在生产环境运行,必须先阅读脚本内容,理解每一步操作,在测试环境验证无误后再部署。脚本可能因系统版本差异导致意外问题。


课后作业

  1. 对各个配置项进行测试验证:在虚拟机中实际配置密码策略、登录失败锁定、SSH安全选项等,验证效果。
  2. 整理本节课笔记:梳理身份鉴别、访问控制、安全审计、入侵防范各模块的关键配置。
  3. 如有需要,对相关内容进行拓展学习:深入了解PAM机制、SELinux、AppArmor等高级安全机制。

安全测试视角:加固与攻击的博弈 安全加固和渗透测试是安全领域的两个侧面。理解加固措施有助于渗透测试人员评估目标安全性,同时渗透测试结果也指导加固方向: - 基线检查 vs 漏洞扫描:基线检查关注配置合规性,漏洞扫描关注已知漏洞。两者结合才能全面评估系统安全状况 - 红队与蓝队:红队(攻击方)模拟真实攻击者测试防御有效性,蓝队(防御方)负责检测和响应。Linux 安全加固是蓝队的基础能力建设 - 攻击面管理:加固的本质是持续缩小攻击面。每关闭一个不必要的服务、每限制一个权限,都在增加攻击者的成本

安全测试视角:等保合规与渗透测试 等保 2.0 要求开展定期安全测评,其中渗透测试是重要组成部分: - 等保二级:需要开展漏洞扫描和渗透测试 - 等保三级:需要开展深度渗透测试,包括内网横向移动测试 - 测试范围:不仅包括操作系统,还包括应用、数据库、网络设备等 - 测试边界:明确渗透测试的授权范围和时间窗口,避免对生产业务造成影响

在安全测试工作中,熟练掌握 Linux 系统的配置、漏洞和加固方法,是开展有效渗透测试的基础能力。