文件权限管理

Linux是一个多用户多任务操作系统,权限管理是保障系统安全的核心机制。通过合理的权限设置,可以控制用户对文件和目录的访问,保护系统安全。本章将深入讲解Linux的用户、组和权限管理。


一、用户与组管理

1.1 用户管理

1.1.1 用户概念

Linux用户分类

用户类型 UID范围 说明
超级用户 0 root用户,拥有最高权限
系统用户 1-999 系统服务用户,如www-data、mysql
普通用户 1000+ 普通用户,权限受限

东巴文观点:Linux通过UID(用户ID)识别用户,用户名只是为了方便人类记忆。

1.1.2 用户信息文件

/etc/passwd - 用户信息文件

# 查看用户信息
cat /etc/passwd

# 输出示例:
# root:x:0:0:root:/root:/bin/bash
# dbw:x:1000:1000:dbw,,,:/home/dbw:/bin/bash

# 格式说明:
# 用户名:密码占位符:UID:GID:描述:主目录:Shell

/etc/shadow - 用户密码文件

# 查看密码信息(需要root权限)
sudo cat /etc/shadow

# 输出示例:
# root:$6$hash...:18500:0:99999:7:::
# dbw:$6$hash...:18500:0:99999:7:::

# 格式说明:
# 用户名:加密密码:最后修改日期:最小间隔:最大间隔:警告期:不活动期:过期日期:保留

东巴文提示:/etc/shadow文件权限为600,只有root可以读取,保护密码安全。

1.1.3 useradd命令 - 创建用户

# 创建用户
sudo useradd username

# 创建用户并创建主目录
sudo useradd -m username

# 创建用户并指定Shell
sudo useradd -m -s /bin/bash username

# 创建用户并指定UID
sudo useradd -u 1500 username

# 创建用户并指定组
sudo useradd -g groupname username

# 创建用户并指定附加组
sudo useradd -G group1,group2 username

# 创建系统用户
sudo useradd -r -s /usr/sbin/nologin systemuser

# 创建用户并设置注释
sudo useradd -c "User Description" username

完整示例

# 创建用户dbw
sudo useradd -m -s /bin/bash -G sudo,adm dbw

# 设置密码
sudo passwd dbw

东巴文最佳实践:创建用户时使用-m选项自动创建主目录。

1.1.4 usermod命令 - 修改用户

# 修改用户名
sudo usermod -l newname oldname

# 修改用户主目录
sudo usermod -d /new/home -m username

# 修改用户Shell
sudo usermod -s /bin/zsh username

# 修改用户UID
sudo usermod -u 2000 username

# 修改用户主组
sudo usermod -g newgroup username

# 添加附加组
sudo usermod -aG groupname username

# 锁定用户
sudo usermod -L username

# 解锁用户
sudo usermod -U username

# 设置用户过期时间
sudo usermod -e 2024-12-31 username

东巴文提示:使用-aG添加附加组时,-a表示追加,不会覆盖原有组。

1.1.5 userdel命令 - 删除用户

# 删除用户
sudo userdel username

# 删除用户及主目录
sudo userdel -r username

# 删除用户及所有相关文件
sudo userdel -r -f username

东巴文警告:删除用户前确保已备份重要数据。

1.1.6 passwd命令 - 管理密码

# 修改当前用户密码
passwd

# 修改其他用户密码(需要root)
sudo passwd username

# 锁定用户密码
sudo passwd -l username

# 解锁用户密码
sudo passwd -u username

# 删除用户密码
sudo passwd -d username

# 查看密码状态
sudo passwd -S username

# 设置密码过期
sudo passwd -e username

# 设置密码最小天数
sudo passwd -n 7 username

# 设置密码最大天数
sudo passwd -x 90 username

# 设置警告天数
sudo passwd -w 7 username

1.2 组管理

1.2.1 组概念

Linux组分类

组类型 说明
私有组 创建用户时自动创建的同名组
标准组 手动创建的组,可包含多个用户
系统组 系统服务使用的组

