mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1664 字
4 分钟
Linux文件权限和ACL管理命令和技巧
2026-02-02

chmod 777一时爽,安全火葬场。这句话不是我说的,但确实是我踩过坑之后的真实感受。刚开始玩Linux的时候,遇到权限问题就无脑777,后来被前辈教育了一顿才明白权限管理有多重要。这篇把Linux文件权限和ACL的细节彻底讲透了,包括setuid、setgid、粘滞位这些容易搞混的概念。

Linux文件权限和ACL管理命令和技巧#

文件权限和ACL概述#

文件权限说白了就是Linux系统的一道门禁系统,它决定了谁能进、谁不能进。ACL则是更精细的门禁卡——不仅能控制谁能进这栋楼,还能控制谁能进哪个房间。

传统文件权限#

文件权限的表示#

Linux系统中,每个文件和目录都有9个权限位,分为3组,每组3位,分别表示所有者(owner)、所属组(group)和其他用户(others)的权限。

  • r(读取权限):允许读取文件内容或列出目录内容
  • w(写入权限):允许修改文件内容或在目录中创建、删除文件
  • x(执行权限):允许执行文件或进入目录

文件权限的数字表示#

文件权限可以用数字表示,每个权限对应一个值:

  • r:4
  • w:2
  • x:1

将每组权限的值相加,得到一个三位数的数字,例如:

  • 755:所有者有rwx权限,所属组和其他用户有rx权限
  • 644:所有者有rw权限,所属组和其他用户有r权限
  • 700:所有者有rwx权限,所属组和其他用户没有权限

文件权限的查看#

# 查看文件权限
ls -l file.txt
# 查看目录权限
ls -ld directory/
# 查看详细权限(包括ACL)
ls -le file.txt
# 查看所有文件和目录的权限
ls -la directory/

文件权限的修改#

chmod命令#

chmod命令用于修改文件和目录的权限。

# 使用符号模式修改权限
chmod u+r file.txt # 给所有者添加读取权限
chmod g-w file.txt # 移除所属组的写入权限
chmod o+x file.txt # 给其他用户添加执行权限
chmod a+r file.txt # 给所有用户添加读取权限
chmod u=rwx,g=rx,o=r file.txt # 设置所有者为rwx,所属组为rx,其他用户为r
chmod +x file.txt # 给所有用户添加执行权限
chmod -w file.txt # 移除所有用户的写入权限
# 使用数字模式修改权限
chmod 755 file.txt # 设置权限为rwxr-xr-x
chmod 644 file.txt # 设置权限为rw-r--r--
chmod 700 file.txt # 设置权限为rwx------
# 递归修改目录权限
chmod -R 755 directory/ # 递归设置目录及其内容的权限为rwxr-xr-x
chmod -R +x directory/ # 递归给目录及其内容添加执行权限
# 修改目录的执行权限(不影响文件)
find directory/ -type d -exec chmod +x {} \;

chown命令#

chown命令用于修改文件和目录的所有者。

# 修改文件所有者
chown username file.txt
# 修改文件所有者和所属组
chown username:group file.txt
# 递归修改目录所有者
chown -R username directory/
# 递归修改目录所有者和所属组
chown -R username:group directory/
# 只修改所属组(使用chgrp命令更简单)
chown :group file.txt

chgrp命令#

chgrp命令用于修改文件和目录的所属组。

# 修改文件所属组
chgrp group file.txt
# 递归修改目录所属组
chgrp -R group directory/
# 使用参考文件的所属组
chgrp --reference=reference_file file.txt

特殊权限#

SUID权限#

SUID(Set User ID)权限允许用户以文件所有者的身份执行文件,常用于需要特权的命令,如passwd

# 设置SUID权限
chmod u+s file.txt
chmod 4755 file.txt # 数字表示,4表示SUID
# 移除SUID权限
chmod u-s file.txt
chmod 0755 file.txt
# 查看SUID文件
find / -perm -4000 -type f 2>/dev/null

SGID权限#

SGID(Set Group ID)权限允许用户以文件所属组的身份执行文件,或在目录中创建的文件继承目录的所属组。

