跳转至

用户与权限管理

概述

用户和权限是 Linux 安全的核心。理解 UID/GID、密码机制、文件权限和 sudo 授权,是进行 Linux 权限分析和安全加固的基础。本文系统梳理了 Linux 用户与权限管理的完整知识体系。

用户组 (Group)

用户组的概念

用户组是用户的集合,用于批量管理用户的权限。将多个用户加入同一组,可以方便地统一授权。

GID(Group ID)分类

类型 GID范围 说明
root组 0 超级管理员组,拥有系统最高权限
程序用户组(系统用户组) 1 - 999 安装系统服务时自动创建,如mysql组、nginx组
普通用户组 1000 - 65535 普通用户创建的组

专业解读:CentOS 7中系统用户/组的范围是1-999,CentOS 6及更早版本是1-499。查看系统所有组的信息存储在 /etc/group 文件中。

组相关命令

操作 命令 说明
查看全部组 cat /etc/group 查看组配置文件
查看用户的所属组 groups 显示当前用户所属的所有组
添加用户组 groupadd security 创建名为security的组
删除用户组 groupdel security 删除security组(组内不能有用户)

查看 /etc/group 文件格式

组名:密码占位符:GID:用户列表
示例:
wheel:x:10:root,admin

影子文件/etc/gshadow

组名:加密密码:组管理员:组附加用户列表


用户 (User)

UID(User ID)分类

类型 UID范围 说明
root用户 0 超级管理员,拥有系统绝对控制权
程序用户(系统用户) 1 - 999 运行系统服务使用的用户,如mysql、nginx、nobody
普通用户 1000 - 65535 由管理员创建的普通登录用户

专业解读:root用户的UID是0,反过来也成立:UID为0的用户就是root,即使用户名不是root。这是权限提升漏洞中常用的技巧。

用户相关命令

操作 命令 说明
添加用户 useradd 用户名 创建用户(需root权限)
设置密码 passwd 用户名 修改用户密码
删除用户 userdel 用户名 删除用户(-r 同时删除主目录)
修改用户信息 usermod 选项 用户名 修改用户属性
useradd wuya                   # 创建用户wuya
passwd wuya                    # 设置wuya的密码
userdel wuya                   # 删除用户(保留主目录)
userdel -r wuya                # 删除用户并删除其主目录
usermod -G wheel wuya          # 将wuya附加到wheel组

专业解读useradd 创建用户时,系统会:创建 /home/用户名 目录、从 /etc/skel 复制配置文件、在 /etc/passwd/etc/shadow 中添加记录。


用户管理相关文件

Linux将用户信息分散存储在多个文件中,形成用户数据库。

/etc/group - 组信息文件

组名:密码占位符:GID:用户列表

/etc/passwd - 用户信息文件

用户名:密码占位符:UID:GID:全名:home路径:shell工具

示例:

wuya:x:1000:1000:wuya:/home/wuya:/bin/bash

字段 说明
用户名 登录时使用的用户名
密码占位符 x 表示密码存储在shadow文件中
UID 用户ID
GID 主组ID
全名 用户全名或注释(GECOS字段)
home路径 用户主目录
shell工具 登录后使用的Shell

专业解读/etc/passwd 文件所有用户都可读(因为系统需要查询用户信息),但密码不直接存储在此,而是存放在 /etc/shadow 中(只有root可读),这是一种安全设计。

/etc/shadow - 影子密码文件

存储用户的加密密码和密码策略信息,只有root用户可读

用户名:加密密码:最后修改时间:最小修改间隔:密码有效期:警告天数:宽限天数:账号失效时间:保留字段
字段 说明
用户名 对应/etc/passwd中的用户名
加密密码 $id$salt$encrypted 格式
最后修改时间 1970年1月1日以来的天数
最小修改间隔 多少天内不能修改密码
密码有效期 密码多少天后必须更换
警告天数 过期前多少天提醒用户
宽限天数 过期后多少天仍可登录
账号失效时间 账号被禁用的日期

密码格式$id$salt$encrypted

id 加密方式
$1$ MD5
$2a$ Blowfish(某些发行版)
$5$ SHA-256
$6$ SHA-512(CentOS 7默认)

生成密码

openssl passwd -1 -salt admin 123456
# 输出:$1$admin$LClYcRe.ee8dQwgrFc5nz.

专业解读salt(盐值)是随机字符串,即使两个用户密码相同,由于salt不同,加密结果也不同,有效防止彩虹表攻击。

/etc/sudoers - sudo授权文件

控制哪些用户可以以root权限执行命令。

# 格式:
用户名 ALL=(ALL) ALL
# 示例:
wuya ALL=(ALL) ALL                    # wuya可以在所有主机以所有用户身份执行所有命令
kali ALL=(ALL) NOPASSWD: /bin/useradd  # kali可以免密执行useradd命令

使用sudo

sudo -l                        # 列出当前用户被授权的sudo命令
sudo command                   # 以root权限执行命令

专业解读:修改 /etc/sudoers 文件必须使用 visudo 命令,而不是直接vim。因为visudo会在保存时检查语法错误,防止因配置错误导致所有用户无法提权。


用户管理基本命令

