在Linux系统中,用户和用户组是权限管理的两大基石。理解它们的工作原理,对于系统管理员和开发者来说至关重要。想象一下,这就像一栋大楼的门禁系统:每个员工(用户)都有自己的工卡,而部门(用户组)也有公共权限。系统通过这种双重机制,实现了精细化的访问控制。
Linux系统中,每个用户都有一个唯一的用户ID(UID),而每个组也有组ID(GID)。UID和GID的分配遵循以下规则:
提示:在CentOS/RHEL系统中,普通用户的UID从500开始,而在Ubuntu/Debian中则从1000开始。这是不同发行版的一个小差异。
创建用户组是权限管理的第一步。使用groupadd命令可以轻松完成:
bash复制sudo groupadd developers # 创建一个名为developers的组
删除组同样简单,但需要注意:
bash复制sudo groupdel developers # 删除developers组
重要警告:删除组前,请确保没有用户将该组作为其主要组(primary group),否则会导致这些用户无法正常登录系统。
了解系统中现有的组信息是管理的基础。getent group命令会显示所有组的信息,格式为:
code复制组名:密码占位符:GID:组成员列表
例如:
code复制developers:x:1001:user1,user2
staff:x:1002:user3
useradd命令远比表面看起来强大。让我们深入其常用选项:
bash复制sudo useradd -m -d /home/custom_home -g developers -s /bin/bash newuser
参数解析:
-m:自动创建用户主目录-d:指定自定义主目录路径-g:设置用户的主要组-s:指定用户的默认shell删除用户看似简单,但有几个关键点需要注意:
bash复制sudo userdel -r olduser # -r选项会同时删除用户主目录和邮件池
经验之谈:生产环境中,建议先备份用户数据再执行删除操作。可以使用
tar -zcvf /backup/olduser.tar.gz /home/olduser进行备份。
id命令是查看用户组关系的利器:
bash复制id username
典型输出示例:
code复制uid=1001(user1) gid=1001(developers) groups=1001(developers),1002(staff),1003(testers)
解读:
usermod命令可以灵活调整用户组关系:
bash复制sudo usermod -aG staff user1 # 将user1添加到staff组,同时保留原有组关系
关键点:
-a(append)选项至关重要,它确保用户不会被从原有组中移除-a会导致用户只属于新指定的组Linux通过几个关键文件管理用户和组信息:
每行格式:
code复制username:password_placeholder:UID:GID:comment:home_directory:shell
示例:
code复制user1:x:1001:1001:User One:/home/user1:/bin/bash
每行格式:
code复制group_name:password_placeholder:GID:member_list
示例:
code复制developers:x:1001:user1,user2
staff:x:1002:user3
存储加密密码和其他安全相关信息,格式为:
code复制username:encrypted_password:last_change:min_age:max_age:warn:inactive:expire
安全提示:该文件权限应为640(root可读写,shadow组可读),普通用户不应有访问权限。
-m选项确保主目录被创建-k选项复制/etc/skel中的默认配置文件passwd newuser问题1:用户无法访问组共享目录
ls -ld /path/to/directory问题2:groupdel失败,提示"组是某用户的主要组"
getent passwd | grep groupname找出相关用户usermod -g newgroup username用户可以使用newgrp命令临时切换主要组:
bash复制newgrp target_group # 需要输入组密码(如果设置了的话)
这在进行特定组的工作时非常有用,无需完全注销重新登录。
last命令查看登录历史,find / -nouser查找无主文件/etc/login.defs设置密码过期、长度等要求usermod -L username锁定账户visudo谨慎管理/etc/sudoers文件假设有一个web开发项目,需要设置以下权限结构:
bash复制sudo groupadd web_dev
sudo groupadd web_admin
bash复制sudo useradd -m -G web_dev dev1
sudo useradd -m -G web_admin admin1
bash复制sudo mkdir -p /var/www/project
sudo chown root:web_admin /var/www/project
sudo chmod 2775 /var/www/project # 设置SGID保持组继承
使用脚本批量创建用户:
bash复制for user in user1 user2 user3; do
sudo useradd -m -G developers $user
echo "$user:Password123" | sudo chpasswd
sudo chage -d 0 $user # 强制首次登录修改密码
done
bash复制who -u # 查看当前登录用户
last # 查看登录历史
bash复制find /home -type f -size +100M -exec ls -lh {} \;
bash复制chage -l username
Linux的可插拔认证模块(PAM)提供了灵活的认证机制。关键配置文件:
/etc/pam.d/system-auth:系统级认证策略/etc/pam.d/password-auth:密码相关策略示例:强制密码复杂度要求:
code复制password requisite pam_pwquality.so try_first_pass retry=3 minlen=12 difok=3
这要求密码至少12个字符,且与旧密码至少有3个字符不同。