# 设置SGID权限
chmod g+s file.txt
chmod 2755 file.txt # 数字表示,2表示SGID
# 移除SGID权限
chmod g-s file.txt
chmod 0755 file.txt
# 查看SGID文件
find / -perm -2000 -type f 2>/dev/null
# 查看SGID目录
find / -perm -2000 -type d 2>/dev/null

Sticky Bit权限#

Sticky Bit权限用于目录,确保只有文件所有者、目录所有者或root用户可以删除目录中的文件,常用于/tmp目录。

# 设置Sticky Bit权限
chmod +t directory/
chmod 1777 directory/ # 数字表示,1表示Sticky Bit
# 移除Sticky Bit权限
chmod -t directory/
chmod 0777 directory/
# 查看设置了Sticky Bit的目录
find / -perm -1000 -type d 2>/dev/null

ACL(访问控制列表)#

ACL的概念#

ACL是对传统文件权限的扩展,允许为特定用户或组设置更细粒度的权限,而不仅限于所有者、所属组和其他用户。

ACL的安装#

# 检查系统是否支持ACL
grep ACL /boot/config-$(uname -r)
# 安装ACL工具(Debian/Ubuntu)
sudo apt install -y acl
# 安装ACL工具(RHEL/CentOS)
sudo yum install -y acl
# 挂载文件系统时启用ACL
# 编辑/etc/fstab文件,添加acl选项
# /dev/sda1 / ext4 defaults,acl 0 1
# 重新挂载文件系统以启用ACL
sudo mount -o remount,acl /

ACL的基本操作#

getfacl命令#

getfacl命令用于查看文件和目录的ACL。

# 查看文件的ACL
getfacl file.txt
# 查看目录的ACL
getfacl directory/
# 递归查看目录及其内容的ACL
getfacl -R directory/
# 查看ACL并忽略默认ACL
getfacl -n file.txt
# 查看ACL并以机器可读格式输出
getfacl -p file.txt

setfacl命令#

setfacl命令用于设置文件和目录的ACL。

# 给特定用户添加权限
setfacl -m u:username:rwx file.txt
# 给特定组添加权限
setfacl -m g:group:rx file.txt
# 给其他用户设置权限
setfacl -m o::r file.txt
# 移除特定用户的权限
setfacl -x u:username file.txt
# 移除特定组的权限
setfacl -x g:group file.txt
# 移除所有ACL
setfacl -b file.txt
# 递归设置目录及其内容的ACL
setfacl -R -m u:username:rwx directory/
# 仅设置目录的ACL,不影响内容
setfacl -m u:username:rwx directory/
# 设置默认ACL(仅对目录有效)
setfacl -m d:u:username:rwx directory/
# 递归设置默认ACL
setfacl -R -m d:u:username:rwx directory/
# 复制ACL从一个文件到另一个文件
getfacl source.txt | setfacl --set-file=- destination.txt
# 备份ACL
getfacl -R directory/ > acl-backup.txt
# 恢复ACL
setfacl --restore=acl-backup.txt

ACL的优先级#

ACL的优先级高于传统文件权限,当设置了ACL时,系统会优先使用ACL中的权限设置。

ACL的默认值#

对于目录,可以设置默认ACL,新创建的文件和子目录会继承这些默认ACL。

# 设置目录的默认ACL
setfacl -m d:u:username:rwx,d:g:group:rx,d:o::r directory/
# 查看目录的默认ACL
getfacl directory/
# 验证默认ACL是否生效
mkdir directory/subdirectory/
touch directory/file.txt
getfacl directory/subdirectory/
getfacl directory/file.txt

文件权限管理最佳实践#

最小权限原则#

遵循最小权限原则,只授予用户完成任务所需的最小权限,避免过度授权。

# 为普通文件设置合理的权限
chmod 644 file.txt
# 为可执行文件设置合理的权限
chmod 755 script.sh
# 为目录设置合理的权限
chmod 755 directory/
# 为敏感文件设置严格的权限
chmod 600 password.txt
chmod 600 private.key

权限继承#

合理设置目录权限,确保新创建的文件和子目录继承正确的权限。