命令 作用
id 查询用户账号身份标识(UID、GID、所属组)
finger 查询用户账号的登录属性
w / who 查询当前主机的用户登录情况
users 查询系统当前在线的用户名列表
whoami 查看当前登录的用户名
su 切换用户(switch user)
id wuya                        # 查看wuya用户的UID、GID等信息
whoami                         # 显示当前用户
su - root                      # 完全切换到root用户(加载root环境变量)
su root                        # 切换身份,但保留当前用户的环境变量

专业解读su -su 的区别很大。su - root 会加载root的完整环境(包括PATH、HOME等),相当于真正的root登录;而 su root 只是切换了用户身份,环境变量还是原来的,可能导致某些命令找不到。


文件和目录归属

Linux中每个文件和目录都有两个归属属性:

属性 说明
所有者 (Owner) 文件的拥有用户
所属组 (Group) 文件的拥有组

chown - 修改文件所有者和所属组

全称:change owner

chown wuya file.txt            # 将file.txt的所有者改为wuya
chown wuya:security file.txt   # 将所有者改为wuya,所属组改为security
chown -R wuya /usr/local/soft  # 递归修改目录及其子内容的所有者
chown -R redis:redis /usr/local/soft/redis   # 将redis目录及内容归属改为redis用户和组

专业解读-R(recursive)选项在修改目录权限时几乎必用。在生产环境中,安装软件(如Redis、MySQL、Nginx)后,通常需要将其安装目录的属主改为对应的服务用户,以提高安全性。


文件和目录权限

文件类型

ls -l 输出的第一个字符表示文件类型:

符号 类型 说明
- 普通文件 文本、二进制、数据文件
d 目录文件 文件夹
l 软链接 类似Windows快捷方式
b 块设备文件 硬盘、光驱等(按块读写)
c 字符设备文件 键盘、串口、终端等(按字符读写)
p 管道文件 进程间通信
s 套接口文件 网络通信(socket)

用户类别

权限针对三类用户设置:

符号 英文 含义
u user 文件所有者(owner)
g group 文件所属组(group)
o other 其他用户(非所有者且不属于该组的用户)
a all 所有用户(u+g+o)

权限类别

符号 英文 对文件的作用 对目录的作用
r read 可读(查看文件内容) 可浏览目录内容(ls)
w write 可写(修改文件内容) 可在目录中创建、删除、重命名文件
x execute 可执行(运行程序/脚本) 可进入目录(cd)
- - 没有该权限 没有该权限

专业解读:目录的 w 权限非常关键:即使你对目录中的某个文件没有任何权限,但只要对该目录有 w 权限,你就可以删除这个文件!这是Linux的设计特性。因此,控制目录的写权限非常重要。

权限的表示方法

符号表示法(文字法)

chmod g+w test.log             # 给组用户添加写权限
chmod o= test.log              # 移除其他用户的所有权限
chmod a-w test.log             # 移除所有用户的写权限
chmod u=rwx,g=rw,o=r test.log  # 分别设置u/g/o的权限

八进制数字表示法

权限 二进制 八进制
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
chmod 764 test.log             # u=rwx(7), g=rw-(6), o=r--(4)
chmod 755 script.sh            # 普通脚本常用权限
chmod 644 file.txt             # 普通文件常用权限
chmod 700 private.key          # 私钥文件,仅所有者可访问
chmod -R a=rw testdir/         # 递归设置目录及所有内容的权限

根据其他文件的权限设置

chmod --reference=1.log test.log   # 使test.log的权限与1.log相同

专业解读: - 常用权限组合: - 755 (rwxr-xr-x):可执行文件、目录的默认权限 - 644 (rw-r--r--):普通文本文件的默认权限 - 700 (rwx------):敏感私有文件 - 使用 -R 递归修改目录权限时,务必保留当前用户的执行和读取权限,否则可能导致无法进入目录或读取文件,甚至无法恢复!


安全测试视角:Linux 权限提升 权限提升(Privilege Escalation)是渗透测试的核心环节,常见路径包括: - SUID/SGID 滥用:查找系统上所有 SUID 文件,利用存在漏洞的程序提权

find / -perm -4000 -type f 2>/dev/null
- Sudo 配置错误sudo -l 查看当前用户可执行的 sudo 命令,寻找滥用路径 - 可写敏感文件:如果 /etc/passwd/etc/shadow 可被普通用户写入,可直接添加 root 用户 - 计划任务滥用:如果定时任务执行的脚本可被普通用户修改,可在脚本中植入后门 - 内核漏洞提权:检查内核版本是否存在已知 CVE 漏洞

安全测试视角:密码哈希破解 获取 /etc/shadow 文件后,可以使用工具进行离线密码破解:

# 使用 John the Ripper
unshadow /etc/passwd /etc/shadow > passwords.txt
john passwords.txt

# 使用 Hashcat(GPU 加速)
hashcat -m 1800 shadow.txt /usr/share/wordlists/rockyou.txt
防御方法:使用强密码策略、启用多因素认证、限制 shadow 文件访问权限。

安全测试视角:特殊权限位 除了 rwx,Linux 还有三种特殊权限位需要关注: - SUID (4000):以文件所有者身份执行,常见于 /usr/bin/passwd - SGID (2000):以文件所属组身份执行,或新创建文件继承目录所属组 - Sticky Bit (1000):目录中文件只能由所有者删除,如 /tmp 攻击者经常寻找配置不当的 SUID 程序作为提权路径。安全加固时应定期审计系统上的 SUID/SGID 文件。