1.2.2 组信息文件

/etc/group - 组信息文件

# 查看组信息
cat /etc/group

# 输出示例:
# root:x:0:
# sudo:x:27:dbw,tom
# dbw:x:1000:

# 格式说明:
# 组名:密码占位符:GID:组成员列表

/etc/gshadow - 组密码文件

# 查看组密码信息(需要root权限)
sudo cat /etc/gshadow

# 格式说明:
# 组名:加密密码:组管理员:组成员

1.2.3 groupadd命令 - 创建组

# 创建组
sudo groupadd groupname

# 创建组并指定GID
sudo groupadd -g 1500 groupname

# 创建系统组
sudo groupadd -r systemgroup

1.2.4 groupmod命令 - 修改组

# 修改组名
sudo groupmod -n newname oldname

# 修改组GID
sudo groupmod -g 2000 groupname

1.2.5 groupdel命令 - 删除组

# 删除组
sudo groupdel groupname

东巴文提示:不能删除用户的主组,必须先删除用户或修改用户主组。

1.2.6 gpasswd命令 - 管理组成员

# 添加用户到组
sudo gpasswd -a username groupname

# 从组中删除用户
sudo gpasswd -d username groupname

# 设置组管理员
sudo gpasswd -A admin groupname

# 设置组密码
sudo gpasswd groupname

# 删除组密码
sudo gpasswd -r groupname

1.3 用户查询命令

1.3.1 id命令

# 查看用户信息
id

# 查看指定用户信息
id username

# 输出示例:
# uid=1000(dbw) gid=1000(dbw) groups=1000(dbw),27(sudo),100(users)

# 只显示UID
id -u

# 只显示GID
id -g

# 只显示组ID
id -G

# 只显示用户名
id -un

1.3.2 whoami命令

# 显示当前用户名
whoami

1.3.3 who命令

# 显示当前登录用户
who

# 输出示例:
# dbw      tty1         2024-01-01 10:00
# dbw      pts/0        2024-01-01 10:05 (192.168.1.100)

# 显示详细信息
who -a

1.3.4 w命令

# 显示登录用户及活动
w

# 输出示例:
#  10:00:00 up 1 day,  2:00,  2 users,  load average: 0.00, 0.01, 0.05
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# dbw      tty1     -                10:00    1:00   0.10s  0.10s -bash
# dbw      pts/0    192.168.1.100    10:05    0.00s  0.20s  0.05s w

1.3.5 last命令

# 显示登录历史
last

# 输出示例:
# dbw      pts/0        192.168.1.100    Mon Jan  1 10:00   still logged in
# reboot   system boot  5.4.0-42-generic Mon Jan  1 09:00   still running

# 显示指定用户登录历史
last dbw

# 显示重启历史
last reboot

# 显示失败登录
lastb

1.3.6 groups命令

# 显示当前用户所属组
groups

# 显示指定用户所属组
groups username

二、权限基础

2.1 权限分类

2.1.1 基本权限

Linux文件权限分为三类

权限 文件 目录 数字表示
读(r) 查看文件内容 列出目录内容 4
写(w) 修改文件内容 创建/删除文件 2
执行(x) 执行文件 进入目录 1

东巴文理解

  • 文件的读权限:可以查看文件内容(cat、less)
  • 文件的写权限:可以修改文件内容(vim、echo)
  • 文件的执行权限:可以执行文件(./script.sh)
  • 目录的读权限:可以列出目录内容(ls)
  • 目录的写权限:可以创建/删除文件(touch、rm)
  • 目录的执行权限:可以进入目录(cd)

2.1.2 权限对象

Linux权限针对三类对象

对象 说明 符号
所有者(user) 文件的所有者 u
组(group) 文件所属组的成员 g
其他用户(other) 其他所有用户 o
所有人(all) 所有用户 a

2.2 权限表示方法

2.2.1 符号表示法

查看权限

ls -l file.txt

