Linux 安全加固详解:从基础到高级实践
Linux 凭借其稳定性、开源性和高度可定制性,成为服务器、嵌入式系统乃至云计算平台的首选操作系统。然而,“开源”不意味着“天生安全”——默认配置的 Linux 系统往往存在诸多安全隐患,例如弱密码策略、不必要的服务暴露、宽松的文件权限等。这些漏洞可能被攻击者利用,导致数据泄露、服务中断甚至系统完全被接管。
Linux 安全加固(Security Hardening)是一系列通过优化配置、限制攻击面、增强访问控制和提升监控能力,将系统安全性提升至“实战级别”的过程。它不是一次性操作,而是持续的、动态的安全实践,需要结合业务场景、威胁情报和行业标准不断调整。
本文将从基础到高级,系统梳理 Linux 安全加固的核心领域,涵盖系统更新、用户管理、权限控制、网络防护、内核安全等关键环节,并提供实用的配置示例和最佳实践,帮助读者构建更健壮的 Linux 安全体系。
目录#
1. 系统更新与补丁管理#
核心目标:及时修复操作系统和软件中的已知漏洞,消除“零日漏洞”以外的大部分安全风险。
常见实践#
- 定期手动执行
apt update && apt upgrade(Debian/Ubuntu)或dnf update(RHEL/CentOS)更新系统。 - 忽略低优先级更新以避免业务中断。
最佳实践#
-
自动化更新:使用工具实现无人值守更新,避免人为疏忽导致补丁延迟。
- Debian/Ubuntu:安装
unattended-upgrades 配置文件sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # 启用自动更新/etc/apt/apt.conf.d/50unattended-upgrades可指定更新源(如仅安全更新)。 - RHEL/CentOS:使用
dnf-automaticsudo dnf install dnf-automatic sudo systemctl enable --now dnf-automatic.timer
- Debian/Ubuntu:安装
-
分层更新策略:生产环境先在测试环境验证补丁兼容性,再批量部署。
-
漏洞扫描:定期使用工具(如
lynis、openvas)检测未修复漏洞。sudo apt install lynis # 安装安全审计工具 sudo lynis audit system # 执行系统扫描,输出漏洞报告
2. 用户与账户安全#
核心目标:严格控制用户权限,防止未授权访问和权限滥用。
常见实践#
- 使用强密码(如包含大小写字母、数字和特殊符号)。
- 为管理员分配
sudo权限而非直接使用root。
最佳实践#
-
禁用直接 root 登录:通过
sudo分配临时权限,减少root账户暴露风险。- 编辑
/etc/ssh/sshd_config(见 SSH 加固)。 - 确保
sudo权限最小化:编辑/etc/sudoers(需用visudo命令),例如仅允许用户alice执行apt:alice ALL=(ALL) NOPASSWD: /usr/bin/apt # 无需密码执行 apt(谨慎使用)
- 编辑
-
密码策略强化:通过 PAM(Pluggable Authentication Modules)强制密码复杂度。
- 安装
pam_pwquality(Debian/Ubuntu 需libpam-pwquality):sudo apt install libpam-pwquality # Debian/Ubuntu sudo dnf install pam-pwquality # RHEL/CentOS - 编辑
/etc/pam.d/common-password(Debian)或/etc/pam.d/system-auth(RHEL),添加规则:password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1minlen=12:密码最小长度 12 位ucredit=-1:至少 1 个大写字母lcredit=-1:至少 1 个小写字母dcredit=-1:至少 1 个数字ocredit=-1:至少 1 个特殊符号
- 安装
-
多因素认证(MFA):为关键账户(如
sudo用户)启用 MFA,即使密码泄露也能阻止登录。- 以 Google Authenticator 为例:
sudo apt install libpam-google-authenticator # 安装 PAM 模块 google-authenticator # 生成密钥,扫码添加到手机 APP,记录紧急恢复码 - 编辑
/etc/pam.d/sshd,添加auth required pam_google_authenticator.so,强制 SSH 登录需 MFA。
- 以 Google Authenticator 为例:
-
清理无效账户:禁用或删除长期未使用的账户(如
ftp、games等默认系统账户):sudo userdel -r old_user # 删除账户及家目录 sudo usermod -L expired_user # 锁定账户(无法登录,但保留数据)
3. 文件系统与权限控制#
核心目标:通过严格的文件权限和属性控制,防止敏感文件被篡改或泄露。
常见实践#
- 使用
chmod修改文件权限,如chmod 600 ~/.ssh/id_rsa。 - 避免设置
777等“世界可写”权限。
最佳实践#
-
遵循最小权限原则:仅授予用户/进程完成任务所需的最小权限。
- 检查敏感文件权限(如
/etc/passwd、/etc/shadow):ls -l /etc/passwd # 应为 -rw-r--r--(root 可写,其他只读) ls -l /etc/shadow # 应为 -rw-------(仅 root 可读可写) - 查找“世界可写”文件(高风险):
find / -perm -0002 -type f -print 2>/dev/null # 忽略错误输出
- 检查敏感文件权限(如
-
文件不可变属性:使用
chattr锁定关键系统文件,防止意外或恶意修改:sudo chattr +i /etc/passwd # 添加不可变属性(需 root 权限才能解除) sudo chattr -i /etc/passwd # 解除锁定(修改前执行) -
分区挂载安全选项:在
/etc/fstab中为分区添加安全挂载参数,限制风险:noexec:禁止执行分区内的二进制文件(如/tmp、/var/tmp)。nosuid:禁止设置 SUID 权限(防止特权提升)。nodev:禁止创建设备文件。
示例/etc/fstab配置:
/dev/sda5 /tmp ext4 defaults,noexec,nosuid,nodev 0 0
4. SSH 服务安全加固#
核心目标:SSH 是远程管理的主要入口,需通过配置限制攻击面,防止暴力破解和未授权访问。
常见实践#
- 修改默认 SSH 端口(22)为非标准端口(如 2222)。
- 禁用密码登录,使用 SSH 密钥认证。
最佳实践#
-
关键配置优化:编辑
/etc/ssh/sshd_config,应用以下规则:Port 2222 # 变更默认端口(减少扫描风险) PermitRootLogin no # 禁止 root 直接登录 PasswordAuthentication no # 禁用密码登录,强制密钥认证 PubkeyAuthentication yes # 启用公钥认证 AllowUsers alice bob # 仅允许指定用户登录(白名单) PermitEmptyPasswords no # 禁止空密码 ClientAliveInterval 300 # 5分钟无活动则断开连接修改后重启服务:
sudo systemctl restart sshd。 -
密钥认证强化:
- 生成高强度密钥(ED25519 算法比 RSA 更安全且性能更好):
ssh-keygen -t ed25519 -C "server-ssh-key" # 生成密钥对 - 限制私钥权限:
chmod 600 ~/.ssh/id_ed25519 - 公钥部署到服务器:
ssh-copy-id -p 2222 alice@server_ip
- 生成高强度密钥(ED25519 算法比 RSA 更安全且性能更好):
-
防御暴力破解:使用
fail2ban自动封禁多次登录失败的 IP:sudo apt install fail2ban # 安装工具 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 复制默认配置编辑
/etc/fail2ban/jail.local,启用 SSH 防护:[sshd] enabled = true port = 2222 # 匹配自定义 SSH 端口 filter = sshd logpath = /var/log/auth.log maxretry = 3 # 3次失败则封禁 bantime = 3600 # 封禁 1 小时重启服务:
sudo systemctl restart fail2ban。
5. 防火墙配置与网络防护#
核心目标:通过防火墙限制网络访问,仅开放必要端口,阻断恶意流量。
常见实践#
- 使用
ufw(简单)或firewalld(动态)管理防火墙规则。 - 允许
SSH(22)、HTTP(80)等必要端口。
最佳实践#
-
默认策略为“拒绝所有”:仅显式允许业务必需的端口和协议,最小化攻击面。
- UFW(Debian/Ubuntu 默认):
sudo ufw default deny incoming # 默认拒绝所有入站流量 sudo ufw default allow outgoing # 默认允许出站流量(可根据需求收紧) sudo ufw allow 2222/tcp # 允许 SSH(自定义端口) sudo ufw allow 443/tcp # 允许 HTTPS sudo ufw enable # 启用防火墙(重启后生效) sudo ufw status verbose # 查看规则状态 - Firewalld(RHEL/CentOS 默认):
sudo firewall-cmd --set-default-zone=drop # 默认拒绝入站 sudo firewall-cmd --add-port=2222/tcp --permanent # 永久开放 SSH sudo firewall-cmd --reload # 应用规则
- UFW(Debian/Ubuntu 默认):
-
状态化规则:仅允许“已建立连接”的出站流量响应(如 HTTP 客户端请求后的服务器响应)。
- UFW 默认支持状态化规则(通过
iptables的--state ESTABLISHED,RELATED)。
- UFW 默认支持状态化规则(通过
-
限制源 IP:对管理端口(如 SSH)仅允许特定 IP 段访问(如公司办公网):
sudo ufw allow from 192.168.1.0/24 to any port 2222/tcp # 仅允许内网 SSH 登录 -
禁用不必要的网络服务:关闭未使用的端口和服务(如
telnet、rpcbind):sudo systemctl disable --now rpcbind # 禁用 RPC 服务 sudo netstat -tulpn # 检查监听端口,确认无异常服务
6. 安全审计与日志监控#
核心目标:通过日志记录和审计,及时发现异常行为(如暴力破解、文件篡改),为事后溯源提供依据。
常见实践#
- 使用
journalctl查看系统日志,logrotate管理日志文件大小。
最佳实践#
-
集中化日志管理:将多台服务器日志汇总到中央系统(如 ELK Stack、Graylog),便于全局分析。
- 配置
rsyslog发送日志到中央服务器:编辑/etc/rsyslog.conf,添加:*.* @@logserver.example.com:514 # 通过 UDP 发送所有日志(@@ 表示 TCP)
- 配置
-
关键文件监控:使用
auditd记录对敏感文件(如/etc/passwd、/usr/bin/sudo)的访问和修改:sudo apt install auditd # 安装审计服务 sudo auditctl -w /etc/passwd -p wa -k passwd_changes # 添加监控规则(w=写,a=属性变更)查看审计日志:
ausearch -k passwd_changes # 按关键词查询日志永久保存规则:编辑
/etc/audit/rules.d/audit.rules,添加上述auditctl命令(不含auditctl)。 -
实时异常检测:使用工具(如
ossec、wazuh)监控日志中的异常模式(如大量失败登录、root权限切换)。
7. 内核安全增强#
核心目标:通过内核级防护机制,限制进程权限,抵御内核漏洞利用。
常见实践#
- 禁用不必要的内核模块(如
usb_storage,防止物理接入攻击)。
最佳实践#
-
启用内核安全模块:
- SELinux(RHEL/CentOS 默认):强制访问控制(MAC),限制进程只能访问预定义资源。
提示:SELinux 规则较复杂,可先在sudo setenforce 1 # 临时启用(重启失效) sudo sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config # 永久启用permissive模式下调试,避免误拦截业务。 - AppArmor(Debian/Ubuntu 默认):为特定应用(如 Nginx、Docker)定义安全配置文件,限制其行为。
sudo aa-status # 查看已启用的 AppArmor 配置文件 sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx # 强制 Nginx 遵循配置
- SELinux(RHEL/CentOS 默认):强制访问控制(MAC),限制进程只能访问预定义资源。
-
限制内核模块加载:编辑
/etc/modprobe.d/blacklist.conf,禁用高风险模块:blacklist usb_storage # 禁止 USB 存储设备(物理安全) blacklist firewire_core # 禁止火线接口 -
启用地址空间布局随机化(ASLR):防止缓冲区溢出攻击通过固定内存地址定位目标:
sudo sysctl -w kernel.randomize_va_space=2 # 启用 full ASLR(默认值,确认即可)
8. 应用程序安全#
核心目标:确保运行在 Linux 上的应用(如 Web 服务、数据库)自身安全,避免成为攻击入口。
常见实践#
- 定期更新应用程序(如
nginx、mysql)到最新安全版本。
最佳实践#
-
以非 root 用户运行服务:服务进程若被攻陷,可限制攻击范围(避免直接获取 root 权限)。
- 示例:修改 Nginx 运行用户(默认
www-data为低权限用户):
编辑/etc/nginx/nginx.conf:user nginx-user; # 自定义低权限用户(需提前创建:useradd -r -s /sbin/nologin nginx-user)
重启 Nginx:
sudo systemctl restart nginx,验证用户:ps aux | grep nginx。 - 示例:修改 Nginx 运行用户(默认
-
禁用应用不必要功能:如 Nginx 禁用
autoindex(目录浏览)、MySQL 禁用LOAD DATA LOCAL INFILE(防止文件读取漏洞)。 -
应用漏洞扫描:使用
nikto(Web 服务)、sqlmap(数据库)等工具检测应用层漏洞:nikto -h https://example.com # 扫描 Web 服务器漏洞(如过时组件、配置错误)
9. 容器安全加固#
核心目标:在容器化环境(Docker、Kubernetes)中,隔离容器与主机,防止容器逃逸。
常见实践#
- 使用官方镜像,避免未知来源的第三方镜像。
最佳实践#
-
非 root 容器:容器内进程使用普通用户,而非默认的
root(容器内 root 仍可能通过漏洞提权到主机)。- Dockerfile 中指定用户:
FROM nginx:alpine RUN adduser -D appuser # 创建非 root 用户 USER appuser # 切换到普通用户运行 - 运行时强制非 root:
docker run --user 1000:1000 nginx(使用 UID/GID 而非用户名)。
- Dockerfile 中指定用户:
-
只读文件系统:容器根目录设为只读,仅挂载必要的可写目录(如日志、临时文件):
docker run --read-only -v /tmp/logs:/var/log/nginx nginx # 仅 /var/log/nginx 可写 -
限制系统调用:使用
seccomp过滤容器允许的系统调用(syscall),减少攻击面:docker run --security-opt seccomp=default.json nginx # 应用自定义 seccomp 配置default.json可禁用高风险 syscall(如mount、ptrace)。 -
镜像安全扫描:使用
trivy检测镜像中的漏洞:trivy image nginx:alpine # 输出镜像内的 OS 漏洞、应用依赖漏洞
10. 数据备份与灾难恢复#
核心目标:确保数据在系统被破坏或勒索软件攻击后,可快速恢复,减少业务中断。
常见实践#
- 使用
rsync或tar定期备份数据到外部存储。
最佳实践#
-
加密备份:防止备份数据泄露(如备份硬盘物理丢失)。
- 使用
borgbackup(支持加密和增量备份):borg init --encryption=repokey /backup/repo # 创建加密备份仓库 borg create /backup/repo::$(date +%Y%m%d) /data # 备份 /data 目录
- 使用
-
定期测试恢复流程:备份的有效性需通过实际恢复验证(如每月进行一次恢复测试)。
-
异地备份:将备份数据存储在与生产环境物理隔离的位置(如云存储、异地机房),防止单点灾难(如火灾、地震)。
-
制定灾难恢复计划(DRP):文档化恢复步骤、责任人、时间目标(RTO/RPO),并定期演练。
参考资料#
- Ubuntu Server Security Guide
- Red Hat Enterprise Linux Security Guide
- OpenSSH 官方文档
- Linux Audit Framework (auditd)
- Docker 安全最佳实践
- NIST 安全加固指南
通过以上措施,可显著提升 Linux 系统的抗攻击能力。但安全是“动态过程”,需结合实际业务场景持续优化——定期进行漏洞扫描、渗透测试,并关注最新的安全漏洞和防御技术,才能构建真正“与时俱进”的安全体系。