# 设置目录的SGID权限,使子目录继承所属组
chmod g+s directory/
# 设置目录的默认ACL,使新创建的文件和子目录继承ACL
setfacl -m d:u:username:rwx,d:g:group:rx,d:o::r directory/

权限审计#

定期审计文件权限,发现和修复权限问题。

# 查找权限过于宽松的文件
find / -type f -perm -002 2>/dev/null # 其他用户可写
find / -type f -perm -022 2>/dev/null # 所属组和其他用户可写
# 查找权限过于严格的文件
find / -type f -perm -700 -user root 2>/dev/null # 只有root可访问
# 查找SUID/SGID文件
find / -perm -4000 -type f 2>/dev/null # SUID
find / -perm -2000 -type f 2>/dev/null # SGID
# 查找没有所有者的文件
find / -nouser 2>/dev/null
# 查找没有所属组的文件
find / -nogroup 2>/dev/null

权限备份和恢复#

定期备份文件权限,以便在权限丢失时恢复。

# 备份文件权限
getfacl -R directory/ > acl-backup.txt
# 恢复文件权限
setfacl --restore=acl-backup.txt
# 使用chmod备份和恢复权限
ls -la directory/ > permissions-backup.txt
# 从备份文件恢复权限(需要编写脚本)

特殊文件和目录的权限#

系统文件和目录#