# 输出示例:
# -rwxr-xr-- 1 dbw dbw 123 Jan 1 10:00 file.txt

# 权限解析:
# -        文件类型(-普通文件,d目录,l链接)
# rwx      所有者权限(读写执行)
# r-x      组权限(读执行)
# r--      其他用户权限(只读)

权限符号

-rwxr-xr--
│└┬┘└┬┘└┬┘
│ │  │  └─ 其他用户权限(r-- = 4)
│ │  └──── 组权限(r-x = 5)
│ └─────── 所有者权限(rwx = 7)
└───────── 文件类型(-)

2.2.2 数字表示法

权限数字计算

权限 二进制 八进制 说明
--- 000 0 无权限
--x 001 1 只有执行
-w- 010 2 只有写
-wx 011 3 写和执行
r-- 100 4 只有读
r-x 101 5 读和执行
rw- 110 6 读和写
rwx 111 7 读写执行

常用权限组合

权限 数字 说明
-rw------- 600 只有所有者可读写
-rw-r--r-- 644 所有者读写,其他用户只读
-rwx------ 700 只有所有者可读写执行
-rwxr-xr-x 755 所有者读写执行,其他用户读执行
-rwxrwxrwx 777 所有人可读写执行(不安全)

东巴文最佳实践

  • 私密文件:600(rw-------)
  • 普通文件:644(rw-r--r--)
  • 可执行文件:755(rwxr-xr-x)
  • 目录:755(rwxr-xr-x)

三、权限管理命令

3.1 chmod命令 - 修改权限

3.1.1 符号模式

基本语法

chmod [ugoa][+-=][rwx] 文件

参数说明

参数 说明
u 所有者(user)
g 组(group)
o 其他用户(other)
a 所有人(all)
+ 添加权限
- 移除权限
= 设置权限

示例

# 给所有者添加执行权限
chmod u+x script.sh

# 给组添加写权限
chmod g+w file.txt

# 给其他用户移除读权限
chmod o-r file.txt

# 给所有人添加执行权限
chmod a+x script.sh

# 设置所有者读写执行,组读执行,其他用户只读
chmod u=rwx,g=rx,o=r file.txt

# 同时设置多个权限
chmod u=rwx,go=rx file.txt

# 参考其他文件设置权限
chmod --reference=file1.txt file2.txt

3.1.2 数字模式

基本语法

chmod 数字 文件

示例

# 设置权限为755
chmod 755 script.sh

# 设置权限为644
chmod 644 file.txt

# 设置权限为600
chmod 600 private.txt

# 设置权限为700
chmod 700 dir/

# 设置权限为777(不推荐)
chmod 777 public/

3.1.3 递归修改

# 递归修改目录及其子目录
chmod -R 755 /var/www/html/

# 递归修改所有目录为755
find /var/www/html -type d -exec chmod 755 {} \;

# 递归修改所有文件为644
find /var/www/html -type f -exec chmod 644 {} \;

东巴文技巧:使用find命令分别设置目录和文件权限,更安全。

3.1.4 查看权限变化

# 显示修改过程
chmod -v 755 file.txt

# 只显示修改过的文件
chmod -c 755 file.txt

3.2 chown命令 - 修改所有者

3.2.1 基本用法

# 修改所有者
sudo chown user file.txt

# 修改所有者和组
sudo chown user:group file.txt

# 只修改组
sudo chown :group file.txt

# 递归修改
sudo chown -R user:group dir/

# 显示修改过程
sudo chown -v user file.txt

# 参考其他文件
sudo chown --reference=file1.txt file2.txt

3.2.2 实用示例

# 修改网站目录所有者
sudo chown -R www-data:www-data /var/www/html/

# 修改用户主目录所有者
sudo chown -R dbw:dbw /home/dbw/

# 修改文件所有者为当前用户
sudo chown $USER:$USER file.txt

东巴文提示:修改所有者需要root权限。

3.3 chgrp命令 - 修改所属组

# 修改组
sudo chgrp group file.txt

