Debian系统安全审计的核心任务之一就是检查配置文件权限和清理SUID文件。许多服务器入侵事件都源于配置文件的错误权限设置,比如/etc/passwd或/etc/shadow被不当修改,或者危险的SUID程序被攻击者利用进行权限提升。你需要立即使用find命令扫描整个文件系统,找出权限设置过松的配置文件和所有SUID/SGID文件,然后根据“最小权限原则”逐一评估和修正。

理解配置文件权限风险:哪些文件最危险

配置文件权限不当意味着任何用户都可能读取甚至修改关键系统设置。最典型的例子是/etc/shadow文件,它存储了所有用户的加密密码哈希。如果该文件权限被误设为全局可读(例如644),攻击者就能轻易获取哈希并进行离线破解。同样,/etc/passwd文件若全局可写,攻击者可直接添加具有root权限的用户。其他高风险文件包括:/etc/sudoers(控制sudo权限)、/etc/ssh/sshd_config(SSH服务配置)、/etc/crontab(系统定时任务)以及数据库配置文件(如my.cnf)、Web服务器配置文件(如apache2.conf),这些文件中往往包含数据库密码、API密钥等敏感信息。权限审计的第一步就是识别出这些文件,确保它们的所有者通常是root,且权限尽可能严格,例如shadow文件应为640(root可读写,shadow组可读),sudoers文件应为440(root只读,sudo组只读)。

使用find命令进行自动化权限审计

手动检查每个文件不现实,你需要编写具体的find命令进行批量扫描。对于配置文件,重点查找/etc目录下权限过松的文件。例如,查找所有全局可写的文件:

find /etc -type f -perm -o=w -ls

这里的-perm -o=w表示匹配“other”(其他用户)具有写权限的文件。-ls会输出详细列表。更全面的扫描应包括全局可读的敏感文件:

find /etc -type f \( -perm -o=r -o -perm -o=w -o -perm -o=x \) -ls | grep -v "/proc\|/sys"

为了避免误报临时文件系统,可以用grep过滤。对于SUID/SGID文件,扫描范围应是整个根文件系统:

find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null

此命令中,-perm -4000查找SUID文件,-perm -2000查找SGID文件。2>/dev/null将权限错误输出丢弃,使结果更清晰。建议将输出重定向到文件进行后续分析:

find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null > suid_sgid_audit.txt

评估与修正配置文件权限:具体操作指南

获取扫描结果后,你需要逐一评估。对于/etc下的文件,参考Debian官方标准权限。可以使用dpkg-statoverride工具查看软件包设置的默认权限。如果发现异常,使用chmod和chown命令修正。例如,将误设为全局可写的ssh配置恢复:

chmod 644 /etc/ssh/sshd_config
chown root:root /etc/ssh/sshd_config

对于shadow文件,确保权限正确:

chmod 640 /etc/shadow
chown root:shadow /etc/shadow

对于整个目录,如/etc/cron.d,应禁止普通用户写入:

chmod 755 /etc/cron.d
chown root:root /etc/cron.d

一个最佳实践是创建审计脚本,定期运行并对比基准快照。你可以使用工具如aide或tripwire,但简单的bash脚本也足够:

#!/bin/bash
# 审计配置文件权限
AUDIT_LOG="/var/log/config_audit_$(date +%Y%m%d).log"
echo "=== 全局可写配置文件检查 ===" >> $AUDIT_LOG
find /etc -type f -perm -o=w -ls 2>/dev/null >> $AUDIT_LOG
echo "=== SUID/SGID文件检查 ===" >> $AUDIT_LOG
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null >> $AUDIT_LOG

将脚本加入cron每周运行,并通过邮件发送差异报告。

SUID/SGID文件深度清理:为什么有些程序需要SUID

