Linux 系统加固:从基础到进阶的全方位安全实践
Linux 凭借其开源、稳定和高度可定制的特性,广泛应用于服务器、嵌入式设备和云环境。然而,默认安装的 Linux 系统往往并非为“安全优先”设计——它们可能启用了不必要的服务、保留了默认账户、开放了风险端口,这些都可能成为攻击者的突破口。系统加固(OS Hardening) 是通过一系列技术手段和配置优化,减少系统攻击面、提升安全防护能力的过程。其核心目标是:最小化权限暴露、强化访问控制、确保数据完整性,并建立有效的监控机制。
本文将从基础到进阶,详细介绍 Linux 系统加固的关键领域、最佳实践及实操案例,帮助系统管理员和安全工程师构建更安全的 Linux 环境。
目录#
1. 系统更新与补丁管理#
系统漏洞是攻击者最常用的入侵途径之一,及时更新系统和应用软件是加固的第一道防线。
1.1 常见实践#
- 手动更新:通过包管理器(如
apt、yum、dnf)定期执行更新命令。# Debian/Ubuntu sudo apt update && sudo apt upgrade -y # RHEL/CentOS/Rocky Linux sudo dnf update -y # 或 yum update -y - 检查安全更新:使用工具筛选仅安全相关的补丁。
# Debian/Ubuntu:列出安全更新 sudo apt list --upgradable | grep -i security # RHEL/CentOS:启用 security 仓库后检查 sudo dnf check-update --security
1.2 最佳实践#
-
自动更新:配置自动化工具(如
unattended-upgrades、dnf-automatic)确保关键安全补丁无需人工干预即可应用。# Debian/Ubuntu 安装并配置 unattended-upgrades sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # 交互式启用自动更新配置文件路径:
/etc/apt/apt.conf.d/50unattended-upgrades,可设置更新频率、黑名单(如避免自动更新内核)。 -
补丁测试:在生产环境更新前,先在 staging 环境测试补丁兼容性,避免业务中断。
-
漏洞扫描:定期使用工具(如
lynis、rkhunter)扫描系统漏洞,确保未遗漏高危补丁。# 安装 lynis(系统审计工具) sudo apt install lynis # 或手动下载:https://cisofy.com/lynis/ sudo lynis audit system # 执行系统审计,输出漏洞和加固建议
2. 用户账户与权限管理#
用户账户是系统访问的入口,权限失控可能直接导致数据泄露或系统被接管。
2.1 账户清理与最小权限#
-
删除冗余账户:禁用或删除默认账户(如
games、news)、过期账户及未使用账户。# 查看所有账户 cat /etc/passwd | grep -v nologin | grep -v false # 锁定账户(保留数据) sudo passwd -l <用户名> # 删除账户(彻底移除) sudo userdel -r <用户名> # -r 同时删除家目录 -
禁用 root 直接登录:通过 SSH 或物理终端直接登录
root账户风险极高,应仅允许通过sudo提权。# 编辑 SSH 配置文件 sudo vim /etc/ssh/sshd_config设置
PermitRootLogin no,然后重启 SSH 服务:sudo systemctl restart sshd
2.2 密码策略与认证强化#
-
密码复杂度:通过 PAM(Pluggable Authentication Modules)配置密码长度、复杂度和有效期。 编辑
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL),添加pam_pwquality模块:password requisite pam_pwquality.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1参数说明:
minlen=12(最小长度12)、ucredit=-1(至少1个大写字母)、lcredit=-1(至少1个小写字母)、dcredit=-1(至少1个数字)、ocredit=-1(至少1个特殊字符)。 -
密码有效期:在
/etc/login.defs中设置密码最大有效期(如 90 天):PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 # 两次修改间隔至少7天 PASS_WARN_AGE 14 # 过期前14天警告 -
SSH 密钥认证:禁用密码登录,强制使用 SSH 密钥(更安全,避免暴力破解)。
# 客户端生成密钥对 ssh-keygen -t ed25519 -C "[email protected]" # 推荐 ed25519 算法(比 RSA 更安全) # 上传公钥到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip服务器端配置
/etc/ssh/sshd_config:PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用密钥登录 AuthorizedKeysFile .ssh/authorized_keys # 公钥存放路径 -
双因素认证(2FA):通过
pam_google_authenticator为 SSH 或 sudo 添加二次验证。# 安装模块 sudo apt install libpam-google-authenticator # Debian/Ubuntu sudo dnf install google-authenticator-libpam # RHEL # 为用户配置 2FA(每个用户需单独执行) google-authenticator # 生成密钥,扫描二维码到认证APP(如Google Authenticator)编辑
/etc/pam.d/sshd,添加:auth required pam_google_authenticator.so
2.3 sudo 权限控制#
- 最小化
sudo用户:仅授权必要用户使用sudo,避免过度权限。# 添加用户到 sudo 组(Debian/Ubuntu) sudo usermod -aG sudo <用户名> # RHEL/CentOS:添加到 wheel 组(需确保 /etc/sudoers 中 wheel 组有权限) sudo usermod -aG wheel <用户名> - 限制
sudo命令:通过/etc/sudoers(或/etc/sudoers.d/目录)细化用户可执行的命令,避免sudo su -获取完整 root 权限。 编辑时需使用# 示例:允许 user1 仅执行 /usr/bin/systemctl restart nginx user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginxvisudo命令(自动检查语法错误,避免锁死sudo)。
3. 文件系统安全与权限控制#
文件系统权限和属性直接影响数据保密性和完整性,需严格限制敏感文件的访问范围。
3.1 基础权限配置#
-
敏感文件权限:确保关键系统文件权限最小化(如
/etc/passwd、/etc/shadow、/root)。# /etc/passwd(用户信息):仅 root 可写,其他用户可读 sudo chmod 644 /etc/passwd # /etc/shadow(密码哈希):仅 root 可读/写 sudo chmod 600 /etc/shadow # /root 目录:仅 root 可访问 sudo chmod 700 /root -
删除世界可写文件:定期扫描并修复权限过松的文件(如
chmod o+w)。# 查找世界可写文件(排除 /proc 和 /sys 虚拟文件系统) sudo find / -path /proc -prune -o -path /sys -prune -o -perm -0002 -print
3.2 文件系统属性与挂载选项#
-
不可变文件:通过
chattr设置关键配置文件为不可变(防止篡改,需 root 权限解除)。# 设置 /etc/resolv.conf(DNS配置)为不可变 sudo chattr +i /etc/resolv.conf # 解除不可变属性(需修改时) sudo chattr -i /etc/resolv.conf -
挂载选项加固:在
/etc/fstab中为分区添加安全挂载选项,限制执行、SUID 权限等。# 示例:/tmp(临时文件)禁用执行、SUID、设备节点 tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0 # /home(用户目录)禁止 SUID/GUID /dev/sda3 /home ext4 defaults,nosuid,nodev 0 0常用选项:
noexec:禁止执行文件nosuid:禁止 SUID/GID 位生效(防止特权提升)nodev:禁止创建设备节点ro:只读挂载(如/boot)
3.3 强制访问控制(MAC):SELinux 与 AppArmor#
-
SELinux(Security-Enhanced Linux):Red Hat 系系统默认启用的 MAC 系统,通过“策略”限制进程权限(如禁止 Apache 读写
/tmp外的文件)。- 确保 SELinux 处于
enforcing模式(而非permissive或disabled):sudo setenforce 1 # 临时生效 sudo vim /etc/selinux/config # 永久生效:SELINUX=enforcing - 审计 SELinux 拒绝事件:
sudo ausearch -m AVC,USER_AVC -ts recent。
- 确保 SELinux 处于
-
AppArmor:Debian/Ubuntu 常用的 MAC 系统,通过“配置文件”定义进程访问规则(如限制 Nginx 仅访问
/var/www)。- 启用并加载 AppArmor 配置:
sudo systemctl enable --now apparmor sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx # 对 Nginx 启用强制模式
- 启用并加载 AppArmor 配置:
4. 网络安全加固#
网络是系统暴露在外的主要接口,需限制端口开放范围、过滤恶意流量。
4.1 防火墙配置#
- 默认拒绝策略:防火墙遵循“最小权限”原则,仅开放必要端口(如 SSH 22、HTTP 80),默认拒绝所有其他入站流量。
ufw(简单防火墙,Debian/Ubuntu 默认):sudo ufw default deny incoming # 默认拒绝入站 sudo ufw default allow outgoing # 默认允许出站 sudo ufw allow 22/tcp # 允许 SSH(仅 TCP) sudo ufw allow 443/tcp # 允许 HTTPS sudo ufw enable # 启用防火墙(开机自启) sudo ufw status numbered # 查看规则firewalld(RHEL/CentOS 默认):sudo firewall-cmd --set-default-zone=drop # 默认拒绝入站 sudo firewall-cmd --add-port=22/tcp --permanent # 永久开放 SSH sudo firewall-cmd --reload # 应用规则iptables(底层工具,适用于复杂规则):# 默认拒绝入站,允许回环和已建立连接 sudo iptables -P INPUT DROP sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
4.2 网络服务与端口限制#
-
禁用不必要端口:通过
ss或netstat检查监听端口,关闭未使用的服务。# 查看所有监听端口(TCP/UDP) sudo ss -tuln例如,若发现
rpcbind(端口 111)未使用,立即禁用:sudo systemctl disable --now rpcbind -
SSH 安全强化:
- 修改默认端口(22)为非标准端口(如 2222),减少扫描风险:
sudo vim /etc/ssh/sshd_config Port 2222 # 添加此行(删除默认 Port 22) sudo systemctl restart sshd - 限制来源 IP:通过
AllowUsers或AllowGroups仅允许指定 IP 登录。# /etc/ssh/sshd_config AllowUsers [email protected]/24 # 仅允许 192.168.1.0 网段的 user1 登录
- 修改默认端口(22)为非标准端口(如 2222),减少扫描风险:
4.3 TCP/IP 协议栈加固#
通过内核参数(sysctl)优化网络协议栈,防御 DDoS、SYN Flood 等攻击。
编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf,添加以下配置:
# 启用 SYN Cookie(防御 SYN Flood)
net.ipv4.tcp_syncookies = 1
# 限制 SYN 半连接队列大小
net.ipv4.tcp_max_syn_backlog = 2048
# 禁用 ICMP 重定向(防止中间人攻击)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 禁用 IP 转发(非路由服务器)
net.ipv4.ip_forward = 0
# 限制每个 IP 的连接数(防 DoS)
net.ipv4.tcp_max_tw_buckets = 5000应用配置:sudo sysctl -p。
5. 服务与进程管理#
禁用不必要的服务可减少攻击面,同时通过进程隔离限制漏洞影响范围。
5.1 禁用冗余服务#
- 列出并禁用自启动服务:通过
systemctl检查运行中的服务,禁用未使用的服务(如cups、bluetooth、telnet)。# 列出所有自启动服务 sudo systemctl list-unit-files --type=service --state=enabled # 禁用服务(立即停止并禁止开机自启) sudo systemctl disable --now cups
5.2 进程隔离与限制#
-
systemd服务加固:通过服务单元文件(.service)添加安全选项,限制进程权限。 编辑服务文件(如/etc/systemd/system/nginx.service),在[Service]段添加:[Service] PrivateTmp=yes # 为进程分配独立的 /tmp 目录 ProtectSystem=strict # 只读挂载 /usr、/boot、/etc(除 /etc/resolv.conf 等) ProtectHome=yes # 保护 /home 目录(不可写) NoNewPrivileges=yes # 禁止提升权限(如通过 SUID) CapDrop=ALL # 移除所有 Linux capabilities(仅保留必要的) RestrictAddressFamilies=AF_INET AF_INET6 # 限制网络协议族(仅 IPv4/IPv6)重新加载并重启服务:
sudo systemctl daemon-reload sudo systemctl restart nginx -
检查服务安全等级:使用
systemd-analyze security评估服务加固效果。sudo systemd-analyze security nginx # 输出安全评分(0=最安全,10=最危险)
6. 内核安全强化#
内核是系统的核心,通过内核参数、模块控制和安全机制加固可防御底层漏洞。
6.1 内核参数优化#
除了网络相关参数(见 4.3 节),还需配置以下内核安全选项:
# /etc/sysctl.d/99-security.conf
kernel.randomize_va_space=2 # 启用地址空间随机化(ASLR,防缓冲区溢出)
kernel.exec-shield=1 # 启用执行保护(防代码注入)
kernel.sysrq=0 # 禁用 SysRq 键(防止物理终端强制重启)
fs.protected_hardlinks=1 # 保护硬链接(防止通过硬链接提权)
fs.protected_symlinks=1 # 保护符号链接(防止权限绕过)6.2 内核模块控制#
-
禁用危险模块:通过
/etc/modprobe.d/blacklist.conf黑名单禁用不必要或高危模块(如usb_storage、firewire、pcspkr)。blacklist usb_storage # 禁用 USB 存储(防物理接入盗取数据) blacklist firewire-core -
限制模块加载:通过
sysctl禁止非 root 用户加载模块。kernel.modules_disable=1 # 禁止所有模块加载(需提前加载必要模块)
6.3 内核安全机制#
-
启用内核审计:通过
auditd监控内核事件(如模块加载、系统调用)。sudo apt install auditd # 安装审计服务 sudo systemctl enable --now auditd添加审计规则(
/etc/audit/rules.d/audit.rules):-w /etc/passwd -p wa -k identity # 监控 /etc/passwd 写入/属性变更 -w /sbin/insmod -p x -k modules # 监控模块加载命令重启
auditd并查看日志:sudo ausearch -k identity。 -
启用内核漏洞缓解技术:确保 CPU 和内核支持并启用
KASLR(内核地址空间随机化)、SMEP( Supervisor Mode Execution Prevention)、SMAP(Supervisor Mode Access Prevention)等机制。可通过dmesg或/proc/cpuinfo检查:dmesg | grep -i kaslr # 检查 KASLR 是否启用 grep -E 'smep|smap' /proc/cpuinfo # 检查 CPU 是否支持 SMEP/SMAP
7. 日志审计与监控#
日志是检测入侵和故障排查的关键,需确保日志完整、不可篡改,并及时告警异常行为。
7.1 日志配置与保护#
-
集中化日志管理:使用
rsyslog或systemd-journald将日志发送至中央服务器(如 ELK Stack、Graylog),避免日志被本地篡改。 编辑/etc/rsyslog.conf,添加远程日志服务器配置:*.* @@logs.example.com:514 # 通过 TCP 发送所有日志到远程服务器 -
日志文件保护:设置日志文件权限为只读(除 root 和日志进程外),并通过
chattr防止删除。sudo chmod 600 /var/log/auth.log # 认证日志(记录 SSH 登录等) sudo chattr +a /var/log/auth.log # 设置为 append-only(仅可追加,不可删除)
7.2 关键日志监控#
-
监控认证日志:重点关注
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL)中的异常登录(如多次失败、非常规时间登录)。# 查看最近 10 条 SSH 登录记录 sudo grep "Accepted publickey" /var/log/auth.log | tail -10 # 检测 SSH 暴力破解尝试(多次失败登录) sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -
文件完整性监控(FIM):通过
aide或tripwire监控关键文件变更(如/etc/passwd、/bin/bash)。# 安装 aide sudo apt install aide sudo aideinit # 生成初始基线(存于 /var/lib/aide/aide.db.new.gz) sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 替换为正式基线 sudo aide --check # 对比当前系统与基线,检测变更
7.3 自动化告警#
- 配置日志告警:通过
logwatch或自定义脚本(如结合grep+mail),当检测到异常时发送邮件告警。 设置# 安装 logwatch sudo apt install logwatch sudo vim /etc/logwatch/conf/logwatch.confMailTo = [email protected],每日自动发送日志摘要。
8. 高级加固:容器与虚拟化环境#
随着容器技术普及,需针对 Docker、Kubernetes 等环境进行额外加固。
8.1 Docker 容器加固#
-
使用非 root 用户运行容器:在 Dockerfile 中通过
USER指定低权限用户,避免容器内进程直接以 root 运行。FROM nginx:alpine RUN adduser -D appuser USER appuser # 切换为非 root 用户 -
限制容器权限:通过
--read-only、--cap-drop、--security-opt等参数限制容器资源和权限。# 只读文件系统 + 移除所有 capabilities + 禁用特权模式 docker run --read-only --cap-drop=ALL --user=1000:1000 --security-opt=no-new-privileges nginx -
使用 seccomp 配置文件:限制容器可调用的系统调用(syscall)。
# 使用默认 seccomp 配置(禁止危险 syscall) docker run --security-opt seccomp=default.json nginx
8.2 Kubernetes 安全#
-
Pod 安全上下文:在 Pod 定义中通过
securityContext限制容器权限。apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: runAsNonRoot: true # 禁止 root 运行 runAsUser: 1000 # 指定 UID fsGroup: 1000 # 文件系统组 ID containers: - name: app image: nginx securityContext: allowPrivilegeEscalation: false # 禁止权限提升 capabilities: drop: ["ALL"] # 移除所有 capabilities -
网络策略:通过 NetworkPolicy 限制 Pod 间通信,仅允许必要流量。
9. 总结与最佳实践#
Linux 系统加固是一个持续过程,需结合“最小权限”“纵深防御”原则,从多个层面构建安全体系:
- 定期更新与漏洞扫描:自动化补丁管理,使用
lynis、aide等工具定期审计。 - 严格的身份认证:禁用 root 登录、强制 SSH 密钥 + 2FA、复杂密码策略。
- 最小化攻击面:禁用冗余服务、限制开放端口、加固文件系统权限。
- 进程与资源隔离:通过
systemd、容器安全选项限制进程权限。 - 完善的日志监控:集中化日志、实时告警异常行为(如暴力破解、文件篡改)。
关键原则:没有“一劳永逸”的加固方案,需定期参考最新安全标准(如 CIS 基准)、监控漏洞情报,并结合业务场景调整策略。
10. 参考资料#
- CIS 安全基准(CIS Benchmarks):针对主流 Linux 发行版的详细加固指南。
- Red Hat Enterprise Linux 安全指南
- Ubuntu 安全手册
- Docker 安全最佳实践
- Linux 内核安全文档
man手册:man sshd_config、man iptables、man sysctl.conf
通过以上步骤,可显著提升 Linux 系统的抗攻击能力。安全是动态的,建议结合实际业务需求,持续优化加固策略。