# 递归修改
sudo chgrp -R group dir/

# 显示修改过程
sudo chgrp -v group file.txt

# 参考其他文件
sudo chgrp --reference=file1.txt file2.txt

3.4 umask命令 - 默认权限

3.4.1 umask概念

umask:设置创建文件时的默认权限掩码。

计算方法

  • 文件默认权限:666 - umask
  • 目录默认权限:777 - umask

常用umask值

umask 文件权限 目录权限 说明
000 666 (rw-rw-rw-) 777 (rwxrwxrwx) 无限制
022 644 (rw-r--r--) 755 (rwxr-xr-x) 默认值
027 640 (rw-r-----) 750 (rwxr-x---) 更安全
077 600 (rw-------) 700 (rwx------) 最安全

3.4.2 使用umask

# 查看当前umask
umask

# 输出示例:
# 0022

# 设置umask
umask 027

# 创建文件测试
touch file.txt
ls -l file.txt
# 输出:-rw-r----- 1 dbw dbw ... file.txt

# 创建目录测试
mkdir dir1
ls -ld dir1
# 输出:drwxr-x--- 2 dbw dbw ... dir1

3.4.3 永久设置umask

编辑配置文件

# 编辑~/.bashrc
echo "umask 027" >> ~/.bashrc

# 或编辑/etc/profile(全局设置)
echo "umask 027" | sudo tee -a /etc/profile

# 使配置生效
source ~/.bashrc

东巴文最佳实践:服务器环境建议设置umask为027或077,提高安全性。


四、特殊权限

4.1 SUID

4.1.1 SUID概念

SUID(Set User ID):执行时以文件所有者身份运行。

特点

  • 只对可执行文件有效
  • 执行时获得文件所有者的权限
  • 权限显示为rws

东巴文比喻:SUID就像临时身份证,执行程序时暂时获得文件所有者的身份。

4.1.2 设置SUID

# 设置SUID
chmod u+s /usr/bin/passwd

# 数字方式设置SUID(4表示SUID)
chmod 4755 /usr/bin/passwd

# 查看SUID
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
#       ↑ s表示SUID

# 移除SUID
chmod u-s /usr/bin/passwd

4.1.3 SUID示例

passwd命令

# 查看passwd命令权限
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd

# 普通用户修改密码
passwd
# passwd命令以root身份运行,可以修改/etc/shadow

东巴文提示:SUID权限有安全风险,谨慎使用。

4.1.4 查找SUID文件

# 查找所有SUID文件
find / -perm -4000 2>/dev/null

# 查找所有SUID文件(详细)
find / -perm -4000 -exec ls -ld {} \; 2>/dev/null

4.2 SGID

4.2.1 SGID概念

SGID(Set Group ID)

  • 文件:执行时以文件所属组身份运行
  • 目录:新建文件继承目录的组

特点

  • 对文件和目录都有效
  • 权限显示为rws(文件)或rws(目录)

4.2.2 设置SGID

# 设置SGID(文件)
chmod g+s /usr/bin/wall

# 设置SGID(目录)
chmod g+s /shared/

# 数字方式设置SGID(2表示SGID)
chmod 2755 /shared/

# 查看SGID
ls -ld /shared/
# 输出:drwxrwsr-x 2 root dbw ... /shared/
#                   ↑ s表示SGID

# 移除SGID
chmod g-s /shared/

4.2.3 SGID示例

共享目录

# 创建共享目录
sudo mkdir /shared

# 设置组
sudo chgrp dbw /shared

# 设置SGID
sudo chmod 2775 /shared

# 在共享目录创建文件
cd /shared
touch file.txt

# 查看文件组
ls -l file.txt
# 输出:-rw-r--r-- 1 dbw dbw ... file.txt
#                   ↑ 组为dbw,继承自目录

东巴文应用:SGID常用于共享目录,确保新建文件继承目录的组。

4.3 粘滞位

4.3.1 粘滞位概念

