Skip to content

权限管理

本章将详细介绍 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 -la

chmod - 修改权限

符号模式

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/shadow

chown - 修改所有者

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 + rwxrwxrwx

ACL - 访问控制列表

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/CentOS

getfacl - 查看 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.txt

setfacl - 设置 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.txt

ACL 示例

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.txt

chattr - 设置属性

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特殊权限控制
ACLgetfacl, 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 中安装、更新和管理软件包。