前言
在多用户操作系统中,用户管理和权限控制是保障系统安全的核心机制。Linux作为一个多用户、多任务的操作系统,拥有完善的用户权限管理体系。理解用户和组的概念,掌握权限设置方法,是每个Linux管理员必备的技能。本文将系统讲解Linux的用户管理机制、权限模型和提权方法,帮助你建立完整的安全管理知识体系。
文章目录
- 前言
- 一、Linux用户和组基础
-
- [1.1 用户和组的概念](#1.1 用户和组的概念)
- [1.2 查看用户信息](#1.2 查看用户信息)
- [1.3 查看登录用户](#1.3 查看登录用户)
- [1.4 查看用户进程](#1.4 查看用户进程)
- [1.5 用户切换](#1.5 用户切换)
- [1.6 用户间通信](#1.6 用户间通信)
- 二、用户配置文件详解
-
- [2.1 /etc/passwd - 用户信息文件](#2.1 /etc/passwd - 用户信息文件)
- [2.2 /etc/shadow - 密码文件](#2.2 /etc/shadow - 密码文件)
- [2.3 /etc/group - 组信息文件](#2.3 /etc/group - 组信息文件)
- 三、用户管理操作
-
- [3.1 添加用户 - useradd命令](#3.1 添加用户 - useradd命令)
- [3.2 设置用户密码 - passwd命令](#3.2 设置用户密码 - passwd命令)
- [3.3 Shell类型的影响](#3.3 Shell类型的影响)
- [3.4 删除用户](#3.4 删除用户)
- 四、权限管理基础
-
- [4.1 权限提升 - sudo命令](#4.1 权限提升 - sudo命令)
- [4.2 配置sudo权限 - sudoers文件](#4.2 配置sudo权限 - sudoers文件)
- [4.3 文件权限模型 - UGO](#4.3 文件权限模型 - UGO)
- [4.4 修改权限 - chmod命令](#4.4 修改权限 - chmod命令)
- [4.5 修改所有者 - chown命令](#4.5 修改所有者 - chown命令)
- [4.6 修改属组 - chgrp命令](#4.6 修改属组 - chgrp命令)
- 五、权限管理实战案例
-
- [5.1 创建共享目录](#5.1 创建共享目录)
- [5.2 保护敏感文件](#5.2 保护敏感文件)
- [5.3 设置脚本可执行](#5.3 设置脚本可执行)
- [5.4 修复权限问题](#5.4 修复权限问题)
- 六、常见问题与解决方案
-
- [6.1 sudo权限被拒绝](#6.1 sudo权限被拒绝)
- [6.2 权限不足无法操作文件](#6.2 权限不足无法操作文件)
- [6.3 SSH登录后Shell功能受限](#6.3 SSH登录后Shell功能受限)
- [6.4 忘记root密码](#6.4 忘记root密码)
- 七、安全最佳实践
-
- [7.1 用户管理安全建议](#7.1 用户管理安全建议)
- [7.2 权限管理安全建议](#7.2 权限管理安全建议)
- 总结
一、Linux用户和组基础
1.1 用户和组的概念
用户(User):
- Linux系统中的账户标识
- 每个用户拥有唯一的用户ID(UID)
- 用户信息存储在
/etc/passwd文件中 - 用户密码存储在
/etc/shadow文件中(加密)
组(Group):
- 用户的集合,用于批量管理权限
- 每个组拥有唯一的组ID(GID)
- 组信息存储在
/etc/group文件中 - 一个用户可以属于多个组
用户分类:
- root用户: 超级管理员,UID=0,拥有最高权限
- 系统用户: UID通常为1-999,运行系统服务
- 普通用户: UID通常从1000开始,日常使用的账户
1.2 查看用户信息
查看当前用户信息 - id命令
bash
id
输出示例:
uid=1000(kali) gid=1000(kali) groups=1000(kali),27(sudo),118(docker)
输出解释:
uid=1000(kali): 用户ID为1000,用户名是kaligid=1000(kali): 主组ID为1000,组名是kaligroups=...: 所属的所有组(主组+附加组)
查看指定用户信息:
bash
id kali # 查看kali用户信息
id root # 查看root用户信息
id username # 查看任意用户信息
查看root用户信息示例:
bash
id root
# uid=0(root) gid=0(root) groups=0(root)
可以看到root用户的UID和GID都是0,这是系统最高权限的标识。
1.3 查看登录用户
who命令 - 查看当前登录用户
bash
who
输出示例:
kali tty1 2024-01-15 10:30
admin pts/0 2024-01-15 11:45 (192.168.1.100)
user1 pts/1 2024-01-15 12:20 (10.0.0.50)
输出解释:
- 第一列: 用户名
- 第二列: 终端类型(tty是本地终端,pts是远程终端)
- 第三列: 登录时间
- 第四列: 登录来源IP(远程登录时显示)
其他查看登录的命令:
bash
w # 显示谁登录了以及他们在做什么
users # 显示当前登录的用户名列表
last # 显示最近登录的用户历史
lastlog # 显示所有用户最后登录时间
w命令示例(更详细):
bash
w
输出:
14:30:25 up 3 days, 5:20, 3 users, load average: 0.15, 0.20, 0.18
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
kali tty1 - 10:30 3:59 0.50s 0.50s -bash
admin pts/0 192.168.1.100 11:45 0.00s 0.30s 0.01s w
1.4 查看用户进程
查看所有进程 - ps命令
bash
ps aux | less
命令解析:
ps: 进程状态命令a: 显示所有用户的进程u: 以用户为主的格式显示x: 显示没有控制终端的进程| less: 分页查看
输出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169104 11492 ? Ss Jan10 0:05 /sbin/init
kali 1234 0.5 2.3 456789 98765 pts/0 S+ 14:20 0:10 python3 script.py
查看特定用户的进程:
bash
ps aux | grep kali # 查看kali用户的进程
ps aux | grep root # 查看root用户的进程
ps aux | grep [用户名] # 查看指定用户的进程
查看SSH相关进程:
bash
ps aux | grep ssh
输出示例:
root 1234 0.0 0.1 12345 6789 ? Ss 10:30 0:00 /usr/sbin/sshd -D
kali 5678 0.0 0.2 23456 8901 ? S 11:45 0:00 sshd: kali@pts/0
这可以看到谁通过SSH登录了系统。
1.5 用户切换
切换用户 - su命令
bash
su username # 切换到指定用户(需要输入该用户密码)
su - username # 切换用户并加载其环境变量
su # 切换到root用户(需要root密码)
su - # 切换到root并加载环境
exit # 退出当前用户,返回之前的用户
实际操作示例:
bash
# 当前是kali用户
id
# uid=1000(kali) gid=1000(kali)
# 切换到root用户
su root
# 输入root密码
# 验证切换成功
id
# uid=0(root) gid=0(root)
# 退出root,返回kali
exit
# 再次验证
id
# uid=1000(kali) gid=1000(kali)
su vs su -的区别:
bash
su username # 只切换用户,保留当前环境变量
su - username # 切换用户并加载目标用户的环境变量(推荐)
1.6 用户间通信
wall命令 - 向所有登录用户发送消息
bash
wall 'System will reboot in 5 minutes'
wall 'haha'
效果: 所有登录的用户终端都会收到这条消息。
其他通信命令:
bash
write username # 向特定用户发送消息
mesg n # 禁止接收消息
mesg y # 允许接收消息
二、用户配置文件详解
2.1 /etc/passwd - 用户信息文件
这个文件存储所有用户的基本信息,每个用户占一行。
查看文件:
bash
cat /etc/passwd
文件格式(冒号分隔):
username:x:UID:GID:comment:home_directory:shell
实际示例:
root:x:0:0:root:/root:/bin/bash
kali:x:1000:1000:Kali User:/home/kali:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
字段说明:
| 位置 | 字段 | 说明 | 示例 |
|---|---|---|---|
| 1 | 用户名 | 登录系统的用户名 | root, kali |
| 2 | 密码占位符 | 总是x,实际密码在/etc/shadow |
x |
| 3 | UID | 用户ID | 0(root), 1000(普通用户) |
| 4 | GID | 主组ID | 0, 1000 |
| 5 | 注释 | 用户描述信息 | Kali User |
| 6 | 家目录 | 用户主目录 | /home/kali |
| 7 | Shell | 登录后使用的Shell | /bin/bash, /bin/sh |
重要说明:
- UID=0 表示root权限
/usr/sbin/nologin或/bin/false表示禁止登录- 系统用户通常家目录为
/nonexistent或特定服务目录
2.2 /etc/shadow - 密码文件
这个文件存储加密后的用户密码,只有root用户可以读取。
查看文件(需要root权限):
bash
sudo cat /etc/shadow
文件格式:
username:encrypted_password:last_change:min:max:warn:inactive:expire:reserved
实际示例:
root:$6$xyz...(加密密码):19000:0:99999:7:::
kali:$6$abc...(加密密码):19010:0:99999:7:::
user1:!:19020:0:99999:7:::
字段说明:
| 字段 | 说明 |
|---|---|
| 用户名 | 对应/etc/passwd中的用户 |
| 加密密码 | $6$开头表示SHA-512加密,!或*表示账户被锁定 |
| 最后修改 | 密码最后修改日期(从1970-01-01起的天数) |
| 最小间隔 | 两次密码修改之间的最小天数 |
| 最大间隔 | 密码有效期(天) |
| 警告期 | 密码过期前警告天数 |
| 不活跃期 | 密码过期后账户被禁用的天数 |
| 过期日期 | 账户过期日期 |
2.3 /etc/group - 组信息文件
查看文件:
bash
cat /etc/group
文件格式:
groupname:x:GID:user_list
实际示例:
root:x:0:
sudo:x:27:kali,admin
docker:x:118:kali,user1
kali:x:1000:
字段说明:
groupname: 组名x: 组密码占位符GID: 组IDuser_list: 该组的成员用户列表(逗号分隔)
三、用户管理操作
3.1 添加用户 - useradd命令
基本语法:
bash
useradd [选项] 用户名
常用选项:
| 选项 | 功能 | 示例 |
|---|---|---|
-u |
指定UID | -u 1020 |
-g |
指定主组GID | -g 1000 |
-G |
指定附加组 | -G sudo,docker |
-c |
添加注释信息 | -c "Test User" |
-d |
指定家目录 | -d /home/user1 |
-s |
指定登录Shell | -s /bin/bash |
-r |
创建系统用户 | -r |
-m |
创建家目录 | -m |
创建用户完整示例:
bash
# 创建用户user1,指定各项参数
sudo useradd -u 1020 -g 1000 -c "Test User Description" -d /home/user1 -s /bin/bash -G sudo -m user1
命令解析:
-u 1020: UID设为1020-g 1000: 主组GID为1000(kali组)-c "Test User Description": 添加描述信息-d /home/user1: 家目录为/home/user1-s /bin/bash: 使用bash作为登录Shell-G sudo: 将用户添加到sudo附加组-m: 自动创建家目录user1: 用户名
验证用户创建:
bash
id user1
# uid=1020(user1) gid=1000(kali) groups=1000(kali),27(sudo)
cat /etc/passwd | grep user1
# user1:x:1020:1000:Test User Description:/home/user1:/bin/bash
ls -ld /home/user1
# drwxr-xr-x 2 user1 kali 4096 Jan 15 14:00 /home/user1
3.2 设置用户密码 - passwd命令
为新用户设置密码:
bash
sudo passwd user1
系统会提示:
New password: (输入新密码,不显示)
Retype new password: (再次输入)
passwd: password updated successfully
passwd命令选项:
bash
passwd # 修改当前用户密码
sudo passwd user1 # 修改user1的密码
sudo passwd -l user1 # 锁定用户账户
sudo passwd -u user1 # 解锁用户账户
sudo passwd -d user1 # 删除用户密码(危险)
sudo passwd -e user1 # 强制用户下次登录时修改密码
3.3 Shell类型的影响
常见Shell类型:
| Shell | 路径 | 特点 |
|---|---|---|
| Bash | /bin/bash |
功能强大,最常用 |
| Sh | /bin/sh |
基础Shell,功能有限 |
| Zsh | /bin/zsh |
现代Shell,功能丰富 |
| Nologin | /usr/sbin/nologin |
禁止登录 |
Shell差异示例:
使用SSH登录后,如果Shell是/bin/sh:
- 无法使用命令历史(上下箭头)
- 无法使用Tab补全
- 提示符简陋:
$而不是user@host:~$ - 权限受限,某些命令不可用
修改用户Shell:
bash
# 查看当前Shell
echo $SHELL
# 修改用户Shell
sudo usermod -s /bin/bash user1
# 或直接编辑/etc/passwd文件(不推荐)
sudo vi /etc/passwd
# 将user1行的最后字段从/bin/sh改为/bin/bash
3.4 删除用户
userdel命令:
bash
sudo userdel user1 # 删除用户,保留家目录
sudo userdel -r user1 # 删除用户及其家目录
sudo userdel -f user1 # 强制删除(即使用户已登录)
注意事项:
- 删除前确认用户没有重要数据
-r选项会删除家目录和邮件- 建议先备份重要文件
四、权限管理基础
4.1 权限提升 - sudo命令
sudo的概念:
- sudo(Super User Do): 以超级用户权限执行命令
- 允许普通用户临时获得root权限
- 需要输入当前用户密码(不是root密码)
- 更安全,有审计日志
基本用法:
bash
sudo command # 以root权限执行命令
sudo apt update # 更新软件包
sudo vim /etc/hosts # 编辑系统文件
sudo -i # 切换到root环境
sudo su # 直接切换到root用户
sudo -u username command # 以指定用户身份执行命令
查看sudo权限:
bash
sudo -l
输出示例:
User kali may run the following commands on localhost:
(ALL : ALL) ALL
输出解释:
(ALL : ALL): 可以以任何用户和组的身份执行ALL: 可以执行所有命令
4.2 配置sudo权限 - sudoers文件
编辑sudoers文件(务必使用visudo):
bash
sudo visudo
为什么用visudo:
- 自动检查语法错误
- 防止配置错误导致无法使用sudo
- 使用锁机制防止多人同时编辑
sudoers文件格式:
用户名 主机=(运行用户) 命令
常见配置示例:
bash
# root用户拥有所有权限
root ALL=(ALL:ALL) ALL
# sudo组成员拥有所有权限
%sudo ALL=(ALL:ALL) ALL
# 允许kali用户无密码执行所有命令(不安全,不推荐)
kali ALL=(ALL) NOPASSWD: ALL
# 允许user1只能执行特定命令
user1 ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl
# 允许admin用户以任何用户身份执行命令
admin ALL=(ALL:ALL) ALL
配置说明:
%表示组名NOPASSWD:表示不需要密码- 具体命令需要写完整路径
添加用户到sudo组:
bash
sudo usermod -aG sudo user1
# 或
sudo gpasswd -a user1 sudo
4.3 文件权限模型 - UGO
Linux使用UGO权限模型:
- U (User): 文件属主(owner)
- G (Group): 文件属组(group)
- O (Others): 其他人
权限类型:
| 符号 | 数字 | 对文件的意义 | 对目录的意义 |
|---|---|---|---|
r |
4 | 读取文件内容 | 列出目录内容(ls) |
w |
2 | 修改文件内容 | 在目录中创建/删除文件 |
x |
1 | 执行文件 | 进入目录(cd) |
- |
0 | 无权限 | 无权限 |
查看权限:
bash
ls -l filename
输出示例:
-rw-r--r-- 1 kali kali 1234 Jan 15 14:00 test.txt
权限解析:
- rw- r-- r--
^ ^ ^ ^
| | | |
类型 属主 属组 其他人
- : 普通文件
rw- : 属主可读可写(4+2=6)
r-- : 属组只读(4)
r-- : 其他人只读(4)
4.4 修改权限 - chmod命令
数字方式(推荐):
bash
chmod 755 filename
chmod 644 filename
chmod 777 filename
数字计算:
7 = 4+2+1 = rwx(读+写+执行)6 = 4+2 = rw-(读+写)5 = 4+1 = r-x(读+执行)4 = r--(只读)0 = ---(无权限)
常用权限组合:
| 权限 | 数字 | 说明 | 适用 |
|---|---|---|---|
rwxr-xr-x |
755 | 所有人可读可执行,只有属主可写 | 可执行文件、目录 |
rw-r--r-- |
644 | 所有人可读,只有属主可写 | 普通文件 |
rwx------ |
700 | 只有属主有全部权限 | 私密文件 |
rw------- |
600 | 只有属主可读写 | 配置文件、密钥 |
rwxrwxrwx |
777 | 所有人可读可写可执行 | 危险,不推荐 |
符号方式:
bash
chmod u+x filename # 给属主添加执行权限
chmod g-w filename # 去除属组的写权限
chmod o+r filename # 给其他人添加读权限
chmod a+x filename # 给所有人添加执行权限(a=all)
chmod a=rwx filename # 所有人设为可读可写可执行
chmod a=- filename # 所有人无任何权限
chmod u=rw,g=r,o= filename # 分别设置各项权限
符号说明:
u: user(属主)g: group(属组)o: others(其他人)a: all(所有人)+: 添加权限-: 移除权限=: 设置权限(覆盖)
递归修改权限:
bash
chmod -R 755 directory/ # 递归修改目录及其内容
4.5 修改所有者 - chown命令
修改属主:
bash
sudo chown username filename
sudo chown kali test.txt
修改属组:
bash
sudo chown :groupname filename
sudo chown :sudo test.txt
同时修改属主和属组:
bash
sudo chown username:groupname filename
sudo chown kali:kali test.txt
递归修改:
bash
sudo chown -R username:groupname directory/
sudo chown -R kali:kali /home/kali/project/
实用示例:
bash
# 将文件所有权转给user1
sudo chown user1 file.txt
# 将目录及其内容所有权转给user1
sudo chown -R user1:user1 /home/user1/
# 只修改组
sudo chown :developers project.txt
# 查看修改结果
ls -l file.txt
4.6 修改属组 - chgrp命令
bash
sudo chgrp groupname filename
sudo chgrp sudo test.txt
sudo chgrp -R developers /var/www/
注意 : chgrp和chown :groupname效果相同,但chown更常用。
五、权限管理实战案例
5.1 创建共享目录
场景: 创建一个开发团队共享目录
bash
# 1. 创建共享目录
sudo mkdir /opt/shared
# 2. 创建开发组
sudo groupadd developers
# 3. 将团队成员添加到组
sudo usermod -aG developers user1
sudo usermod -aG developers user2
# 4. 修改目录所有权
sudo chown :developers /opt/shared
# 5. 设置权限(组成员可读写执行)
sudo chmod 775 /opt/shared
# 6. 设置特殊权限(新文件自动继承组)
sudo chmod g+s /opt/shared
# 7. 验证
ls -ld /opt/shared
# drwxrwsr-x 2 root developers 4096 Jan 15 15:00 /opt/shared
5.2 保护敏感文件
bash
# 1. 创建SSH密钥(示例)
ssh-keygen -t rsa
# 2. 设置私钥权限(只有属主可读)
chmod 600 ~/.ssh/id_rsa
# 3. 设置公钥权限
chmod 644 ~/.ssh/id_rsa.pub
# 4. 设置.ssh目录权限
chmod 700 ~/.ssh
# 5. 验证
ls -la ~/.ssh/
# drwx------ 2 kali kali 4096 Jan 15 15:10 .
# -rw------- 1 kali kali 1234 Jan 15 15:10 id_rsa
# -rw-r--r-- 1 kali kali 567 Jan 15 15:10 id_rsa.pub
5.3 设置脚本可执行
bash
# 1. 创建脚本
cat > backup.sh << 'EOF'
#!/bin/bash
echo "Running backup..."
tar -czf backup.tar.gz /home/user/documents
EOF
# 2. 添加执行权限
chmod +x backup.sh
# 或
chmod 755 backup.sh
# 3. 验证
ls -l backup.sh
# -rwxr-xr-x 1 kali kali 123 Jan 15 15:20 backup.sh
# 4. 执行
./backup.sh
5.4 修复权限问题
bash
# 场景:Apache无法读取网站文件
# 1. 修改网站目录所有权
sudo chown -R www-data:www-data /var/www/html/
# 2. 设置目录权限
sudo find /var/www/html/ -type d -exec chmod 755 {} \;
# 3. 设置文件权限
sudo find /var/www/html/ -type f -exec chmod 644 {} \;
# 4. 重启服务
sudo systemctl restart apache2
六、常见问题与解决方案
6.1 sudo权限被拒绝
问题:
bash
sudo command
# user is not in the sudoers file. This incident will be reported.
解决:
bash
# 方法1: 将用户添加到sudo组
su root
usermod -aG sudo username
exit
# 方法2: 直接编辑sudoers(需要root)
su root
visudo
# 添加: username ALL=(ALL:ALL) ALL
6.2 权限不足无法操作文件
问题:
bash
echo "test" > /etc/test.conf
# bash: /etc/test.conf: Permission denied
解决:
bash
# 使用sudo
sudo bash -c 'echo "test" > /etc/test.conf'
# 或
echo "test" | sudo tee /etc/test.conf
6.3 SSH登录后Shell功能受限
问题: SSH登录后无法使用Tab补全、命令历史等
原因 : 用户Shell设置为/bin/sh
解决:
bash
# 修改用户Shell为bash
sudo usermod -s /bin/bash username
# 或编辑/etc/passwd
sudo vi /etc/passwd
# 将对应用户行的/bin/sh改为/bin/bash
6.4 忘记root密码
解决方法(需要物理访问或控制台):
- 重启进入单用户模式或恢复模式
- 挂载文件系统为可写
- 使用
passwd命令重置密码
预防措施:
- 至少保留一个有sudo权限的用户
- 记录密码或使用密码管理器
七、安全最佳实践
7.1 用户管理安全建议
- 禁用root直接登录:
bash
# 编辑SSH配置
sudo vi /etc/ssh/sshd_config
# 设置: PermitRootLogin no
sudo systemctl restart sshd
- 使用强密码策略:
bash
# 安装密码质量检查库
sudo apt install libpam-pwquality
# 配置密码策略
sudo vi /etc/security/pwquality.conf
- 定期审查用户:
bash
# 查看所有用户
cat /etc/passwd
# 查看最近登录
last
# 查看失败的登录尝试
sudo lastb
- 删除不需要的用户:
bash
sudo userdel -r unused_user
7.2 权限管理安全建议
- 最小权限原则: 只给必要的权限
- 避免777权限: 除非确实需要
- 保护敏感文件:
bash
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.gnupg/*
chmod 400 /etc/shadow # 系统自动设置
-
使用sudo而不是root: 有审计日志,更安全
-
定期审查权限:
bash
# 查找777权限文件(危险)
find / -type f -perm 0777 2>/dev/null
# 查找SUID文件
find / -perm -4000 2>/dev/null
总结
核心知识点回顾
- 用户和组概念 :
- 用户信息:
/etc/passwd - 密码信息:
/etc/shadow - 组信息:
/etc/group - root用户UID=0,拥有最高权限
- 用户信息:
- 用户管理命令 :
id: 查看用户信息who: 查看登录用户useradd: 添加用户passwd: 设置密码userdel: 删除用户
- 权限提升 :
sudo: 临时提权su: 切换用户visudo: 配置sudo权限
- 权限模型UGO :
- U(User): 属主
- G(Group): 属组
- O(Others): 其他人
- 权限: r(4)、w(2)、x(1)
- 权限管理命令 :
chmod: 修改权限chown: 修改所有者chgrp: 修改属组
学习建议
- 理解概念: 清楚理解用户、组、权限的关系
- 实践操作: 在虚拟机中创建用户,设置权限
- 安全意识: 遵循最小权限原则
- 熟记数字: 记住常用权限数字(755、644、600等)
- 查看帮助 : 使用
man useradd、man chmod学习详细用法
下一步学习
掌握了用户和权限管理后,接下来将学习:
- 用户和组的高级操作: 批量管理、密码策略
- 进程管理: 进程查看、控制和调度
- 链接文件: 硬链接和软链接的使用
- 网络配置: SSH配置和远程管理
用户管理和权限控制是Linux系统安全的基石。通过本文的学习和实践,相信你已经建立了完整的权限管理知识体系。继续深入学习,打造安全可靠的Linux系统!
系列文章说明: 本文是"Linux零基础入门系列"的第五部分,专注于用户管理和权限控制。建议结合前面的文件系统、文件管理和文本编辑知识,系统掌握Linux系统管理技能。