粘滞位(Sticky Bit):目录中的文件只能由所有者删除。

特点

  • 只对目录有效
  • 权限显示为rwt
  • 常用于公共目录

东巴文比喻:粘滞位就像公共公告栏,所有人可以张贴,但只能撕下自己的。

4.3.2 设置粘滞位

# 设置粘滞位
chmod +t /tmp/

# 数字方式设置粘滞位(1表示粘滞位)
chmod 1777 /tmp/

# 查看粘滞位
ls -ld /tmp/
# 输出:drwxrwxrwt 15 root root ... /tmp/
#                   ↑ t表示粘滞位

# 移除粘滞位
chmod -t /tmp/

4.3.3 粘滞位示例

/tmp目录

# 查看/tmp目录权限
ls -ld /tmp/
# 输出:drwxrwxrwt 15 root root ... /tmp/

# 用户dbw创建文件
touch /tmp/dbw_file.txt

# 用户tom尝试删除
rm /tmp/dbw_file.txt
# 输出:rm: cannot remove '/tmp/dbw_file.txt': Operation not permitted

东巴文提示:粘滞位常用于公共目录,如/tmp,防止用户互相删除文件。

4.4 特殊权限组合

4.4.1 数字表示

特殊权限数字

特殊权限 数字 说明
SUID 4 执行时以所有者身份运行
SGID 2 执行时以组身份运行/继承组
粘滞位 1 只能删除自己的文件

组合示例

# SUID + 755
chmod 4755 /usr/bin/passwd

# SGID + 755
chmod 2755 /shared/

# 粘滞位 + 777
chmod 1777 /tmp/

# SUID + SGID + 755
chmod 6755 /usr/bin/someprogram

4.4.2 查找特殊权限文件

# 查找SUID文件
find / -perm -4000 2>/dev/null

# 查找SGID文件
find / -perm -2000 2>/dev/null

# 查找粘滞位目录
find / -perm -1000 2>/dev/null

# 查找所有特殊权限文件
find / -perm -7000 2>/dev/null

五、ACL权限

5.1 ACL概念

ACL(Access Control List):访问控制列表,提供更细粒度的权限控制。

特点

  • 可以对特定用户设置权限
  • 可以对特定组设置权限
  • 可以设置默认权限

东巴文观点:传统权限只能设置所有者、组、其他用户三类,ACL可以为任意用户设置权限。

5.2 启用ACL

5.2.1 检查ACL支持

# 查看文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep "Filesystem features"

# 或查看挂载选项
mount | grep acl

5.2.2 启用ACL

# 临时启用ACL
sudo mount -o remount,acl /

# 永久启用ACL(编辑fstab)
sudo vim /etc/fstab
# 添加acl选项
# /dev/sda1  /  ext4  defaults,acl  0  1

5.3 getfacl命令 - 查看ACL

# 查看文件ACL
getfacl file.txt

# 输出示例:
# # file: file.txt
# # owner: dbw
# # group: dbw
# user::rw-
# user:tom:r--          # 用户tom有读权限
# group::r--
# mask::rw-
# other::r--

# 查看目录ACL
getfacl dir/

# 递归查看
getfacl -R dir/

5.4 setfacl命令 - 设置ACL

5.4.1 设置用户ACL

# 给用户添加读写权限
setfacl -m u:tom:rw file.txt

# 给用户添加执行权限
setfacl -m u:tom:x script.sh

# 给用户移除权限
setfacl -x u:tom file.txt

# 给用户设置完整权限
setfacl -m u:tom:rwx file.txt

5.4.2 设置组ACL

# 给组添加读写权限
setfacl -m g:developers:rw file.txt

# 给组添加执行权限
setfacl -m g:developers:rx dir/

# 移除组权限
setfacl -x g:developers file.txt

5.4.3 设置默认ACL

# 设置目录默认ACL
setfacl -d -m u:tom:rwx dir/

# 查看默认ACL
getfacl dir/

