cxl
Published on 2026-08-30 / 2 Visits
0
0

linux-权限

Linux 用户、用户组与权限:从入门到实践

理解 Linux 权限模型,是掌握 Linux 系统管理的基石

为什么需要理解 Linux 权限?

Linux 是一个多用户、多任务的操作系统。无论是服务器还是个人桌面,权限管理都直接关系到系统安全。想象一下:如果任何人都能修改系统配置文件,或者读取你的私人数据,后果将不堪设想(其实是在我使用过程当中记不起想着命令了—_—)。

Linux 权限模型的核心思想很简单: 可以对 什么资源什么操作

一、用户管理基础

1.1 用户相关文件

Linux 的用户信息存储在以下三个关键文件中:

文件 作用
/etc/passwd 存储用户账户信息
/etc/shadow 存储用户密码(加密形式)
/etc/group 存储用户组信息

查看用户信息的命令:

# 查看当前登录用户
whoami

# 查看当前用户ID信息
id

# 查看所有用户
cat /etc/passwd

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

1.2 用户管理操作

创建用户

# 基本创建
sudo useradd alice

# 指定选项创建(推荐)
sudo useradd -m -s /bin/bash alice
# -m: 创建家目录
# -s: 指定默认shell

# 设置密码
sudo passwd alice

修改和删除用户

# 修改用户信息
sudo usermod -s /bin/zsh alice  # 修改shell
sudo usermod -aG sudo alice     # 追加到sudo组

# 删除用户
sudo userdel -r alice  # -r: 同时删除家目录和邮件池

1.3 /etc/passwd 文件格式

alice:x:1001:1001:Alice,,,:/home/alice:/bin/bash

各字段含义:

  1. 用户名
  2. 密码占位符(x表示密码存储在shadow中)
  3. UID(用户ID)
  4. GID(主组ID)
  5. 用户描述信息
  6. 家目录路径
  7. 登录Shell

二、用户组管理

2.1 用户组的作用

用户组方便管理员批量管理权限。例如:将开发人员加入 dev 组,统一赋予项目目录的读写权限。

2.2 组管理操作

# 创建组
sudo groupadd developers

# 添加用户到组
sudo usermod -aG developers alice

# 从组中移除用户
sudo gpasswd -d alice developers

# 删除组
sudo groupdel developers

# 查看用户所属组
groups alice
# 或者
id alice

2.3 主要组 vs 附加组

  • 主要组(Primary Group):用户在 /etc/passwd 中指定的组。用户创建文件时,默认所属组为主要组。
  • 附加组(Supplementary Groups):用户额外加入的组,用于获取额外权限。
# 修改用户的主要组
sudo usermod -g developers alice

三、Linux 权限模型

3.1 权限的三类对象

每个文件/目录有三种访问者:

角色 标识 说明
所有者 u (user) 文件创建者
所属组 g (group) 文件所属组的成员
其他人 o (other) 以上两者之外的任何人

3.2 权限的三种操作

权限 对文件的作用 对目录的作用
读 (r=4) 查看文件内容 列出目录内容
写 (w=2) 修改文件内容 创建/删除文件
执行 (x=1) 运行可执行文件 进入目录

3.3 查看权限

ls -l
# 输出示例:
# -rw-r--r-- 1 alice developers 1024 Jan 15 10:00 file.txt
# drwxr-x--- 2 alice developers 4096 Jan 15 10:00 folder/

权限字符串 -rw-r--r-- 分解:

-  rw-  r--  r--
│  │    │    │
│  │    │    └── 其他人权限 (只读)
│  │    └─────── 组权限 (只读)
│  └──────────── 所有者权限 (读写)
└─────────────── 文件类型 (-普通文件, d目录, l链接)

3.4 修改权限

符号模式:

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

# 移除组的写权限
chmod g-w file.txt

# 为所有用户添加读权限
chmod a+r file.txt

# 设置精确权限(所有者读写,组读,其他人无权限)
chmod u=rw,g=r,o= file.txt

数字模式(八进制):

# 权限的数字表示
# r=4, w=2, x=1
# rwx = 7, r-x = 5, r-- = 4

chmod 755 script.sh  # 所有者rwx,组r-x,其他人r-x
chmod 644 file.txt   # 所有者rw-,组r--,其他人r--
chmod 700 secret/    # 只有所有者可读写执行

3.5 修改所有者和组

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

