理论学习
1. 用户文件解析
/etc/passwd
结构详解
- 字段说明(冒号分隔,共7个字段):
- 用户名:登录系统使用的标识符(1-32字符,字母开头)
- 密码占位符:
x
表示密码已迁移至/etc/shadow
- UID(用户ID):
- 0: 超级用户
- 1-999: 系统保留(不同发行版可能不同,如Debian系1-999为系统用户)
- 1000+: 普通用户(可通过
/etc/login.defs
配置UID_MIN
)
- GID(主组ID):用户所属主组的ID
- 描述字段:全名/备注信息(可通过
chfn
命令修改) - 主目录:用户登录后的默认路径(
/home/用户名
) - 登录Shell:用户登录时启动的Shell(
/bin/bash
,/bin/false
等)
- 示例分析:
plaintext
developer:x:1001:1001:Dev Team Member:/home/developer:/bin/bash
- 用户
developer
属于UID 1001,主组GID 1001,主目录/home/developer
,使用Bash Shell
- 用户
/etc/shadow
安全机制
- 字段说明(冒号分隔,共9个字段):
- 用户名
- 加密密码:
$id$salt$encrypted
格式$6$
: SHA-512加密(现代系统默认)$y$
: Blowfish加密$5$
: SHA-256加密
- 最后修改时间:自1970-01-01以来的天数
- 最小密码年龄:修改后多少天内禁止再次修改
- 最大密码年龄:密码有效期(99999表示永不过期)
- 警告期:密码过期前多少天开始警告
- 非活动期:密码过期后多少天禁用账户
- 账户过期时间:自1970-01-01以来的天数(留空表示永不过期)
- 保留字段
- 权限控制:
bash
ls -l /etc/shadow
# 输出:-rw-r----- 1 root root 1.3K May 15 10:00 /etc/shadow
- 仅
root
用户可读,其他用户无权限
- 仅
2. Sudoers 配置进阶
visudo
工作原理
- 文件路径:
/etc/sudoers
- 语法检查机制:
- 使用
visudo
时,会锁定文件防止并发编辑 - 保存时自动检查语法错误
- 若检测到错误,会提示修复或放弃保存
- 使用
- 常用配置示例:
bash
# 允许用户kali无密码执行所有命令
kali ALL=(ALL) NOPASSWD: ALL
# 允许组admins无密码执行指定命令
%admins ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /bin/journalctl
# 允许用户developer在host1上以root身份执行/usr/bin/apt
developer host1=(root) NOPASSWD: /usr/bin/apt
# 命令别名(提高可维护性)
Cmnd_Alias SYSTEM_MGMT = /usr/bin/systemctl, /bin/journalctl
%admins ALL=(ALL) NOPASSWD: SYSTEM_MGMT
安全最佳实践
- 最小权限原则:仅授予必要权限
- 命令限制:避免使用
ALL
,优先指定具体命令 - 审计日志:通过
/var/log/auth.log
追踪sudo操作 - 密码策略:设置合理的密码超时(
Defaults timestamp_timeout=15
)
实操演练
1. 用户创建与管理
用户创建
bash
# 创建用户并指定UID/GID
sudo useradd -m -u 1002 -g 1002 -s /bin/bash tester
# 非交互式设置密码(生产环境慎用)
echo "tester:T3st3r@123" | sudo chpasswd
# 查看用户信息
id tester
# 输出:uid=1002(tester) gid=1002(tester) groups=1002(tester)
getent passwd tester
# 输出:tester:x:1002:1002::/home/tester:/bin/bash
用户删除
bash
# 删除用户并保留主目录
sudo userdel tester
# 删除用户并级联删除主目录
sudo userdel -r tester
2. 组管理操作
创建组
bash
# 创建系统组(GID < 1000)
sudo groupadd -r sys_group
# 创建普通组
sudo groupadd dev_group
用户组管理
bash
# 将用户加入多个组
sudo usermod -aG sudo,dev_group,docker developer
# 查看用户所属组
groups developer
# 输出:developer : developer sudo dev_group docker
# 查看组内用户
getent group dev_group
# 输出:dev_group:x:1003:developer
3. 权限验证
bash
# 测试sudo权限
sudo -l -U developer
# 输出:
# User developer may run the following commands on hostname:
# (ALL) NOPASSWD: ALL
# 切换用户验证
su - developer
# 输出:
# Creating directory '/home/developer/.ssh'.
# developer@hostname:~$
4. 常见问题排查
用户无法登录
bash
# 检查Shell是否存在
ls -l /bin/bash
# 输出:-rwxr-xr-x 1 root root 1.2M May 10 2023 /bin/bash
# 检查主目录权限
ls -ld /home/developer
# 输出:drwxr-xr-x 2 developer developer 4096 May 15 10:00 /home/developer
sudo权限失效
bash
# 修复sudoers文件
sudo pkexec visudo
# 查看审计日志
grep sudo /var/log/auth.log
# 输出:May 15 10:05 sudo: developer : TTY=pts/0 ; PWD=/home/developer ; USER=root ; COMMAND=/usr/bin/apt update
复习巩固
1. 关系图绘制指南(draw.io)
核心元素
- 用户节点(圆形):
- 标注:用户名/UID(如
developer/1001
) - 样式:不同颜色区分系统用户/普通用户
- 标注:用户名/UID(如
- 组节点(方形):
- 标注:组名/GID(如
sudo/27
) - 样式:虚线边框表示附加组
- 标注:组名/GID(如
- 权限箭头:
- 箭头方向:用户/组 → 资源
- 标注:权限类型(读/写/执行)
- 文件节点(文档图标):
/etc/passwd
:标注字段含义(用户名❌UID:GID:...)/etc/group
:标注字段含义(组名❌GID:用户列表)
连接关系
- 用户 → 组:多对多关系(用户可属于多个组)
- 组 → 权限:通过GID关联资源权限(如文件所属组)
- 用户 → 权限:通过UID直接关联或通过组间接关联
- 文件 → 用户/组:
/etc/passwd
和/etc/group
定义用户/组信息
2. 复习问题与答案
理论题
/etc/passwd
中的x
表示什么?- 密码已迁移至
/etc/shadow
,此处为占位符。
- 密码已迁移至
- 如何安全编辑sudoers文件?
- 使用
sudo visudo
命令,它提供语法检查和文件锁定功能。
- 使用
- 如何允许用户无密码执行sudo命令?
- 在sudoers文件中添加
username ALL=(ALL) NOPASSWD: ALL
。
- 在sudoers文件中添加
实操题
-
创建用户
testuser
并设置密码。bash
sudo useradd -m testuser
echo "testuser:P@ssw0rd" | sudo chpasswd
-
将用户
testuser
加入sudo
组。bash
sudo usermod -aG sudo testuser
-
验证用户
testuser
的sudo权限。bash
sudo -l -U testuser