3520 字
18 分钟

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

2026-02-02
浏览量 加载中...

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

文件权限和ACL概述#

文件权限是Linux系统中保护文件和目录安全的重要机制,它控制着用户对文件和目录的访问权限。ACL(Access Control List,访问控制列表)是对传统文件权限的扩展,允许更细粒度的权限控制。本文将介绍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权限,所属组和其他用户没有权限

文件权限的查看#

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

文件权限的修改#

chmod命令#

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

Terminal window
# 使用符号模式修改权限
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命令用于修改文件和目录的所有者。

Terminal window
# 修改文件所有者
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命令用于修改文件和目录的所属组。

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

特殊权限#

SUID权限#

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

Terminal window
# 设置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)权限允许用户以文件所属组的身份执行文件,或在目录中创建的文件继承目录的所属组。

Terminal window
# 设置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目录。

Terminal window
# 设置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的安装#

Terminal window
# 检查系统是否支持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。

Terminal window
# 查看文件的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。

Terminal window
# 给特定用户添加权限
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。

Terminal window
# 设置目录的默认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

文件权限管理最佳实践#

最小权限原则#

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

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

权限继承#

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

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

权限审计#

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

Terminal window
# 查找权限过于宽松的文件
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

权限备份和恢复#

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

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

特殊文件和目录的权限#

系统文件和目录#

Terminal window
# 系统配置文件
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/*

用户主目录#

Terminal window
# 用户主目录
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服务器文件和目录#

Terminal window
# 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

数据库文件和目录#

Terminal window
# 数据库数据目录
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等)
Terminal window
# 检查文件权限
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是否限制了权限
Terminal window
# 检查文件权限
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选项
Terminal window
# 检查目录的默认ACL
getfacl directory/
# 检查文件系统是否支持ACL
grep ACL /boot/config-$(uname -r)
# 检查文件系统挂载选项
mount | grep $(df -P directory/ | tail -1 | awk '{print $1}')

权限备份和恢复问题#

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

解决方案

  • 检查备份文件是否完整
  • 检查文件系统是否支持ACL
  • 检查用户是否有适当的权限
Terminal window
# 检查备份文件
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是一个开源的安全审计工具,可以检查系统配置和权限设置。

Terminal window
# 安装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是一个开源的文件完整性监控工具,可以检测文件权限和内容的变化。

Terminal window
# 安装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

总结#

本文介绍了Linux系统中常用的文件权限和ACL管理命令和技巧,包括传统文件权限的管理、特殊权限的设置、ACL的使用以及权限管理的最佳实践等方面的内容。通过掌握这些命令和技巧,系统管理员可以更高效地管理文件权限和访问控制,提高系统的安全性和可靠性。

文件权限和访问控制是Linux系统安全的重要组成部分,需要系统管理员认真对待。在实际工作中,系统管理员应该遵循最小权限原则,合理设置文件权限,定期审计权限设置,及时发现和解决权限问题,确保系统的安全运行。

练习#

  1. 使用chmod命令修改文件和目录的权限,设置不同的权限组合。
  2. 使用chownchgrp命令修改文件和目录的所有者和所属组。
  3. 设置文件的SUID、SGID和Sticky Bit权限,观察其效果。
  4. 安装和使用ACL工具,设置文件和目录的ACL。
  5. 为目录设置默认ACL,验证新创建的文件和子目录是否继承这些ACL。
  6. 备份和恢复文件的ACL设置。
  7. 编写一个权限管理脚本,实现批量设置文件权限的功能。
  8. 使用Lynis或Tripwire工具审计系统的权限设置。
  9. 排查和解决常见的权限问题,如权限拒绝错误、ACL继承问题等。
  10. 制定一个文件权限管理策略,确保系统的安全性和可靠性。

支持与分享

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

赞助
Linux文件权限和ACL管理命令和技巧
https://blog.vanilla.net.cn/posts/2026-02-05-linux-file-permissions-acl/
作者
鹁鸪
发布于
2026-02-02
许可协议
CC BY-NC-SA 4.0

评论区

目录