# 输出示例:
# # file: dir/
# # owner: dbw
# # group: dbw
# user::rwx
# group::r-x
# other::r-x
# default:user::rwx
# default:user:tom:rwx    # 默认ACL
# default:group::r-x
# default:other::r-x

5.4.4 递归设置ACL

# 递归设置ACL
setfacl -R -m u:tom:rw dir/

# 递归移除ACL
setfacl -R -x u:tom dir/

5.4.5 备份和恢复ACL

# 备份ACL
getfacl -R dir/ > acl_backup.txt

# 恢复ACL
setfacl --restore=acl_backup.txt

东巴文最佳实践:ACL提供了更灵活的权限控制,但会增加管理复杂度,建议在必要时使用。


六、sudo与su

6.1 su命令 - 切换用户

6.1.1 基本用法

# 切换到root用户
su

# 切换到指定用户
su username

# 切换用户并加载环境变量
su - username

# 以指定用户执行命令
su -c "command" username

# 切换到root并执行命令
su -c "apt update"

6.1.2 su与su-区别

su:切换用户,但不切换环境变量

su dbw
pwd  # 仍然在原目录
echo $PATH  # 使用原用户的PATH

su -:切换用户,并切换环境变量

su - dbw
pwd  # 切换到用户主目录
echo $PATH  # 使用新用户的PATH

东巴文提示su -更彻底,推荐使用。

6.2 sudo命令 - 以超级用户执行

6.2.1 sudo概念

sudo:以超级用户或其他用户身份执行命令。

特点

  • 需要输入当前用户密码
  • 可以精确控制权限
  • 有日志记录

6.2.2 基本用法

# 以root身份执行命令
sudo command

# 以指定用户身份执行命令
sudo -u username command

# 以root身份启动Shell
sudo -i

# 以root身份执行命令并保持环境变量
sudo -E command

# 查看sudo权限
sudo -l

# 编辑文件
sudo vim /etc/hosts

# 后台执行
sudo -b command

6.2.3 配置sudo

编辑sudoers文件

# 使用visudo编辑(推荐)
sudo visudo

# 或直接编辑
sudo vim /etc/sudoers

sudoers文件格式

用户  主机=(运行身份)  命令

示例

# 允许用户dbw执行所有命令
dbw  ALL=(ALL)  ALL

# 允许用户dbw无密码执行所有命令
dbw  ALL=(ALL)  NOPASSWD: ALL

# 允许用户dbw只执行apt命令
dbw  ALL=(ALL)  /usr/bin/apt

# 允许用户dbw执行多个命令
dbw  ALL=(ALL)  /usr/bin/apt, /usr/bin/systemctl

# 允许组sudo执行所有命令
%sudo  ALL=(ALL)  ALL

# 允许用户dbw以www-data身份执行命令
dbw  ALL=(www-data)  ALL

东巴文警告:编辑sudoers文件要小心,语法错误可能导致无法使用sudo。

6.2.4 sudo日志

查看sudo日志

# Ubuntu/Debian
sudo cat /var/log/auth.log | grep sudo

# CentOS/RHEL
sudo cat /var/log/secure | grep sudo

6.3 sudo与su对比

特性 sudo su
密码 当前用户密码 目标用户密码
权限控制 精确 全部或无
日志记录
安全性
适用场景 日常管理 完全切换用户

东巴文最佳实践:推荐使用sudo,安全性更高。


七、本章小结

7.1 核心要点

✅ 理解用户和组的概念 ✅ 掌握用户和组管理命令 ✅ 熟练使用chmod、chown、chgrp ✅ 理解SUID、SGID、粘滞位 ✅ 学会使用sudo和su

7.2 验证清单

完成本章学习后,请确认您能够:

  • 创建、修改、删除用户和组
  • 使用chmod修改文件权限
  • 使用chown修改文件所有者
  • 理解特殊权限的作用
  • 配置sudo权限
  • 使用ACL进行精细权限控制

东巴文(db-w.cn) - 让Linux学习更简单