前言
在多用户操作系统中,用户管理和权限控制是保障系统安全的核心机制。Linux作为一个多用户、多任务的操作系统,拥有完善的用户权限管理体系。理解用户和组的概念,掌握权限设置方法,是每个Linux管理员必备的技能。本文将系统讲解Linux的用户管理机制、权限模型和提权方法,帮助你建立完整的安全管理知识体系。
文章目录
- 前言
- 一、Linux用户和组基础
- 1.1 用户和组的概念
- 1.2 查看用户信息
- 1.3 查看登录用户
- 1.4 查看用户进程
- 1.5 用户切换
- 1.6 用户间通信
- 二、用户配置文件详解
- 2.1 /etc/passwd - 用户信息文件
- 2.2 /etc/shadow - 密码文件
- 2.3 /etc/group - 组信息文件
- 三、用户管理操作
- 3.1 添加用户 - useradd命令
- 3.2 设置用户密码 - passwd命令
- 3.3 Shell类型的影响
- 3.4 删除用户
- 四、权限管理基础
- 4.1 权限提升 - sudo命令
- 4.2 配置sudo权限 - sudoers文件
- 4.3 文件权限模型 - UGO
- 4.4 修改权限 - chmod命令
- 4.5 修改所有者 - chown命令
- 4.6 修改属组 - chgrp命令
- 五、权限管理实战案例
- 5.1 创建共享目录
- 5.2 保护敏感文件
- 5.3 设置脚本可执行
- 5.4 修复权限问题
- 六、常见问题与解决方案
- 6.1 sudo权限被拒绝
- 6.2 权限不足无法操作文件
- 6.3 SSH登录后Shell功能受限
- 6.4 忘记root密码
- 七、安全最佳实践
- 7.1 用户管理安全建议
- 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命令
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=...: 所属的所有组(主组+附加组)
查看指定用户信息:
idkali# 查看kali用户信息idroot# 查看root用户信息idusername# 查看任意用户信息查看root用户信息示例:
idroot# uid=0(root) gid=0(root) groups=0(root)可以看到root用户的UID和GID都是0,这是系统最高权限的标识。
1.3 查看登录用户
who命令 - 查看当前登录用户
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(远程登录时显示)
其他查看登录的命令:
w# 显示谁登录了以及他们在做什么users# 显示当前登录的用户名列表last# 显示最近登录的用户历史lastlog# 显示所有用户最后登录时间w命令示例(更详细):
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 w1.4 查看用户进程
查看所有进程 - ps命令
psaux|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查看特定用户的进程:
psaux|grepkali# 查看kali用户的进程psaux|greproot# 查看root用户的进程psaux|grep[用户名]# 查看指定用户的进程查看SSH相关进程:
psaux|grepssh输出示例:
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命令
suusername# 切换到指定用户(需要输入该用户密码)su- username# 切换用户并加载其环境变量su# 切换到root用户(需要root密码)su-# 切换到root并加载环境exit# 退出当前用户,返回之前的用户实际操作示例:
# 当前是kali用户id# uid=1000(kali) gid=1000(kali)# 切换到root用户suroot# 输入root密码# 验证切换成功id# uid=0(root) gid=0(root)# 退出root,返回kaliexit# 再次验证id# uid=1000(kali) gid=1000(kali)su vs su -的区别:
suusername# 只切换用户,保留当前环境变量su- username# 切换用户并加载目标用户的环境变量(推荐)1.6 用户间通信
wall命令 - 向所有登录用户发送消息
wall'System will reboot in 5 minutes'wall'haha'效果: 所有登录的用户终端都会收到这条消息。
其他通信命令:
writeusername# 向特定用户发送消息mesg n# 禁止接收消息mesg y# 允许接收消息二、用户配置文件详解
2.1 /etc/passwd - 用户信息文件
这个文件存储所有用户的基本信息,每个用户占一行。
查看文件:
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权限):
sudocat/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 - 组信息文件
查看文件:
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命令
基本语法:
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 |
创建用户完整示例:
# 创建用户user1,指定各项参数sudouseradd-u1020-g1000-c"Test User Description"-d /home/user1 -s /bin/bash -Gsudo-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: 用户名
验证用户创建:
iduser1# uid=1020(user1) gid=1000(kali) groups=1000(kali),27(sudo)cat/etc/passwd|grepuser1# user1:x:1020:1000:Test User Description:/home/user1:/bin/bashls-ld /home/user1# drwxr-xr-x 2 user1 kali 4096 Jan 15 14:00 /home/user13.2 设置用户密码 - passwd命令
为新用户设置密码:
sudopasswduser1系统会提示:
New password: (输入新密码,不显示) Retype new password: (再次输入) passwd: password updated successfullypasswd命令选项:
passwd# 修改当前用户密码sudopasswduser1# 修改user1的密码sudopasswd-l user1# 锁定用户账户sudopasswd-u user1# 解锁用户账户sudopasswd-d user1# 删除用户密码(危险)sudopasswd-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:
# 查看当前Shellecho$SHELL# 修改用户Shellsudousermod-s /bin/bash user1# 或直接编辑/etc/passwd文件(不推荐)sudovi/etc/passwd# 将user1行的最后字段从/bin/sh改为/bin/bash3.4 删除用户
userdel命令:
sudouserdeluser1# 删除用户,保留家目录sudouserdel-r user1# 删除用户及其家目录sudouserdel-f user1# 强制删除(即使用户已登录)注意事项:
- 删除前确认用户没有重要数据
-r选项会删除家目录和邮件- 建议先备份重要文件
四、权限管理基础
4.1 权限提升 - sudo命令
sudo的概念:
- sudo(Super User Do): 以超级用户权限执行命令
- 允许普通用户临时获得root权限
- 需要输入当前用户密码(不是root密码)
- 更安全,有审计日志
基本用法:
sudocommand# 以root权限执行命令sudoaptupdate# 更新软件包sudovim/etc/hosts# 编辑系统文件sudo-i# 切换到root环境sudosu# 直接切换到root用户sudo-u usernamecommand# 以指定用户身份执行命令查看sudo权限:
sudo-l输出示例:
User kali may run the following commands on localhost: (ALL : ALL) ALL输出解释:
(ALL : ALL): 可以以任何用户和组的身份执行ALL: 可以执行所有命令
4.2 配置sudo权限 - sudoers文件
编辑sudoers文件(务必使用visudo):
sudovisudo为什么用visudo:
- 自动检查语法错误
- 防止配置错误导致无法使用sudo
- 使用锁机制防止多人同时编辑
sudoers文件格式:
用户名 主机=(运行用户) 命令常见配置示例:
# root用户拥有所有权限rootALL=(ALL:ALL)ALL# sudo组成员拥有所有权限%sudoALL=(ALL:ALL)ALL# 允许kali用户无密码执行所有命令(不安全,不推荐)kaliALL=(ALL)NOPASSWD: ALL# 允许user1只能执行特定命令user1ALL=(ALL)/usr/bin/apt, /usr/bin/systemctl# 允许admin用户以任何用户身份执行命令adminALL=(ALL:ALL)ALL配置说明:
%表示组名NOPASSWD:表示不需要密码- 具体命令需要写完整路径
添加用户到sudo组:
sudousermod-aGsudouser1# 或sudogpasswd -a user1sudo4.3 文件权限模型 - UGO
Linux使用UGO权限模型:
- U (User): 文件属主(owner)
- G (Group): 文件属组(group)
- O (Others): 其他人
权限类型:
| 符号 | 数字 | 对文件的意义 | 对目录的意义 |
|---|---|---|---|
r | 4 | 读取文件内容 | 列出目录内容(ls) |
w | 2 | 修改文件内容 | 在目录中创建/删除文件 |
x | 1 | 执行文件 | 进入目录(cd) |
- | 0 | 无权限 | 无权限 |
查看权限:
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命令
数字方式(推荐):
chmod755filenamechmod644filenamechmod777filename数字计算:
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 | 所有人可读可写可执行 | 危险,不推荐 |
符号方式:
chmodu+x filename# 给属主添加执行权限chmodg-w filename# 去除属组的写权限chmodo+r filename# 给其他人添加读权限chmoda+x filename# 给所有人添加执行权限(a=all)chmoda=rwx filename# 所有人设为可读可写可执行chmoda=- filename# 所有人无任何权限chmodu=rw,g=r,o=filename# 分别设置各项权限符号说明:
u: user(属主)g: group(属组)o: others(其他人)a: all(所有人)+: 添加权限-: 移除权限=: 设置权限(覆盖)
递归修改权限:
chmod-R755directory/# 递归修改目录及其内容4.5 修改所有者 - chown命令
修改属主:
sudochownusername filenamesudochownkali test.txt修改属组:
sudochown:groupname filenamesudochown:sudo test.txt同时修改属主和属组:
sudochownusername:groupname filenamesudochownkali:kali test.txt递归修改:
sudochown-R username:groupname directory/sudochown-R kali:kali /home/kali/project/实用示例:
# 将文件所有权转给user1sudochownuser1 file.txt# 将目录及其内容所有权转给user1sudochown-R user1:user1 /home/user1/# 只修改组sudochown:developers project.txt# 查看修改结果ls-l file.txt4.6 修改属组 - chgrp命令
sudochgrpgroupname filenamesudochgrpsudotest.txtsudochgrp-R developers /var/www/注意:chgrp和chown :groupname效果相同,但chown更常用。
五、权限管理实战案例
5.1 创建共享目录
场景: 创建一个开发团队共享目录
# 1. 创建共享目录sudomkdir/opt/shared# 2. 创建开发组sudogroupadddevelopers# 3. 将团队成员添加到组sudousermod-aG developers user1sudousermod-aG developers user2# 4. 修改目录所有权sudochown:developers /opt/shared# 5. 设置权限(组成员可读写执行)sudochmod775/opt/shared# 6. 设置特殊权限(新文件自动继承组)sudochmodg+s /opt/shared# 7. 验证ls-ld /opt/shared# drwxrwsr-x 2 root developers 4096 Jan 15 15:00 /opt/shared5.2 保护敏感文件
# 1. 创建SSH密钥(示例)ssh-keygen -t rsa# 2. 设置私钥权限(只有属主可读)chmod600~/.ssh/id_rsa# 3. 设置公钥权限chmod644~/.ssh/id_rsa.pub# 4. 设置.ssh目录权限chmod700~/.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.pub5.3 设置脚本可执行
# 1. 创建脚本cat>backup.sh<<'EOF' #!/bin/bash echo "Running backup..." tar -czf backup.tar.gz /home/user/documents EOF# 2. 添加执行权限chmod+x backup.sh# 或chmod755backup.sh# 3. 验证ls-l backup.sh# -rwxr-xr-x 1 kali kali 123 Jan 15 15:20 backup.sh# 4. 执行./backup.sh5.4 修复权限问题
# 场景:Apache无法读取网站文件# 1. 修改网站目录所有权sudochown-R www-data:www-data /var/www/html/# 2. 设置目录权限sudofind/var/www/html/ -type d -execchmod755{}\;# 3. 设置文件权限sudofind/var/www/html/ -type f -execchmod644{}\;# 4. 重启服务sudosystemctl restart apache2六、常见问题与解决方案
6.1 sudo权限被拒绝
问题:
sudocommand# user is not in the sudoers file. This incident will be reported.解决:
# 方法1: 将用户添加到sudo组surootusermod-aGsudousernameexit# 方法2: 直接编辑sudoers(需要root)suroot visudo# 添加: username ALL=(ALL:ALL) ALL6.2 权限不足无法操作文件
问题:
echo"test">/etc/test.conf# bash: /etc/test.conf: Permission denied解决:
# 使用sudosudobash-c'echo "test" > /etc/test.conf'# 或echo"test"|sudotee/etc/test.conf6.3 SSH登录后Shell功能受限
问题: SSH登录后无法使用Tab补全、命令历史等
原因: 用户Shell设置为/bin/sh
解决:
# 修改用户Shell为bashsudousermod-s /bin/bash username# 或编辑/etc/passwdsudovi/etc/passwd# 将对应用户行的/bin/sh改为/bin/bash6.4 忘记root密码
解决方法(需要物理访问或控制台):
- 重启进入单用户模式或恢复模式
- 挂载文件系统为可写
- 使用
passwd命令重置密码
预防措施:
- 至少保留一个有sudo权限的用户
- 记录密码或使用密码管理器
七、安全最佳实践
7.1 用户管理安全建议
- 禁用root直接登录:
# 编辑SSH配置sudovi/etc/ssh/sshd_config# 设置: PermitRootLogin nosudosystemctl restart sshd- 使用强密码策略:
# 安装密码质量检查库sudoaptinstalllibpam-pwquality# 配置密码策略sudovi/etc/security/pwquality.conf- 定期审查用户:
# 查看所有用户cat/etc/passwd# 查看最近登录last# 查看失败的登录尝试sudolastb- 删除不需要的用户:
sudouserdel-r unused_user7.2 权限管理安全建议
- 最小权限原则: 只给必要的权限
- 避免777权限: 除非确实需要
- 保护敏感文件:
chmod600~/.ssh/id_rsachmod600~/.gnupg/*chmod400/etc/shadow# 系统自动设置使用sudo而不是root: 有审计日志,更安全
定期审查权限:
# 查找777权限文件(危险)find/ -type f -perm 07772>/dev/null# 查找SUID文件find/ -perm -40002>/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系统管理技能。