Linux安全机制--系统层安全机制
我们知道纵深防御体系,如下图所示
系统的安全机制也是类似于此体系,接下来我们讲述系统层面的安全机制Linux 系统层安全机制是保障系统稳定运行、抵御恶意攻击的核心防线,我们讲述基础支撑模块,涵盖用户管理,软件包管理,文件系统管理。
一、用户管理
用户是系统访问的 “入口”,用户管理安全的核心目标是:避免非法账号创建、防止权限滥用、追溯用户操作,从源头减少身份相关的安全风险。
1. 账号生命周期管理:全流程管控账号状态
非法账号(如黑客后门账号)、僵尸账号(长期未使用)是系统安全的重大隐患,需通过 “创建 - 使用 - 禁用 - 删除” 全生命周期管控,确保账号 “按需存在、最小权限”。
生命周期阶段 | 安全要求 | 配置实践 |
---|---|---|
账号创建 | 禁止空密码、强制归属安全组、分配最小 UID/GID | - 创建用户时指定组:useradd -g 普通组 -G 附加组 用户名 (避免默认组混乱)- 强制设置密码:passwd 用户名 (结合 PAM 策略,拒绝弱密码)- 禁止 UID=0 非 root 账号:grep -w "0" /etc/passwd (仅保留 root:x:0:0:... ) |
账号使用 | 限制登录时间 / IP、禁止共享账号、定期活跃度检查 | - 限制登录 IP:编辑 /etc/security/access.conf ,添加 + : 用户名 : 192.168.1.0/24 (仅允许指定网段登录)- 检查僵尸账号:lastlog (查看用户最后登录时间,对 6 个月未登录账号执行禁用) |
账号禁用 / 删除 | 离职 / 停用账号立即禁用,避免直接删除(保留审计痕迹) | - 禁用账号:usermod -L 用户名 (锁定密码,无法登录)或 usermod -s /sbin/nologin 用户名 (禁止 shell 登录)- 彻底删除:userdel -r 用户名 (-r 同时删除家目录和邮件,避免残留数据) |
2. 密码安全强化:抵御暴力破解与弱密码
弱密码(如 123456
、password
)是账号被破解的主要原因,需通过 “复杂度 - 有效期 - 历史限制” 三重策略,强制用户使用安全密码。
(1)密码策略配置(依托 /etc/login.defs
与 PAM)
- 核心配置文件:
/etc/login.defs
(全局密码默认策略),结合 PAM 的pam_cracklib.so
实现细粒度控制。 - 关键参数与作用:
# /etc/login.defs 核心参数 PASS_MAX_DAYS 90 # 密码最大有效期(90天,到期强制修改) PASS_MIN_DAYS 7 # 密码修改间隔(7天内不允许重复修改,防止频繁变更绕过审计) PASS_MIN_LEN 8 # 密码最小长度(与 PAM 策略叠加,取更严格值) PASS_WARN_AGE 7 # 密码到期前7天开始提醒用户
- 禁止密码复用:通过 PAM 的
pam_pwhistory.so
限制使用历史密码,编辑/etc/pam.d/system-auth
:password requisite pam_pwhistory.so remember=5 # 禁止使用最近5次用过的密码
(2)防御暴力破解:限制登录失败次数
通过 PAM 的 pam_tally2.so
或 fail2ban
工具,对多次登录失败的账号 / IP 进行锁定,防止暴力破解。
- 临时锁定账号(pam_tally2):编辑
/etc/pam.d/login
(本地登录)和/etc/pam.d/sshd
(SSH 登录),添加:# 登录失败5次锁定10分钟(even_deny_root 表示root也受限制) auth required pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=600
- 查看 / 解锁账号:
pam_tally2 -u 用户名
(查看失败次数)、pam_tally2 -u 用户名 -r
(重置失败次数,解锁账号)。
3. 特权用户管控:限制 root 权限滥用
root
账号拥有系统最高权限,一旦泄露或滥用,后果严重。需通过 “禁止直接登录 - 细分权限 - 操作审计” 限制 root
权限。
(1)禁止 root 直接登录 SSH
SSH 是远程管理的主要方式,禁止 root
直接登录,强制通过普通用户 +sudo
提权,减少 root
账号暴露风险。
- 配置
/etc/ssh/sshd_config
:PermitRootLogin no # 禁止root直接登录 AllowUsers 普通用户名 # 仅允许指定普通用户登录(可选,进一步缩小范围)
- 生效:
systemctl restart sshd
。
(2)通过 sudo 细分权限(最小权限原则)
sudo
允许普通用户在指定范围内执行特权命令,避免直接授予 root
密码。核心是通过 /etc/sudoers
配置精细化权限。
- 安全配置示例(编辑
/etc/sudoers
,需用visudo
命令避免语法错误):# 允许 user1 执行 /sbin/service、/bin/systemctl(管理服务),无需输入密码 user1 ALL=(ALL) NOPASSWD: /sbin/service, /bin/systemctl# 禁止 user2 执行 /usr/bin/passwd root(防止修改root密码) user2 ALL=(ALL) !/usr/bin/passwd root# 限制 user3 仅在 192.168.1.100 主机执行特权命令 user3 192.168.1.100=(ALL) ALL
- 审计 sudo 操作:
sudo
操作默认记录到/var/log/secure
(RHEL/CentOS)或/var/log/auth.log
(Debian/Ubuntu),可通过grep "sudo" /var/log/secure
追溯操作。
二、软件包管理
软件包(如 nginx
、openssl
)是系统运行的核心组件,其安全风险主要来自 “来源不可信 - 版本有漏洞 - 被篡改”。软件包管理安全的目标是:仅安装可信来源、无漏洞的软件,防止恶意软件植入。
1. 软件源安全:仅信任官方 / 验证源
第三方软件源可能包含恶意软件或篡改的包,需优先使用发行版官方源,并启用 GPG 签名验证,确保软件包完整性和来源可信。
(1)配置官方源,禁用第三方源
- RHEL/CentOS(yum/dnf):
- 查看当前源:
yum repolist
,禁用非官方源:yum-config-manager --disable 第三方源ID
。 - 恢复官方源:通过
yum install centos-release
(CentOS)或订阅 RHEL 官方源,确保/etc/yum.repos.d/
下仅保留官方.repo
文件。
- 查看当前源:
- Debian/Ubuntu(apt):
- 编辑
/etc/apt/sources.list
,仅保留官方源地址(如 Ubuntu 官方源:deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
)。 - 禁用第三方源:注释
/etc/apt/sources.list.d/
下的非官方.list
文件。
- 编辑
(2)启用 GPG 签名验证(强制校验)
GPG 签名由发行版厂商签发,用于验证软件包是否被篡改。需确保包管理器强制校验签名,拒绝未签名或签名无效的包。
- yum/dnf 配置(
/etc/yum.conf
):gpgcheck=1 # 1:启用GPG校验;0:禁用(绝对禁止设置为0) repo_gpgcheck=1 # 1:校验源 metadata 的签名(防止源信息被篡改)
- apt 配置(
/etc/apt/apt.conf.d/99verify
):APT::Get::AllowUnauthenticated "false"; # 拒绝未认证的包 Acquire::AllowInsecureRepositories "false"; # 拒绝不安全的源(如 HTTP 源,优先 HTTPS)
- 导入官方 GPG 密钥(若校验失败,需重新导入):
- CentOS:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-8
。 - Ubuntu:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 官方密钥ID
。
- CentOS:
2. 软件包漏洞管理:定期更新与漏洞扫描
即使是官方源软件,也可能存在已知漏洞(如 OpenSSL 的 Heartbleed 漏洞),需通过 “定期更新 - 漏洞扫描 - 版本管控” 及时修复。
(1)定期更新软件包(修复已知漏洞)
- 安全更新优先:避免盲目全量更新(可能破坏兼容性),优先更新安全补丁。
- RHEL/CentOS:
yum update --security
(仅更新安全相关补丁)。 - Debian/Ubuntu:
apt update && apt upgrade -s
(-s
模拟更新,确认无风险后去掉-s
执行)。
- RHEL/CentOS:
- 自动化更新(服务器场景):使用
yum-cron
(RHEL/CentOS)或unattended-upgrades
(Debian/Ubuntu)自动安装安全更新,配置示例:- Ubuntu 启用自动安全更新:
apt install unattended-upgrades dpkg-reconfigure unattended-upgrades # 交互式启用,选择“是”
/etc/apt/apt.conf.d/50unattended-upgrades
,确保仅更新安全源:Unattended-Upgrade::Allowed-Origins {"${distro_id}:${distro_codename}-security"; # 仅安全更新 };
- Ubuntu 启用自动安全更新:
(2)软件包漏洞扫描
通过工具扫描已安装软件包的漏洞,生成修复建议,弥补 “定期更新” 可能遗漏的风险。
- 常用工具:yum-security /debsums/ OpenSCAP:
yum-security
(RHEL/CentOS):查看已安装包的漏洞:yum list-security --installed
。debsums
(Debian/Ubuntu):校验已安装包的文件完整性(检测是否被篡改):debsums -c
(-c
仅显示篡改的文件)。- OpenSCAP(跨发行版):基于安全基线扫描漏洞,生成报告:
yum install openscap-scanner scap-security-guide # 安装 oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_standard --report /tmp/scan-report.html /usr/share/xml/scap/ssg/content/ssg-centos8-ds.xml # 扫描并生成报告
3. 避免恶意软件:禁止安装未知包与源码编译风险
- 禁止安装未知来源包:不直接下载
rpm
/deb
包手动安装(如rpm -ivh 未知包.rpm
),若必须安装,需先校验 GPG 签名:- 校验 RPM 包:
rpm --checksig 包名.rpm
(显示gpg OK
才可信)。 - 校验 DEB 包:
dpkg-sig --verify 包名.deb
。
- 校验 RPM 包:
- 谨慎源码编译安装:源码编译(如
./configure && make && make install
)的软件无法通过包管理器管控,易存在漏洞且难以更新。若必须编译,需:- 从官方网站下载源码,校验源码包的 SHA256 哈希(如
sha256sum 源码包.tar.gz
与官方提供的哈希对比)。 - 编译时启用安全选项(如
-fstack-protector-strong
栈保护)。
- 从官方网站下载源码,校验源码包的 SHA256 哈希(如
三、文件系统管理
文件系统是数据的 “容器”,其安全目标是:防止数据泄露、篡改或丢失,确保文件访问符合权限规则。除此前提到的 “挂载选项”“完整性检查” 外,还需重点关注 “分区隔离”“磁盘加密”“日志保护” 等机制。
1. 分区安全:独立分区隔离风险
将系统按 “功能模块” 拆分独立分区(如 /var
、/home
、/tmp
),可防止单个分区满导致系统崩溃,同时限制恶意程序跨分区扩散。
(1)核心分区拆分建议
分区 | 作用 | 安全配置 |
---|---|---|
/ | 根分区,存储系统核心文件 | 挂载选项:defaults,nodev (禁止设备文件),建议大小 50-100GB |
/boot | 引导分区,存储内核与引导文件 | 挂载选项:defaults,ro (只读挂载,防止内核被篡改),大小 1-2GB |
/var | 存储日志、邮件、缓存 | 独立分区(避免日志满导致 / 分区耗尽),挂载选项:defaults,noexec,nosuid (禁止执行程序) |
/home | 用户家目录 | 独立分区(隔离用户数据与系统数据),挂载选项:defaults,nodev |
/tmp | 临时文件目录 | 独立分区或 tmpfs 挂载(tmpfs /tmp tmpfs defaults,noexec,nosuid,size=4G 0 0 ),重启后数据清空 |
(2)分区满的应急处理
若分区满(如 /var
因日志过大满),需及时清理:
- 查看分区使用率:
df -h
。 - 清理大文件:
du -sh /var/log/*
找到大日志文件,删除或压缩(如gzip /var/log/messages-202405*
)。
2. 磁盘加密:防止物理层面数据泄露
若服务器物理被盗或磁盘丢失,未加密的磁盘会导致数据直接泄露。Linux 支持 “全盘加密” 和 “分区加密”,通过 LUKS(Linux Unified Key Setup)实现标准加密方案。
(1)分区加密(以 /dev/sdb1
为例)
- 安装 cryptsetup 工具:
yum install cryptsetup
(RHEL/CentOS)或apt install cryptsetup
(Debian/Ubuntu)。 - 初始化 LUKS 加密(会清除分区数据,需提前备份):
cryptsetup luksFormat /dev/sdb1 # 输入 "YES" 确认,设置加密密码(复杂度需高)
- 解锁加密分区:
cryptsetup luksOpen /dev/sdb1 encrypted_part # 映射为 /dev/mapper/encrypted_part
- 格式化并挂载:
mkfs.xfs /dev/mapper/encrypted_part # 格式化为 xfs filesystem mount /dev/mapper/encrypted_part /mnt/encrypted # 挂载到指定目录
- 开机自动解锁(需配置密钥文件,避免手动输入密码):
- 创建密钥文件:
dd if=/dev/urandom of=/etc/luks-key bs=1024 count=4
(生成随机密钥)。 - 导入密钥到 LUKS:
cryptsetup luksAddKey /dev/sdb1 /etc/luks-key
。 - 编辑
/etc/crypttab
:encrypted_part /dev/sdb1 /etc/luks-key luks
。 - 编辑
/etc/fstab
:/dev/mapper/encrypted_part /mnt/encrypted xfs defaults 0 0
。
- 创建密钥文件:
(2)全盘加密(LVM+LUKS)
服务器场景常用 “LVM 逻辑卷 + LUKS 加密”,实现灵活分区与全盘保护,核心步骤与分区加密类似,仅需将加密对象改为 LVM 物理卷(如 /dev/sda2
)。
3. 日志文件安全:防止篡改与丢失
日志(如 /var/log/secure
、/var/log/audit/audit.log
)是安全事件溯源的关键证据,需防止日志被篡改或删除。
(1)日志文件权限控制
- 限制日志文件仅
root
可写,其他用户只读或不可访问:chmod 600 /var/log/audit/audit.log # 仅 root 可读写 chown root:root /var/log/secure # 确保所有者为 root
- 通过
logrotate
配置日志轮转(避免日志过大),同时保留历史日志(至少 30 天),编辑/etc/logrotate.d/syslog
:/var/log/messages /var/log/secure {daily # 每日轮转rotate 30 # 保留30天历史compress # 压缩历史日志delaycompress # 延迟压缩(保留最新轮转日志未压缩)notifempty # 空日志不轮转create 0600 root root # 新日志文件权限为 0600 }
(2)日志远程备份(防止本地篡改)
将日志实时发送到远程日志服务器(如 ELK Stack、rsyslog 服务器),即使本地日志被篡改,远程备份仍可用于溯源。
- 配置 rsyslog 远程发送(客户端):编辑
/etc/rsyslog.conf
,添加远程服务器地址:*.* @@192.168.1.200:514 # @@ 表示 TCP 协议,192.168.1.200 为远程日志服务器IP
systemctl restart rsyslog
。