Linux 安全详解:从基础到实践的全面指南

Linux 凭借其开源、稳定和高度可定制的特性,已成为服务器、嵌入式系统、云计算和边缘设备的首选操作系统。然而,“安全”并非与生俱来——尽管 Linux 内核设计遵循最小权限原则,且开源社区的快速响应有助于修复漏洞,但错误的配置、未及时更新的软件或疏忽的管理仍可能导致严重的安全风险。无论是个人开发者维护的小型服务器,还是企业级数据中心的大规模集群,Linux 安全都需要系统性的防护策略。

本文将从基础原理出发,逐步深入 Linux 安全的核心领域,涵盖系统加固、访问控制、网络防护、监控审计、威胁应对及最佳实践,旨在为读者提供一套可落地的安全指南。

目录#

  1. Linux 安全基础:核心原理与模型
    • 1.1 Unix/Linux 安全模型
    • 1.2 最小权限原则
    • 1.3 文件权限与访问控制列表(ACL)
  2. 系统加固:从安装到内核防护
    • 2.1 最小化安装与软件精简
    • 2.2 及时更新与补丁管理
    • 2.3 文件系统安全配置
    • 2.4 安全启动与内核加固
  3. 访问控制:身份验证与权限管理
    • 3.1 用户与组管理最佳实践
    • 3.2 PAM(可插拔认证模块)详解
    • 3.3 sudo:精细化权限分配
    • 3.4 SSH 安全配置指南
  4. 网络安全:防火墙与服务防护
    • 4.1 Linux 防火墙框架:netfilter 与 iptables/ufw
    • 4.2 常用服务安全配置(SSH/HTTP/数据库)
    • 4.3 网络流量监控与异常检测
  5. 安全监控与审计:日志与入侵检测
    • 5.1 日志管理工具:rsyslog 与 systemd-journald
    • 5.2 auditd:系统行为审计
    • 5.3 入侵检测工具(Lynis、ClamAV、rkhunter)
  6. 常见威胁与应对策略
    • 6.1 恶意软件(病毒、勒索软件)
    • 6.2 权限提升攻击
    • 6.3 DDoS 与网络攻击
    • 6.4 社会工程学与钓鱼攻击
  7. Linux 安全最佳实践总结
  8. 参考资料

1. Linux 安全基础:核心原理与模型#

1.1 Unix/Linux 安全模型#

Linux 继承了 Unix 的安全模型,其核心是身份验证(Authentication)、授权(Authorization) 和审计(Accounting)(简称“AAA 模型”):

  • 身份验证:验证用户身份(如密码、SSH 密钥、生物识别)。
  • 授权:基于用户身份分配资源访问权限(如文件读写、进程执行)。
  • 审计:记录用户行为与系统事件,用于追溯与合规。

Linux 通过 UID(用户 ID)和 GID(组 ID)标识用户和组,内核通过 UID/GID 判断进程权限,而非用户名。例如,root 用户的 UID 为 0,拥有系统最高权限。

1.2 最小权限原则#

最小权限原则是 Linux 安全的基石:任何用户或进程仅拥有完成其任务所需的最小权限。例如:

  • 普通用户不应使用 root 权限日常操作,仅在必要时通过 sudo 临时提权。
  • 服务进程(如 Nginx、MySQL)应使用专用低权限用户(如 www-data、mysql)运行,而非 root。

1.3 文件权限与访问控制列表(ACL)#

Linux 通过文件权限控制访问,权限分为三类:所有者(User)、所属组(Group)、其他用户(Other),每种角色可拥有读(r)、写(w)、执行(x)权限。

权限表示方法#

  • 符号表示:如 rwxr-xr--(所有者可读可写可执行,组用户可读可执行,其他用户只读)。
  • 数字表示:r=4,w=2,x=1,权限值为三者之和。例如 rwxr-xr-- 对应 754(7=4+2+1,5=4+1,4=4)。

常用命令示例#

# 修改文件所有者为 user1,所属组为 group1
chown user1:group1 file.txt
 
# 设置文件权限为 rw-r--r--(644)
chmod 644 file.txt
 
# 递归修改目录权限(仅目录本身,不影响子文件)
chmod 755 -R --reference=dir1 dir2

访问控制列表(ACL):更细粒度的权限控制#

标准权限仅支持用户、组、其他三类,ACL 可对单个用户或组设置独立权限(需文件系统支持,如 ext4、XFS)。

# 安装 ACL 工具(Debian/Ubuntu)
apt install acl
 