# 系统配置文件
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
# 系统命令
chmod 755 /bin/*
chmod 755 /usr/bin/*
# 系统库文件
chmod 644 /lib/*
chmod 644 /usr/lib/*
# 系统日志目录
chmod 755 /var/log/
chmod 644 /var/log/*

用户主目录#

# 用户主目录
chmod 700 /home/username/
# 用户配置文件
chmod 600 /home/username/.bashrc
chmod 600 /home/username/.profile
chmod 600 /home/username/.ssh/
chmod 600 /home/username/.ssh/authorized_keys
chmod 600 /home/username/.ssh/id_rsa
chmod 644 /home/username/.ssh/id_rsa.pub

Web服务器文件和目录#

# Web服务器根目录
chmod 755 /var/www/html/
# Web服务器配置文件
chmod 644 /etc/apache2/apache2.conf
chmod 644 /etc/nginx/nginx.conf
# Web应用文件
chmod 644 /var/www/html/*.html
chmod 644 /var/www/html/*.css
chmod 644 /var/www/html/*.js
chmod 755 /var/www/html/cgi-bin/
chmod 755 /var/www/html/cgi-bin/*.cgi

数据库文件和目录#

# 数据库数据目录
chmod 700 /var/lib/mysql/
chmod 700 /var/lib/postgresql/
# 数据库配置文件
chmod 644 /etc/mysql/my.cnf
chmod 644 /etc/postgresql/postgresql.conf
# 数据库备份文件
chmod 600 /backup/mysql/
chmod 600 /backup/postgresql/

权限问题的排查和解决#

权限拒绝错误#

症状:用户尝试访问文件或目录时,收到”Permission denied”错误。

解决方案

  • 检查文件或目录的权限
  • 检查用户是否有适当的权限
  • 检查ACL设置
  • 检查文件系统挂载选项(如nosuid、noexec等)
# 检查文件权限
ls -l file.txt
# 检查用户所属的组
groups username
# 检查ACL
getfacl file.txt
# 检查文件系统挂载选项
mount | grep $(df -P file.txt | tail -1 | awk '{print $1}')

SUID/SGID权限问题#

症状:设置了SUID/SGID权限的文件无法正常工作。

解决方案

  • 检查文件是否有执行权限
  • 检查文件系统是否挂载了nosuid选项
  • 检查SELinux或AppArmor是否限制了权限
# 检查文件权限
ls -l file.txt
# 检查文件系统挂载选项
mount | grep $(df -P file.txt | tail -1 | awk '{print $1}')
# 检查SELinux状态
sestatus
# 检查AppArmor状态
sudo apparmor_status

ACL继承问题#

症状:新创建的文件和目录没有继承预期的ACL。

解决方案

  • 检查目录是否设置了默认ACL
  • 检查文件系统是否支持ACL
  • 检查文件系统是否挂载了acl选项
# 检查目录的默认ACL
getfacl directory/
# 检查文件系统是否支持ACL
grep ACL /boot/config-$(uname -r)
# 检查文件系统挂载选项
mount | grep $(df -P directory/ | tail -1 | awk '{print $1}')

权限备份和恢复问题#

症状:无法恢复文件权限。

解决方案

  • 检查备份文件是否完整
  • 检查文件系统是否支持ACL
  • 检查用户是否有适当的权限
# 检查备份文件
cat acl-backup.txt
# 检查文件系统是否支持ACL
grep ACL /boot/config-$(uname -r)
# 检查用户权限
whoami
groups

高级权限管理#

权限管理脚本#

#!/bin/bash
# 权限管理脚本
# 备份权限
backup_acl() {
local directory=$1
local backup_file=$2
getfacl -R "$directory" > "$backup_file"
echo "ACL backup created: $backup_file"
}
# 恢复权限
restore_acl() {
local backup_file=$1
setfacl --restore="$backup_file"
echo "ACL restored from: $backup_file"
}
# 设置Web服务器权限
set_web_permissions() {
local directory=$1
local user=$2
chown -R "$user":www-data "$directory"
find "$directory" -type d -exec chmod 755 {} \;
find "$directory" -type f -exec chmod 644 {} \;
find "$directory" -name "*.php" -o -name "*.cgi" | xargs chmod 755
echo "Web permissions set for: $directory"
}
# 设置数据库权限
set_db_permissions() {
local directory=$1
local user=$2
chown -R "$user":mysql "$directory"
find "$directory" -type d -exec chmod 700 {} \;
find "$directory" -type f -exec chmod 600 {} \;
echo "Database permissions set for: $directory"
}
# 主函数
main() {
case $1 in
backup)
backup_acl "$2" "$3"
;;
restore)
restore_acl "$2"
;;
web)
set_web_permissions "$2" "$3"
;;
db)
set_db_permissions "$2" "$3"
;;
*)
echo "Usage: $0 {backup|restore|web|db} [arguments]"
echo "Backup: $0 backup <directory> <backup_file>"
echo "Restore: $0 restore <backup_file>"
echo "Web: $0 web <directory> <user>"
echo "DB: $0 db <directory> <user>"
;;
esac
}
# 执行主函数
main "$@"

权限审计工具#

安装和使用lynis#

Lynis是一个开源的安全审计工具,可以检查系统配置和权限设置。

# 安装Lynis(Debian/Ubuntu)
sudo apt install -y lynis
# 安装Lynis(RHEL/CentOS)
sudo yum install -y epel-release
sudo yum install -y lynis
# 运行Lynis审计
sudo lynis audit system
# 查看Lynis报告
sudo lynis show details
# 查看Lynis建议
sudo lynis show suggestions

安装和使用tripwire#

Tripwire是一个开源的文件完整性监控工具,可以检测文件权限和内容的变化。

# 安装Tripwire(Debian/Ubuntu)
sudo apt install -y tripwire
# 安装Tripwire(RHEL/CentOS)
sudo yum install -y tripwire
# 初始化Tripwire
sudo tripwire-setup-keyfiles
# 生成Tripwire策略
sudo tripwire --init
# 运行Tripwire检查
sudo tripwire --check
# 查看Tripwire报告
sudo tripwire --print-report

实战贴士#

  1. 别用 777:每次想用chmod 777的时候,先停一下。给全部用户完全权限等于不设防,用chmod 755chmod 644就够了,99%的场景都够用。

  2. SUID 要慎用chmod u+s 设置SUID的程序,普通用户执行时会获得文件所有者的权限。这个权限很危险,能用sudo解决的问题就别用SUID。

  3. ACL 比传统权限灵活:传统权限只能设一个用户、一个组、一个other,ACL可以给任意用户和组设权限。比如Web服务器要给多个用户访问目录,用ACL比改群组方便得多。

  4. getfacl 备份权限getfacl -R /path > permissions.acl 可以备份整个目录的权限,配合setfacl --restore=permissions.acl恢复,迁移数据的时候很实用。

  5. 粘滞位防误删chmod +t /shared 给共享目录加上粘滞位,用户只能删自己的文件,多人协作目录必备。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时

目录