用户与组管理
用户与组管理
复习定位
Linux是多用户操作系统——每个用户通过自己的账户登录系统——拥有自己的文件和权限。系统管理员(root)控制用户的创建和权限——避免多用户间互相干扰。组的目的是将多个用户归为一组——方便批量授权。
用户标识
Linux系统通过UID(用户ID)标识用户。内核并不关心用户的名字——只关心UID=0(表示超级用户root)和UID>0(普通用户)。用户名字仅供人类识别。
用户信息存储在/etc/passwd文件中——每一行表示一个用户——冒号分隔共7个字段:
- 用户名:登录时输入的名字。
- 密码占位符(早期存放加密密码——现在密码已移到/etc/shadow——所以passwd该字段统一为x)。
- UID:用户标识符(0是root,1-99是系统保留,100-65535是普通用户)
- GID:用户所属的主组(primary group)id。
- GECOS:用户全名或注释信息。
- 家目录:用户登录后的默认当前目录(通常/home/username)。
- Shell:用户的登录Shell开机默认(通常是/bin/bash——如果设为/sbin/nologin则不允许该用户登录交互式shell)。
密码哈希存储在/etc/shadow——只有root可以读——包含密码哈希值、上次修改日期、密码有效期等。
用户管理命令
useradd username: 创建新用户——自动分配UID(>=1000)、创建家目录、默认Shell = /bin/bashpasswd username: 设置/修改用户的密码(passwd命令通过SUID以root身份运行——所以普通用户可以改自己的密码)usermod -aG groupname username: 将用户添加到附加组userdel -r username: 删除用户及用户的家目录和邮件目录
每个新用户被创建时——系统会从/etc/skel/目录复制默认配置文件(.bashrc,.profile等)到新用户的家目录。
组管理
每个用户有一个主组(创建用户时自动创建同名组)和零个或多个附加组。文件权限中的"组"指的是文件所属组——如果某个用户是文件所属组的成员——则该文件对该用户按组的权限开放。
groupadd groupname: 创建新组gpasswd -a username groupname: 将用户加入组groups username: 显示用户的所属组(主组+附加组)newgrp groupname: 临时切换当前会话的主组为指定的附加组
将用户加入组是授权的常见方法——例如将用户加入docker组——该用户就可以运行docker命令(因为docker.sock的组权限允许docker组成员访问)。
复习检查
为什么密码存储在/etc/shadow而非/etc/passwd——passwd所有人可读(用户名等信息必须公开)——shadow仅root可读——以前将密码哈希放在passwd时——攻击者可以读到全部哈希并尝试离线破解——现在shadow权限保护下——普通用户看不到别人的密码哈希。
userdel -r username中的-r选项做了什么——不指定-r的话——删除用户——但家目录和邮件文件保留——这两个文件现在属于未被关联的UID(数字)垃圾文件——不会自动被清理——除非手动用find / -uid XXX -delete。为什么root的UID是0——Linux内核仅仅检查UID是否为0来确定是否拥有超级用户权限——并不在乎用户名是什么(如果改root为别的名字——但UID=0——仍然有root权限)。
主组(primary)和附加组(supplementary group)的区别——用户创建文件时默认的主组成为文件所属组——而附加组只用于该用户访问属于该附加组的文件时——权限以附加组成员身份计算。
什么是SUID(Set User ID)——passwd命令所有者是root且设置了SUID位(
-rwsr-xr-x)——普通用户执行passwd时——该进程的有效UID变成root——因而可以修改/etc/shadow。但passwd程序本身已经限制了只能改当前用户的密码——防止滥用。