# 允许用户 alice 对 file.txt 拥有读写权限
setfacl -m u:alice:rw file.txt
 
# 查看文件 ACL
getfacl file.txt

2. 系统加固:从安装到内核防护#

2.1 最小化安装与软件精简#

原则:仅安装必要的软件,减少攻击面。

  • 安装阶段:选择“最小化安装”(如 CentOS Minimal、Ubuntu Server),避免预装图形界面或冗余服务(如 FTP、Telnet)。
  • 后期清理:定期卸载无用软件:
    # 查看已安装但未使用的包(Debian/Ubuntu)
    apt autoremove --purge

2.2 及时更新与补丁管理#

未修复的漏洞是最常见的安全隐患(如 Heartbleed、Shellshock)。自动化更新是关键:

Debian/Ubuntu 自动更新#

# 安装 unattended-upgrades
apt install unattended-upgrades
 
# 配置自动更新(编辑 /etc/apt/apt.conf.d/50unattended-upgrades)
Unattended-Upgrade::Allowed-Origins {
  "${distro_id}:${distro_codename}-security";  # 仅安全更新
};
 
# 启用定时任务
dpkg-reconfigure -plow unattended-upgrades

CentOS/RHEL 自动更新#

# 安装 dnf-automatic
dnf install dnf-automatic
 
# 配置自动更新(编辑 /etc/dnf/automatic.conf)
apply_updates = yes  # 自动应用更新
 
# 启动服务
systemctl enable --now dnf-automatic.timer

2.3 文件系统安全配置#

敏感文件权限加固#

  • /etc/passwd(用户信息):权限 644(root 可写,其他只读)。
  • /etc/shadow(密码哈希):权限 000(仅 root 可通过 passwd 命令修改)。
  • ~/.ssh/id_rsa(SSH 私钥):权限 600(仅用户可读),否则 SSH 会拒绝使用。

禁用不必要的文件系统功能#

通过 /etc/fstab 配置文件系统挂载选项,限制风险操作:

# 示例:/tmp 分区禁止执行、SUID,/home 禁止 root 写入
UUID=xxx /tmp ext4 defaults,noexec,nosuid 0 0
UUID=yyy /home ext4 defaults,nodev 0 0
  • noexec:禁止执行文件。
  • nosuid:禁用 SUID/GUID 权限(防止恶意程序提权)。
  • nodev:禁止创建设备文件。

2.4 安全启动与内核加固#

安全启动(Secure Boot)#

UEFI 安全启动通过验证内核和引导程序的数字签名,防止恶意代码在系统启动时加载。需在 BIOS 中启用,并确保内核/引导程序(如 GRUB)已签名。

内核安全配置#

  • 内核参数优化:通过 /etc/sysctl.conf 或 /etc/sysctl.d/ 调整内核行为:
    # 启用 ASLR(地址空间布局随机化,防止缓冲区溢出攻击)
    kernel.randomize_va_space = 2
     
    # 禁用 IP 转发(非路由器场景)
    net.ipv4.ip_forward = 0
     
    # 启用 SYN Cookie(防御 SYN 洪水攻击)
    net.ipv4.tcp_syncookies = 1
  • 内核模块管理:限制非必要模块加载,通过 /etc/modprobe.d/blacklist.conf 禁用风险模块(如 usb-storage 防止 U 盘攻击):
    blacklist usb-storage

3. 访问控制:身份验证与权限管理#

3.1 用户与组管理最佳实践#

禁用 root 直接登录#

root 权限过高,应通过普通用户 + sudo 提权,而非直接登录:

# 编辑 /etc/ssh/sshd_config,禁止 root SSH 登录
PermitRootLogin no
systemctl restart sshd

密码策略强化#

  • 复杂度要求:使用 pam_pwquality 模块强制密码长度、复杂度:

    # 安装模块(Debian/Ubuntu)
    apt install libpam-pwquality
     
    # 编辑 /etc/pam.d/common-password,添加:
    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 个特殊字符。
  • 定期过期:通过 chage 设置密码有效期:

    # 设置用户密码 90 天过期,提前 7 天提醒
    chage -M 90 -W 7 user1

3.2 PAM(可插拔认证模块)详解#

PAM 是 Linux 统一的认证框架,通过 /etc/pam.d/ 目录下的配置文件控制不同服务(如 login、sshd、sudo)的认证规则。