# 同时修改所有者和组
sudo chown alice:developers file.txt

# 递归修改目录
sudo chown -R alice:developers /project/

四、特殊权限

4.1 SUID (Set User ID)

当可执行文件设置SUID位后,任何用户执行该文件时,都以文件所有者的身份运行。

# 典型例子:/usr/bin/passwd
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ...

# 设置SUID(在所有者执行权限位置显示s)
chmod u+s /path/to/program
chmod 4755 /path/to/program  # 4表示SUID

4.2 SGID (Set Group ID)

  • 作用于文件:以文件所属组的身份执行
  • 作用于目录:新创建的文件继承目录的所属组
# 设置SGID(在组执行权限位置显示s)
chmod g+s /shared/directory/
chmod 2755 /shared/directory/

4.3 Sticky Bit

只对目录有效,防止用户删除其他人创建的文件(典型应用:/tmp

ls -ld /tmp
# drwxrwxrwt 10 root root ...

# 设置Sticky Bit(在其他执行权限位置显示t)
chmod o+t /shared/temp/
chmod 1777 /shared/temp/

五、实战场景

场景1:创建共享项目目录

# 创建共享组
sudo groupadd project_alpha

# 将团队成员加入组
sudo usermod -aG project_alpha alice
sudo usermod -aG project_alpha bob

# 创建项目目录
sudo mkdir /srv/project_alpha

# 设置权限
sudo chown root:project_alpha /srv/project_alpha
sudo chmod 2775 /srv/project_alpha
# 2=SGID,确保新建文件继承组
# 7=所有者rwx,7=组rwx,5=其他人r-x

场景2:安全部署Web应用

# 文件权限原则:最小权限
# Web目录权限示例

# 所有者为Web用户,组为开发者
sudo chown -R www-data:developers /var/www/myapp/

# 目录:755 (所有者读写执行,其他人只读执行)
find /var/www/myapp/ -type d -exec chmod 755 {} \;

# 文件:644 (所有者读写,其他人只读)
find /var/www/myapp/ -type f -exec chmod 644 {} \;

# 上传目录需要写权限
chmod 775 /var/www/myapp/uploads/

场景3:用户切换和权限提升

# 切换用户(需要密码)
su - alice

# 以其他用户身份执行命令
sudo -u alice whoami

# 查看当前用户可执行的sudo命令
sudo -l

# 临时获取root shell
sudo -i

六、常见问题排查

6.1 “Permission denied”

排查步骤:

  1. 检查你是谁:whoami
  2. 检查文件权限:ls -la <file>
  3. 检查父目录权限(特别是执行权限)
  4. 检查文件是否被锁定:lsof <file>

6.2 无法进入目录

进入目录需要执行权限(x),不只是读权限。

# 修复:添加执行权限
chmod +x /path/to/directory

6.3 新建文件权限不对

检查umask设置:

# 查看当前umask
umask
# 022 表示新建文件权限为 755 (目录) / 644 (文件)

# 临时设置
umask 002  # 允许同组用户写

# 永久设置(在 ~/.bashrc 中添加)
echo "umask 002" >> ~/.bashrc

七、最佳实践总结

  1. 最小权限原则:只赋予完成任务所需的最小权限
  2. 定期审查:使用 lastlastlogwho 等命令监控用户活动
  3. 使用组管理:通过组管理权限,而非逐个用户设置
  4. 谨慎使用sudo/etc/sudoers 配置要精细,避免 ALL=(ALL) ALL
  5. 定期修改密码:尤其是高权限账户
  6. 审计关键文件/etc/passwd/etc/shadow/etc/sudoers 的变更

八、快速参考卡片

需求 命令
创建用户 sudo useradd -m -s /bin/bash username
删除用户 sudo userdel -r username
修改密码 sudo passwd username
创建组 sudo groupadd groupname
加入组 sudo usermod -aG groupname username
修改权限 chmod [ugo][+-=][rwx] file
修改所有者和组 sudo chown user:group file
查看权限 ls -la
查看用户信息 id
切换用户 su - username
以root执行 sudo command

掌握了 Linux 用户、用户组和权限管理,你就拥有了构建安全、稳定系统的基础能力。在实际工作中,谨慎而合理地分配权限,是系统管理员最重要的职责之一。

本文是对 Linux 权限模型的系统性梳理,欢迎收藏和分享。如有任何问题或建议,欢迎在评论区讨论交流!


Comment