原理与实践指南)
1. 自主访问控制机制DAC基础解析自主访问控制Discretionary Access ControlDAC是操作系统安全架构中最基础也最广泛应用的访问控制模型。我在Linux系统安全加固项目中多次实践发现90%的权限管理问题都源于对DAC机制理解不透彻。DAC的核心思想是资源所有者可以自主决定谁能够访问该资源以及以何种方式访问。典型的DAC实现包含三个关键要素主体Subject通常是进程或用户客体Object文件、目录、设备等系统资源访问矩阵Access Matrix定义主体对客体的操作权限在Linux系统中我们通过ls -l命令看到的rwx权限就是DAC的具体体现。比如一个文件的权限设置为-rw-r-----表示所有者user可读写同组用户group可读其他用户other无权限关键经验在实际生产环境中新创建文件的默认权限由umask值决定。建议将umask设置为027对应权限750这样新建文件默认不允许其他用户访问。2. Linux系统中的DAC实现细节2.1 传统Unix权限模型Linux继承自Unix的权限系统采用9位二进制表示法rwx rwx rwx u g o其中前3位表示所有者权限中间3位表示组权限最后3位表示其他用户权限特殊权限位包括setuid4执行时以文件所有者身份运行setgid2执行时以文件所属组身份运行sticky bit1目录下文件仅所有者可删除实际操作案例给脚本添加setuid权限chmod us script.sh # 添加setuid位 ls -l script.sh # 查看权限变化2.2 现代Linux的ACL扩展传统DAC模型在复杂场景下显得力不从心。我在某次企业级文件服务器配置中就遇到了这样的问题需要为多个不同部门的用户设置差异化访问权限。这时就需要使用ACLAccess Control Listsetfacl -m u:user1:rwx /shared/data # 为用户user1添加rwx权限 getfacl /shared/data # 查看ACL权限ACL的重要特性包括可以为单个用户/组设置权限支持默认权限继承权限优先级用户ACL 组ACL 其他ACL3. DAC在虚拟化环境中的安全考量3.1 虚拟机镜像文件权限管理在KVM虚拟化环境中虚拟机镜像文件如qcow2格式的DAC权限设置至关重要。我曾遇到过一个典型案例由于镜像文件权限设置不当其他用户可读导致敏感数据泄露。安全建议配置chown root:libvirt /var/lib/libvirt/images/vm1.qcow2 chmod 640 /var/lib/libvirt/images/vm1.qcow23.2 设备节点访问控制虚拟化环境会创建大量设备节点如/dev/kvm这些设备的权限直接影响系统安全。正确的做法是# 检查kvm设备权限 ls -l /dev/kvm # 典型安全配置 chown root:libvirt /dev/kvm chmod 660 /dev/kvm4. DAC机制的安全局限与强化措施4.1 DAC的固有缺陷通过多年的安全审计经验我总结出DAC的几个主要安全弱点权限传递问题用户可自由更改自有文件的权限特权滥用风险root用户拥有无限制权限无法防范恶意软件一旦账户被入侵攻击者可利用DAC机制横向移动4.2 增强DAC安全性的实践方案方案一结合MAC机制# 启用SELinux setenforce 1 # 查看文件安全上下文 ls -Z /etc/shadow方案二使用文件属性加固chattr i /etc/passwd # 设置不可修改属性 lsattr /etc/passwd # 查看文件属性方案三定期权限审计# 查找全局可写文件 find / -perm -ow -type f -exec ls -l {} \; # 查找无主文件 find / -nouser -o -nogroup5. 典型DAC配置案例解析5.1 Web服务器目录权限配置在Apache/Nginx部署场景中合理的权限设置应该是chown -R www-data:www-data /var/www/html chmod -R 750 /var/www/html find /var/www/html -type d -exec chmod 2750 {} \; # 设置setgid保持组权限5.2 数据库文件安全配置对于MySQL/MariaDB数据文件chown -R mysql:mysql /var/lib/mysql chmod -R 750 /var/lib/mysql # 关键配置文件 chmod 600 /etc/mysql/my.cnf6. 常见问题排查与解决6.1 权限拒绝类问题错误现象Permission denied when accessing /data/report排查步骤检查文件权限ls -l /data/report检查父目录权限ls -ld /data检查SELinux上下文ls -Z /data/report检查进程用户ps aux | grep process_name6.2 setuid/setgid失效问题可能原因文件系统挂载时使用了nosuid选项SELinux策略限制脚本文件设置了setuid通常无效解决方案# 检查挂载选项 mount | grep on / # 临时解决方案 mount -o remount,suid /path7. 自动化权限管理工具7.1 使用Ansible进行批量权限管理- name: Secure critical system files hosts: all tasks: - name: Set /etc/passwd permissions file: path: /etc/passwd owner: root group: root mode: 0644 - name: Set /etc/shadow permissions file: path: /etc/shadow owner: root group: shadow mode: 06407.2 自定义审计脚本示例#!/bin/bash # 检查敏感文件权限 CRITICAL_FILES(/etc/passwd /etc/shadow /etc/sudoers) for file in ${CRITICAL_FILES[]}; do perms$(stat -c %a $file) if [[ $perms ! 644 $perms ! 640 ]]; then echo WARNING: $file has insecure permissions $perms fi done在实际操作中我发现很多管理员会忽视对/tmp目录的权限检查。建议定期执行find /tmp -type f -perm -0777 -exec ls -l {} \; # 查找全局可读写的临时文件