常用 PAM 模块示例#

  • pam_deny:拒绝所有认证请求(用于默认策略)。
  • pam_limits:限制用户资源(CPU、内存、打开文件数),配置文件 /etc/security/limits.conf:
    # 限制 user1 最多打开 1024 个文件
    user1 hard nofile 1024
  • pam_tally2:防止暴力破解,记录登录失败次数并锁定账户:
    # 编辑 /etc/pam.d/sshd,添加:
    auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=600
    • deny=5:失败 5 次后锁定。
    • unlock_time=300:普通用户 5 分钟后解锁。
    • even_deny_root:对 root 同样生效。

3.3 sudo:精细化权限分配#

sudo 允许普通用户以其他用户(通常是 root)身份执行命令,配置文件为 /etc/sudoers(必须通过 visudo 编辑,防止语法错误导致锁死)。

配置示例#

# 允许 user1 无需密码执行所有 root 命令(谨慎使用)
user1 ALL=(ALL) NOPASSWD: ALL
 
# 允许 user1 仅执行 apt 和 systemctl 命令
user1 ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl restart nginx
 
# 限制 user1 只能以 www-data 用户执行命令
user1 ALL=(www-data) /usr/bin/nginx -t

3.4 SSH 安全配置指南#

SSH 是远程管理的主要工具,其配置直接影响系统安全。核心配置文件:/etc/ssh/sshd_config。

关键安全配置#

Port 2222                  # 更改默认端口(减少扫描)
Protocol 2                 # 仅使用 SSHv2(SSHv1 不安全)
PermitRootLogin no         # 禁止 root 登录
PasswordAuthentication no  # 禁用密码认证,仅用密钥
PubkeyAuthentication yes   # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys  # 公钥文件路径
AllowUsers [email protected]/24  # 仅允许 user1 从 192.168.1.0 网段登录
ClientAliveInterval 300    # 5 分钟无活动则断开连接

SSH 密钥生成与部署#

# 客户端生成密钥对(无需密码的密钥文件权限必须为 600)
ssh-keygen -t ed25519 -C "[email protected]"  # ed25519 比 RSA 更安全
 
# 复制公钥到服务器(需临时允许密码登录)
ssh-copy-id -p 2222 user1@server_ip

4. 网络安全:防火墙与服务防护#

4.1 Linux 防火墙框架:netfilter 与 iptables/ufw#

Linux 内核通过 netfilter 框架实现包过滤,用户态工具包括 iptables(底层)、ufw(简化版,Ubuntu 默认)、firewalld(动态防火墙,CentOS 默认)。

iptables 基础规则示例(适用于服务器)#

# 清空现有规则
iptables -F
iptables -X
 
# 允许回环接口(本地通信)
iptables -A INPUT -i lo -j ACCEPT
 
# 允许已建立的连接和相关连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# 允许 SSH(2222 端口)、HTTP(80)、HTTPS(443)
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# 其他入站流量全部拒绝
iptables -A INPUT -j DROP
 
# 保存规则(Debian/Ubuntu)
iptables-save > /etc/iptables/rules.v4

UFW(Uncomplicated Firewall)简化操作(适用于桌面/小型服务器)#

# 启用 UFW
ufw enable
 
# 允许 SSH、HTTP、HTTPS
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
 
# 查看规则
ufw status numbered

4.2 常用服务安全配置(SSH/HTTP/数据库)#

Web 服务(Nginx)安全配置#

  • 启用 TLS 1.2+,禁用 SSLv3、TLS 1.0/1.1:
    server {
      listen 443 ssl;
      ssl_protocols TLSv1.2 TLSv1.3;
      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
      ssl_prefer_server_ciphers on;
      ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    }
  • 隐藏版本号:server_tokens off;。

数据库(MySQL)安全配置#

  • 运行 mysql_secure_installation 脚本,执行以下操作:
    • 设置 root 密码。
    • 移除匿名用户。
    • 禁止 root 远程登录。
    • 删除测试数据库。

4.3 网络流量监控与异常检测#

  • ss/netstat:查看开放端口与连接:
    ss -tuln  # 显示 TCP/UDP 监听端口
  • tcpdump:抓包分析(需 root 权限):
    tcpdump -i eth0 port 80  # 抓取 eth0 接口 80 端口流量
  • iftop:实时带宽监控,识别异常流量。

5. 安全监控与审计:日志与入侵检测#

5.1 日志管理工具:rsyslog 与 systemd-journald#

Linux 日志系统用于记录系统事件、用户操作和服务状态,是事后审计与故障排查的关键。

rsyslog(传统日志服务)#