SUID(Set User ID)和SGID(Set Group ID)是Linux的特殊权限位。当SUID设置在可执行文件上时,无论谁执行该文件,它都会以文件所有者的权限运行。例如,/usr/bin/passwd的SUID位为root,所以普通用户能临时获得root权限修改shadow文件。这正是风险所在:如果某个SUID程序存在缓冲区溢出漏洞,攻击者就能利用它获取root shell。你需要清理不必要的SUID文件。首先,了解系统必需的SUID程序。Debian典型必需的SUID程序包括:passwd(用户修改密码)、sudo(权限提升)、mount(挂载文件系统)、su(切换用户)、ping(网络诊断)等。可以使用dpkg-query列出所有软件包安装的SUID文件:

dpkg-query -S $(find / -perm -4000 -type f 2>/dev/null) | cut -d: -f1 | sort -u

这能帮你确认哪些文件来自官方包。对于未知来源或非必要的SUID文件,应立即移除SUID位。例如,如果你发现一个自定义脚本被设置了SUID:

chmod u-s /usr/local/bin/custom_script

对于确实需要SUID但存在风险的程序,考虑替代方案。比如,用capabilities机制替代部分SUID需求。Linux capabilities将root权限细分为不同能力,可精确授权。例如,给ping程序授予CAP_NET_RAW能力而非SUID:

setcap cap_net_raw+ep /bin/ping

然后移除SUID位:

chmod u-s /bin/ping

这减少了权限提升的潜在入口。

建立持续监控与加固工作流

单次清理不够,你必须建立持续监控机制。除了定期运行审计脚本,还可以整合到配置管理工具中,如Ansible、Puppet或SaltStack。通过这些工具强制实施权限策略。例如,一个简单的Ansible playbook片段可以确保关键文件权限正确:

- name: 确保关键配置文件权限安全
  hosts: all
  tasks:
    - name: 设置/etc/shadow权限
      file:
        path: /etc/shadow
        owner: root
        group: shadow
        mode: '0640'
    - name: 移除非标准SUID文件
      command: chmod u-s {{ item }}
      with_items:
        - /usr/local/sbin/unknown_suid
        - /opt/legacy_tool

此外,考虑使用AppArmor或SELinux进行强制访问控制。AppArmor在Debian中预装,可以为特定程序(如SUID程序)配置严格的访问策略,限制其可访问的文件和网络资源。例如,为自定义SUID程序创建配置文件:

# /etc/apparmor.d/usr.local.bin.custom_suid
/usr/local/bin/custom_suid {
  #includecapability chown,
  /etc/config_file r,
  /var/log/custom.log w,
  deny network,
}

然后加载并启用:

apparmor_parser -r /etc/apparmor.d/usr.local.bin.custom_suid

这样即使该程序被利用,攻击者也无法突破策略限制。

应急响应:当发现异常SUID或权限变更时

如果审计发现未知SUID文件或配置文件权限被篡改,这可能意味着已发生入侵。立即采取隔离措施:断开受影响服务器网络,但保持取证状态。然后分析文件来源:使用stat查看文件修改时间,ls -la查看所有者和权限,md5sum计算哈希与干净系统对比。检查系统日志(/var/log/auth.log、/var/log/syslog)寻找相关活动记录。使用lsoffuser检查文件是否被进程占用。如果确认恶意文件,在清理前先备份证据。然后移除SUID位或删除文件,并检查相关用户账户和cron任务。最后,根据根本原因(如未修复的漏洞、弱密码)进行系统加固。记住,恢复后必须重新进行全面的权限审计,确保没有后门残留。

总结:将权限审计纳入日常运维

Debian系统安全不是一次性任务,配置文件权限审计和SUID清理应成为日常运维的常规部分。通过自动化工具定期扫描,结合配置管理强制合规,并利用如AppArmor等安全模块提供纵深防御,你能显著降低权限提升风险。始终遵循最小权限原则:每个文件和进程只应拥有其功能所必需的最低权限。定期审查SUID/SGID文件列表,移除任何非绝对必要的设置。同时,保持系统更新,及时修补已知漏洞,因为即使权限设置正确,软件漏洞也可能被利用。最终,一个系统的安全性取决于最薄弱的环节,而严格的权限控制是加固这个环节的关键步骤。