Appearance
权限管理
本章将详细介绍 Linux 的权限管理系统,包括基本权限、特殊权限、ACL 访问控制列表以及文件属性,帮助你深入理解 Linux 的安全机制。
权限概述
基本权限模型
Linux 采用经典的 UGO(User-Group-Other)权限模型,每个文件有三组权限:
mermaid
graph LR
A[文件权限] --> B[所有者 User]
A --> C[所属组 Group]
A --> D[其他用户 Other]
B --> B1[rwx]
C --> C1[rwx]
D --> D1[rwx]权限含义
| 权限 | 文件含义 | 目录含义 | 数值 |
|---|---|---|---|
| r (read) | 读取文件内容 | 列出目录内容 | 4 |
| w (write) | 修改文件内容 | 创建/删除目录内文件 | 2 |
| x (execute) | 执行文件 | 进入目录 | 1 |
查看权限
bash
# 使用 ls -l 查看权限
ls -l file.txt
# 输出:-rw-r--r-- 1 user group 100 Jan 15 10:30 file.txt
# 权限解析:
# - : 文件类型(- 普通文件,d 目录,l 链接)
# rw- : 所有者权限(读、写、无执行)
# r-- : 所属组权限(只读)
# r-- : 其他用户权限(只读)
# 1 : 硬链接数
# user : 所有者
# group : 所属组
# 100 : 文件大小
# Jan 15...: 修改时间
# file.txt : 文件名
# 查看目录权限
ls -ld /home
# 输出:drwxr-xr-x 5 root root 4096 Jan 15 10:30 /home
# 查看所有文件的权限
ls -lachmod - 修改权限
符号模式
bash
# chmod [ugoa][+-=][rwx] file
# u - 所有者(user)
# g - 所属组(group)
# o - 其他用户(other)
# a - 所有用户(all,默认)
# + - 添加权限
# - - 移除权限
# = - 设置权限
# 示例
# 给所有者添加执行权限
chmod u+x script.sh
# 给所有用户添加读权限
chmod a+r file.txt
# 移除组的写权限
chmod g-w file.txt
# 设置所有者权限为读写执行
chmod u=rwx file.txt
# 同时设置多组权限
chmod u=rwx,g=rx,o=r file.txt
# 给所有用户添加执行权限
chmod +x script.sh
# 递归修改目录权限
chmod -R 755 /var/www/html数字模式
bash
# 数字模式使用三位八进制数表示权限
# 每位数字 = r(4) + w(2) + x(1)
# 常用权限组合:
# 7 = rwx (4+2+1)
# 6 = rw- (4+2)
# 5 = r-x (4+1)
# 4 = r-- (4)
# 0 = --- (0)
# 示例
# 设置权限为 rwxr-xr-x (755)
chmod 755 script.sh
# 设置权限为 rw-r--r-- (644)
chmod 644 file.txt
# 设置权限为 rwxrwxrwx (777) - 不推荐
chmod 777 file.txt
# 设置权限为 rwx------ (700)
chmod 700 private/
# 常用权限组合
chmod 755 directory/ # 目录:rwxr-xr-x
chmod 644 file.txt # 文件:rw-r--r--
chmod 600 ~/.ssh/id_rsa # 私钥:rw-------
chmod 700 ~/.ssh # SSH 目录:rwx------参考模式
bash
# 使用参考文件设置权限
chmod --reference=ref_file target_file
# 示例
chmod --reference=/etc/passwd /etc/shadowchown - 修改所有者
bash
# chown - 修改文件所有者和所属组
# 修改所有者
sudo chown user file.txt
# 修改所有者和所属组
sudo chown user:group file.txt
# 只修改所属组
sudo chown :group file.txt
# 递归修改
sudo chown -R user:group directory/
# 显示修改过程
sudo chown -v user file.txt
# 只修改所有者匹配的文件
sudo chown --from=olduser newuser file.txt
# 常用示例
sudo chown root:root /etc/hosts
sudo chown -R www-data:www-data /var/www/html
sudo chown user: file.txt # 使用用户的默认组chgrp - 修改所属组
bash
# chgrp - 修改文件所属组
# 修改所属组
sudo chgrp group file.txt
# 递归修改
sudo chgrp -R group directory/
# 显示修改过程
sudo chgrp -v group file.txt
# 参考文件
sudo chgrp --reference=ref_file target_file特殊权限
SUID (Set User ID)
bash
# SUID - 执行文件时以文件所有者身份运行
# SUID 权限值:4
# 显示为:rws------(s 代替 x)
# 设置 SUID
chmod u+s /usr/bin/passwd
# 或
chmod 4755 /usr/bin/passwd
# 移除 SUID
chmod u-s /usr/bin/passwd
# 查找 SUID 文件
find / -perm -4000 2>/dev/null
# 示例:/usr/bin/passwd
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
# 普通用户执行 passwd 时以 root 身份运行,可以修改 /etc/shadow
# 注意:SUID 有安全风险,谨慎使用SGID (Set Group ID)
bash
# SGID - 文件执行时以文件所属组身份运行
# 目录下创建的文件继承目录的组
# SGID 权限值:2
# 显示为:rwxrws---(s 代替 x)
# 设置 SGID
chmod g+s directory/
# 或
chmod 2775 directory/
# 移除 SGID
chmod g-s directory/
# 查找 SGID 文件
find / -perm -2000 2>/dev/null
# 常用场景:共享目录
# 创建共享目录
sudo mkdir /shared
sudo chown root:developers /shared
sudo chmod 2775 /shared
# 在 /shared 中创建的文件自动属于 developers 组Sticky Bit
bash
# Sticky Bit - 目录中的文件只能被所有者删除
# Sticky Bit 权限值:1
# 显示为:rwxrwxrwt(t 代替 x)
# 设置 Sticky Bit
chmod +t /tmp
# 或
chmod 1777 /tmp
# 移除 Sticky Bit
chmod -t /tmp
# 查找 Sticky Bit 目录
find / -perm -1000 2>/dev/null
# 示例:/tmp 目录
ls -ld /tmp
# 输出:drwxrwxrwt 15 root root 4096 ... /tmp
# 用户只能删除自己创建的文件
# 常用场景:公共临时目录特殊权限组合
bash
# 同时设置多个特殊权限
# SUID + SGID
chmod 6755 file
# SUID + Sticky Bit
chmod 5755 directory/
# 常用权限组合示例
chmod 4755 /usr/bin/sudo # SUID + rwxr-xr-x
chmod 2775 /shared # SGID + rwxrwxr-x
chmod 1777 /tmp # Sticky + rwxrwxrwxACL - 访问控制列表
ACL(Access Control List)提供了比传统 UGO 更细粒度的权限控制。
启用 ACL
bash
# 检查文件系统是否支持 ACL
tune2fs -l /dev/sda1 | grep "Default mount options"
# 挂载时启用 ACL
mount -o acl /dev/sda1 /mnt
# 在 /etc/fstab 中配置
/dev/sda1 / ext4 defaults,acl 0 1
# 安装 ACL 工具(如果未安装)
sudo apt install acl # Debian/Ubuntu
sudo yum install acl # RHEL/CentOSgetfacl - 查看 ACL
bash
# getfacl - 查看文件 ACL
# 查看文件 ACL
getfacl file.txt
# 输出示例:
# file: file.txt
# owner: user
# group: group
# user::rw-
# user:john:rw-
# group::r--
# mask::rw-
# other::r--
# 查看目录 ACL
getfacl directory/
# 递归查看
getfacl -R directory/
# 显示绝对权限
getfacl -a file.txtsetfacl - 设置 ACL
bash
# setfacl - 设置文件 ACL
# 为用户添加权限
sudo setfacl -m u:john:rw file.txt
# 为组添加权限
sudo setfacl -m g:developers:rx directory/
# 为所有用户设置权限
sudo setfacl -m u::rwx,g::rx,o::r file.txt
# 删除用户 ACL
sudo setfacl -x u:john file.txt
# 删除组 ACL
sudo setfacl -x g:developers file.txt
# 删除所有 ACL
sudo setfacl -b file.txt
# 递归设置
sudo setfacl -R -m u:john:rx directory/
# 设置默认 ACL(新文件继承)
sudo setfacl -d -m u:john:rx directory/
# 设置 mask(有效权限上限)
sudo setfacl -m m::rw file.txt
# 从文件恢复 ACL
sudo setfacl --restore=acl_backup.txt
# 复制 ACL
getfacl source.txt | setfacl --set-file=- target.txtACL 示例
bash
# 场景:设置共享项目目录
# 创建目录
sudo mkdir /project
# 设置基本权限
sudo chmod 770 /project
# 设置组权限
sudo setfacl -m g:developers:rwx /project
sudo setfacl -m g:managers:rwx /project
# 设置默认 ACL(新文件继承)
sudo setfacl -d -m g:developers:rwx /project
sudo setfacl -d -m g:managers:rwx /project
# 设置特定用户权限
sudo setfacl -m u:john:rwx /project
# 查看 ACL
getfacl /project文件属性
lsattr - 查看属性
bash
# lsattr - 查看文件属性
# 查看文件属性
lsattr file.txt
# 输出:----i--------e-- file.txt
# 查看目录下所有文件
lsattr directory/
# 递归查看
lsattr -R directory/
# 显示所有属性
lsattr -a file.txtchattr - 设置属性
bash
# chattr - 设置文件属性
# 常用属性:
# i - 不可修改(immutable),不能删除、重命名、修改
# a - 只能追加(append-only),不能删除或修改内容
# s - 删除时安全擦除
# u - 删除时可恢复
# c - 自动压缩
# d - 不被 dump 备份
# e - 使用 extents
# 设置不可修改属性
sudo chattr +i /etc/resolv.conf
# 移除不可修改属性
sudo chattr -i /etc/resolv.conf
# 设置只追加属性
sudo chattr +a /var/log/secure.log
# 移除只追加属性
sudo chattr -a /var/log/secure.log
# 递归设置
sudo chattr -R +i /etc/important/
# 查看属性
lsattr /etc/resolv.conf
# 输出:----i--------e-- /etc/resolv.conf属性应用场景
bash
# 保护重要配置文件
sudo chattr +i /etc/passwd
sudo chattr +i /etc/shadow
sudo chattr +i /etc/sudoers
# 保护日志文件(只允许追加)
sudo chattr +a /var/log/auth.log
# 查找设置了属性的文件
find / -type f -exec lsattr {} \; 2>/dev/null | grep -E '^[^ ]*[ia]'umask - 默认权限
umask 概念
bash
# umask - 设置创建文件的默认权限
# 查看当前 umask
umask
# 输出:0002
# 查看符号形式
umask -S
# 输出:u=rwx,g=rwx,o=rx
# umask 计算方法:
# 文件默认权限 = 666 - umask
# 目录默认权限 = 777 - umask
# 示例:umask 002
# 文件权限:666 - 002 = 664 (rw-rw-r--)
# 目录权限:777 - 002 = 775 (rwxrwxr-x)设置 umask
bash
# 临时设置 umask
umask 022
# 文件权限:666 - 022 = 644 (rw-r--r--)
# 目录权限:777 - 022 = 755 (rwxr-xr-x)
# 在配置文件中设置
echo "umask 022" >> ~/.bashrc
# 系统级配置
echo "umask 022" >> /etc/profile
# 常用 umask 值:
# 002 - 文件 664,目录 775(组共享)
# 022 - 文件 644,目录 755(默认)
# 027 - 文件 640,目录 750(更安全)
# 077 - 文件 600,目录 700(最安全)权限实践
安全权限设置
bash
# 敏感文件权限
chmod 600 ~/.ssh/id_rsa # SSH 私钥
chmod 644 ~/.ssh/id_rsa.pub # SSH 公钥
chmod 700 ~/.ssh # SSH 目录
chmod 600 ~/.bash_history # 命令历史
chmod 600 ~/.netrc # 网络配置
# 配置文件权限
chmod 644 /etc/passwd # 用户信息
chmod 600 /etc/shadow # 密码信息
chmod 644 /etc/group # 组信息
chmod 600 /etc/gshadow # 组密码
chmod 600 /etc/sudoers # sudo 配置
# Web 目录权限
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html权限问题排查
bash
# 查看文件权限
ls -la file.txt
# 查看当前用户
id
# 查看用户组
groups
# 测试权限
# 测试读权限
cat file.txt
# 测试写权限
echo "test" >> file.txt
# 测试执行权限
./script.sh
# 测试目录权限
cd directory/
ls directory/
# 查看访问被拒绝的原因
namei -l /path/to/file小结
本章介绍了 Linux 权限管理系统:
| 内容 | 命令 | 功能 |
|---|---|---|
| 基本权限 | chmod | 修改文件权限 |
| 所有者 | chown, chgrp | 修改所有者和组 |
| 特殊权限 | SUID, SGID, Sticky | 特殊权限控制 |
| ACL | getfacl, setfacl | 细粒度权限控制 |
| 文件属性 | lsattr, chattr | 文件属性控制 |
| 默认权限 | umask | 设置默认权限 |
常用命令速查
bash
# 权限修改
chmod 755 script.sh # 设置权限
chmod +x script.sh # 添加执行权限
chmod -R 644 directory/ # 递归设置
# 所有者修改
chown user:group file.txt # 修改所有者和组
chown -R user directory/ # 递归修改
# ACL
getfacl file.txt # 查看 ACL
setfacl -m u:john:rw file.txt # 设置 ACL
# 属性
lsattr file.txt # 查看属性
chattr +i file.txt # 设置不可修改下一步
下一章我们将学习 软件包管理,了解如何在 Linux 中安装、更新和管理软件包。