配置文件 /etc/rsyslog.conf,默认日志路径:

  • /var/log/auth.log(认证事件,如 SSH 登录)。
  • /var/log/syslog(系统事件)。
  • /var/log/kern.log(内核日志)。

远程日志集中管理(防止本地日志被篡改):

# 服务器端:允许接收 514 端口 UDP 日志
# /etc/rsyslog.conf 添加:
module(load="imudp")
input(type="imudp" port="514")
 
# 客户端:转发日志到服务器
# /etc/rsyslog.conf 添加:
*.* @logserver_ip:514  # @ 表示 UDP,@@ 表示 TCP

systemd-journald(systemd 日志服务)#

较新的 Linux 发行版(如 CentOS 7+、Ubuntu 16.04+)使用 journald,日志存储在内存或 /var/log/journal/,查询更高效:

journalctl -u sshd  # 查看 sshd 服务日志
journalctl --since "2024-01-01" --until "2024-01-02"  # 按时间范围查询

5.2 auditd:系统行为审计#

auditd 是内核级审计工具,可监控文件访问、进程执行、权限变更等敏感操作。

常用 auditd 规则示例#

# 安装 auditd(Debian/Ubuntu)
apt install auditd
 
# 添加规则:监控 /etc/passwd 修改
auditctl -w /etc/passwd -p wa -k passwd_changes  # -w:监控路径,-p wa:写/属性变更,-k:标签
 
# 查看审计日志(按标签过滤)
ausearch -k passwd_changes
 
# 永久保存规则(编辑 /etc/audit/rules.d/audit.rules)
-w /etc/passwd -p wa -k passwd_changes

5.3 入侵检测工具#

  • Lynis:系统安全审计工具,扫描漏洞、配置错误和合规性问题:
    # 安装 Lynis
    apt install lynis
     
    # 执行审计
    lynis audit system
  • ClamAV:开源防病毒引擎,检测恶意软件:
    freshclam  # 更新病毒库
    clamscan -r /home  # 扫描 /home 目录
  • rkhunter:检测 rootkit 和后门程序:
    rkhunter --update  # 更新定义库
    rkhunter --check  # 执行扫描

6. 常见威胁与应对策略#

6.1 恶意软件(病毒、勒索软件)#

风险:Linux 恶意软件虽少于 Windows,但仍存在(如 Emotet、XorDDoS、勒索软件)。
应对:

  • 定期更新系统与软件。
  • 使用 ClamAV 扫描可疑文件。
  • 限制服务进程权限,避免以 root 运行。

6.2 权限提升攻击#

风险:攻击者通过漏洞(如内核漏洞、SUID 文件配置错误)获取 root 权限。
应对:

  • 禁用不必要的 SUID/GUID 文件:find / -perm -4000 -ls(查找 SUID 文件)。
  • 定期审计内核漏洞,及时应用补丁。
  • 使用 sysctl 启用内核安全功能(如 KASLR、SMEP)。

6.3 DDoS 与网络攻击#

风险:SYN 洪水、UDP 洪水、CC 攻击等耗尽服务器资源。
应对:

  • 启用 tcp_syncookies(防御 SYN 洪水)。
  • 配置 iptables 速率限制:
    # 限制每分钟最多 100 个 SSH 连接请求
    iptables -A INPUT -p tcp --dport 2222 -m limit --limit 100/min --limit-burst 10 -j ACCEPT
  • 使用云服务商 DDoS 防护(如 Cloudflare、AWS Shield)。

6.4 社会工程学与钓鱼攻击#

风险:攻击者通过邮件、短信等诱骗用户泄露密码或执行恶意操作。
应对:

  • 对员工进行安全意识培训。
  • 使用邮件过滤工具(如 SpamAssassin)拦截钓鱼邮件。
  • 启用多因素认证(MFA),降低密码泄露风险。

7. Linux 安全最佳实践总结#

  1. 最小化原则:仅安装必要软件,禁用无用服务。
  2. 定期更新:自动化系统与软件补丁,修复已知漏洞。
  3. 权限控制:遵循最小权限,禁用 root 直接登录,使用 sudo 精细化授权。
  4. 强认证:启用 SSH 密钥、密码复杂度策略、多因素认证(MFA)。
  5. 网络防护:配置防火墙限制端口访问,监控异常流量。
  6. 日志审计:集中管理日志,启用 auditd 监控敏感操作。
  7. 定期扫描:使用 Lynis、ClamAV 等工具检测漏洞与恶意软件。
  8. 数据备份:定期备份关键数据,测试恢复流程。

8. 参考资料#