6.1 基本概念
6.1.1 用户
UID
系统为每一个用户分配一个独一无二的号码,UID。
Linux 不认识用户名称,只能通过 UID 来识别用户。
UID 划分
根据用户身份不同,把 UID 大致划分了几个范围:
- 管理员
UID = 0,若要给普通用户赋予 root 权限,将其 UID 改为 0 即可。
- 系统用户
UID = 1 ~ 999。
1 ~ 200 为系统默认创建的系统用户。
201 ~ 999 为用户创建的系统用户。
- 普通用户
UID = 1000 ~ 60000
很多用户是系统正常运行所必须要的,简称 系统用户,它们用于启动网络服务或后台服务,需要的权限较小,因此通常它们无法登陆。
GID
每个用户可以属于若干个组,创建用户时系统会默认创建同名的组,该用户默认属于该组。
系统同样也只能通过 GID 来识别组。
家目录
默认的用户家目录为 /home/userID,root 用户的家目录为 /root
Shell
用户登陆后获得的 shell 。主要分为 Login Shell 和 Non-Login Shell。
Login Shell 可以有很多,常用的为 /bin/bash,Non-Login Shell 通常为 /sbin/nologin。
6.1.2 组
初始组
Initial Group。用户登陆系统时自动拥有该组的权限。
/etc/passwd 里面的 GID 为初始组。
新版的 Linux 中,初始组的用户群已经不会加入 /etc/group 的 组成员 字段。
有效组
Effective Group,用户 创建文件时默认的组。
在 groups 命令的输出中,第一个组 就是有效组。
- 切换有效组
使用 newgrp 在登陆会话中切换组,即修改当前 GID。要切换的组必须是已经加入的。
newgrp 命令会打开一个 shell 子进程,给用户指定新的 有效 GID,运行 exit 可以回到原 shell。
newgrp - matrix
如果加了减号 -,用户的环境就会重新初始化,否则保持之前的环境,包括工作目录等都不会变化。
6.2 用户管理
用户的信息都保存在 /etc/passwd, /etc/shadow 这两个数据文件中,用户管理实际上是对这些文件内容的修改。
6.2.1 数据文件及配置文件
/etc/passwd
/etc/passwd 主要保存 UID 与用户名的对应关系。
-
/etc/passwd文件结构
用户 : 密码 : UID : GID : 用户信息 : 家目录 : shell
每一行使用冒号分隔,共七项。
密码位置处默认为 x,真实的密码保存在 /etc/shadow 中。
用户信息不常用,有时用来作为 注释。
/etc/shadow
/etc/shadow 保存用户的 密码 及密码期限设置。
文件结构
用冒号分隔,共九个字段:
- 密码
此处保存的是密码 加密 后的字符串。
在此字段前加上 ! 或 * 以改变密码字段长度,可以让密码 暂时失效。
- 最近修改密码日期
最近一次修改密码是在哪一天,用 epoch 天数表示。
- 禁止修改密码天数
最近一次修改密码后,经过几天才可以再次修改。
留空或 0 表示随时可以修改。
- 密码有效天数
最近一次修改密码后,密码持续有效的天数。
最后的有效期到来之前用户必须再次修改,否则之后会密码过期。
留空表示持续有效、无警告天数、无过期宽限天数。
常用 99999 表示不强制修改密码。
- 修改密码警告天数
过期之前几天开始,系统开始提醒用户修改密码。
留空或 0 表示没有警告天数。
- 密码过期宽限天数
密码过期起几天内,用户登陆系统时,会被强制修改密码,否则无法登陆。
超过宽限天数仍未修改密码的用户,用户被 禁用(disabled),必须由管理员修改密码。
留空为不限制,即一直宽限。
- 用户失效日期
过期后 用户失效(expired),无法再使用。
留空为永不失效,0 为手动禁用用户(失效)。
- 保留字段
保留给未来新功能。
范例
user:$6$M4IphYxxmm....:16559:5:60:7:5:16679:
最近修改密码日期为 2015/05/04
5 天后才能再次修改密码
密码有效期为 60 天,亦 16559+60=16619 (2015/07/03)。因此从 2015/05/09 (前 5 天不能改) 到 2015/07/03 之间的 60 天可以修改密码。
警告天数为 7 天,即 2015/06/26 ~ 2015/07/03 这七天系统均会提醒用户改密码。
如果过了 2015/07/03 仍没改,密码过期。
密码过期后,有 5 天的宽限天数,因此在 2015/07/08 之前,用户用旧密码登陆时会被强制修改密码,否则无法登陆。如果在 2015/07/08 以后仍未改密码,用户被禁用,需请管理员改密码。
到了 16679 (2015/09/01)用户失效。
密码加密机制
查询当前版本的 shadow 使用哪种加密机制:
~]# authconfig --test | grep hashing
password hashing algorithm is sha512
用户登陆 Linux 流程
-
先在
/etc/passwd里查找用户,找不到则退出,找到则读取其 UID、GID 及家目录,读取 shell 设置; -
从
/etc/shadow里面找出对应的用户与 UID,核对密码 -
密码正确,就登陆 Shell 。
LOGIN.DEFS 配置文件
/etc/login.defs 用于 UID、GID、密码的全局设置。
参数解释
MAIL_DIR
邮箱所在目录 /var/spool/mail,因此用户邮箱目录为 /var/spool/mail/user 。
PASS_MAX_DAYS
密码有效期
PASS_MIN_DAYS
修改密码间隔天数
PASS_MIN_LEN
密码最小长度,已停用,被 pam 模块取代。
PASS_WARN_AGE
过期前警告天数
UID_MIN
允许使用的最小 UID
系统为用户分配 UID 时,先参考
UID_MIN的设置,再从/etc/passwd中查找最大的 UID,将二者中最大的加 1,即得到新 UID。
UID_MAX
允许使用的最大 UID
SYS_UID_MIN
系统用户最小 UID
SYS_UID_MAX
系统用户最大 UID
GID_MIN
允许使用的最小 GID
GID_MAX
允许使用的最大 GID
SYS_GID_MIN
系统用户最小 GID
SYS_GID_MAX
系统用户最大 GID
CREATE_HOME
是否创建家目录。如果 =yes,在使用 useradd 时, 会自动加入 -m 参数。
UMASK
家目录权限掩码
USERGROUPS_ENAB
如果 =yes,使用 userdel 删除用户时,其初始组若没有其它组员了,则删除该组。
ENCRYPT_METHOD
密码加密机制。SHA512 较新。
6.2.2 查看用户信息
ID
查看真实及有效 UID、GID、组。
id [username]
FINGER
查看用户基本信息
语法
finger [-s] username
-s 仅列出用户的用户、全名、终端机代号与登陆时间等
-m 列出与后面接的用户相同者,而不是利用部分比对 (包括全名部分)
finger 返回的内容
Login 用户
Name 注释
Directory 家目录
Shell 用户 Shell
logged in 登陆主机时间
No mail 有否邮件
No Plan ~user/.plan 文件的内容
- 不加参数则列出 当前在线的用户
~]$ finger
Login Name Tty Idle Login Time Office Office Phone Host
user user tty2 11d Jul 7 23:07
user user pts/0 Jul 20 17:59
6.2.3 新建用户
使用 useradd 创建用户时,系统会参考:
-
/etc/default/useradd -
/etc/login.defs -
/etc/skel/
USERADD 语法
useradd [-u UID] [-g 初始组] [-G 附加组] [-mM] [-c 注释] [-d 家目录] [-s shell] 用户名
-u 为用户指定 UID
-g 用户初始组
-G 用户的附加组
-M 不创建家目录
-m 创建家目录
-c 注释文字
-d 指定家目录,需用绝对路径
-r 创建系统用户
-s 指定 shell
-e 用户失效日期,YYYY-MM-DD
-f 密码过期宽限天数。0 为立刻失效,-1 为永不失效
USERADD 默认动作
-
在
/etc/passwd中添加记录 -
在
/etc/shadow中添加记录,无密码 -
在
/etc/group中添加组名 -
在
/home中创建家目录,权限 700
用户创建以后,需设定密码方可使用。
范例
- 用默认值创建用户
useradd user1
- 用自定义信息创建用户
useradd -u 1500 -g users user2
- 创建系统用户
useradd -r user3
不会为系统用户创建家目录
USERADD 配置文件
useradd 使用的 默认值 保存在 /etc/default/useradd 文件中。
~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
列出的就是 /etc/default/useradd 的内容。
配置文件结构
GROUP=100
指定初始组 为 users(其 GID=100)。但 CentOS 会 忽略 该指定,默认的组为 与用户同名 的组。
针对组有两种不同的机制:
- 私有组机制:
系统会创建一个与用户同名的组作为初始组。这种机制的保密性较好。因为用户都有自己的组,且家目录权限为 700。这种机制会忽略 GROUP=100 的设置。代表性的发行版为 RHEL, Fedora, CentOS;
- 公共组机制:
以 GROUP=100 设置值为准,每个用户都属于 users 这个组,且默认家目录的权限为 755。代表发行版为 SuSE。
HOME=/home
家目录的基准目录(basedir),会在该设置值的目录中创建用户同名的子目录。
INACTIVE=-1
密码过期宽限天数。0 表示密码过期后立刻失效,-1 表示密码永不失效,其它数字表示过期 N 天后失效。
EXPIRE=
用户失效的日期,通常不设置。
SHELL=/bin/bash
指定 shell 文件名。
SKEL=/etc/skel
家目录模板。
用户家目录是由 /etc/skel 复制生成的。所以如果想修改新建用户的默认环境变量,可以直接编辑 /etc/skel/.bashrc ;也可以直接修改其文件夹结构,如增加 /etc/skel/www 子目录。
CREATE_MAIL_SPOOL=yes
创建用户邮箱。/var/spool/mail/***
6.2.4 设置密码
用 useradd 创建用户之后,用户暂时被 锁定,无法登陆。此时 /etc/shadow 内的密码字段为 “ !! ”。
密码设置规范
-
不同于用户名
-
一般人最常用的不用
-
大于 8 个字符
-
不使用个人信息,如身份证、手机号码、电话号码等
-
不用简单的关系式,如 1+1=2, Iamuser 等
-
尽量使用大小写字符、数字、特殊字符的组合。
PASSWD
passwd 命令用于为别人或自己设置密码。
普通用户修改自己的密码
passwd [--stdin] [用户]
管理员修改他人密码
passwd [-l] [-u] [--stdin] [-S] [-n 天数] [-x 天数] [-w 天数] [-i 日期] 用户
-l 锁定用户,在 /etc/shadow 第二字段前面加 !
-u 解锁用户
-S 列出密码的状态信息
-n 修改密码间隔天数
-x 密码有效天数
-w 密码过期提前警告天数
-i 密码逾期宽限天数
--stdin 把管道传来的数据,作为密码输入,便于脚本使用
范例
- 管理员为用户设置密码
passwd user2
- 普通用户修改自己的密码
passwd
与 root 不同的是,一般用户在更改密码时需要先输入自己的旧密码,然后再输入新密码。密码的规范非常严格,新发行版本多使用 PAM 模块进行密码的检验,太短、与用户相同、为字典常见字等,都会被拒绝,此时再次出现“ New ”关键字,直到出现“ Retype ”才是被接受,重复输入新密码并看到“ successfully ”关键字才算修改成功。
- 使用 stdin 创建密码
echo "abc543CC" | passwd --stdin user2
这样使用的 缺点 是密码会 保存 在命令记录中,若系统被攻破, /root/.bash_history 会泄漏密码。因此尽量在 脚本 中使用,而不要直接在命令行。并非所有发行版本均支持这一选项。
- 用指定参数设置密码
有效期 60 天,逾期 10 天后用户失效。
passwd -x 60 -i 10 user2
- 暂时锁定用户
passwd -l user2
~]# passwd -S user2
user2 LK 2015-07-20 0 60 7 10 (Password locked.)
状态 “ LK ” 表示已锁定
~]# grep user2 /etc/shadow
user2:!!$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::
其实只是在密码前加了 !!
- 解锁用户
passwd -u user2
CHAGE
该命令用于 设置用户密码过期策略。
chage [-ldEImMW] 用户名
-l 列出该用户的详细密码参数
-d 修改最近修改密码日期,YYYY-MM-DD,也可用 epoch 天数
-E 修改用户失效日期,YYYY-MM-DD
-I 修改密码过期宽限天数
-m 修改密码修改间隔天数
-M 修改密码有效天数
-W 修改过期前警告天数
范例
- 查看详细密码参数
chage -l user2
- 用户首次登陆必须修改密码
chage -d 0 agetest
-d 0 即把用户的密码修改时间设为 1970/1/1,因此必须修改密码。
6.2.5 修改用户属性
USERMOD
使用 usermod 命令来修改用户属性。
usermod [-cdegGlsuLU] username
-c 修改用户说明
-d 修改家目录
-e 修改用户失效日期
-f 修改密码过期宽限天数
-g 修改初始组 GID
-G 修改附加组
-a 增加附加组,与 -G 配合使用
-l 修改用户名称
-s 修改 Shell
-u 修改 UID
-L 锁定用户
-U 解锁用户
范例
- 修改用户注释
usermod -c "user's test" user2
- 修改用户失效日期
usermod -e "2015-12-31" user2
- 创建用户家目录
~]# cp -a /etc/skel /home/user3 # 从模板复制目录
~]# chown -R user3:user3 /home/user3 # 递归改所有者和组
~]# chmod 700 /home/user3 # 改目录权限
CHFN
修改 finger 信息
chfn [-foph] [用户名]
-f 用户全名,修改的是 passwd 文件中的注释文本
-o 办公室房间号
-p 办公室电话
-h 住宅电话
不加参数直接运行,会以交互方式逐个参数修改。
CHSH
修改用户 shell
chsh [-ls]
-l 列出系统当前可用的 shell
-s 使用指定的 Shell
6.2.6 删除用户
userdel [-r] username
-r 同时删除用户家目录
如果需要暂时把用户禁用,只需将 /etc/shadow 中用户失效日期设置为 0 即可禁用用户,同时保留该用户所有数据。而使用 userdel 的时机通常是“确定禁止该用户在主机上使用任何数据了!” 如果要彻底将某个用户删除,可以在下达 userdel -r username 之前, 先用 find / -user username 查出整个系统中该用户的文件,然后删除。
6.3 组管理
组管理实际上是对 /etc/group, /etc/gshadow 的修改。
6.3.1 新建组
groupadd 命令
groupadd [-g gid] [-r] 组名称
-g 使用指定的 GID
-r 创建系统组
- 范例
groupadd group1
系统分配新的 GID 时,是把当前 1000 以上最大的 GID 加上 1 得来的。
6.3.2 修改组
groupmod
groupmod 命令用于修改 GID 及组名。
groupmod [-g gid] [-n group_name] 组名
-g 修改 GID
-n 修改组名称
- 范例
groupmod -g 201 -n mygroup group1
gpasswd
gpasswd 用于设置组密码,指定管理员,添加组员,移除组员等。
组管理员可以是多人。
范例
- root 为组设置密码
gpasswd groupname
- root 指定组管理员列表
gpasswd -A admin1,admin2 groupname
- root 添加新组员
gpasswd -M user1,user2 groupname
- root 删除组的密码
gpasswd -r groupname
- root 用密码限制访问该组
gpasswd -R groupname
使用 newgrp 切换组时需要输入密码。
- 组管理员添加组员
gpasswd -a user1 groupname
- 组管理员移除组员
gpasswd -d user groupname`
6.3.3 删除组
groupdel 命令用于删除组。
groupdel [groupname]
要删除的组必须不是任何人的 初始组,否则无法删除。
6.3.4 查看组
GROUPS
查看当前用户属于哪个组。
groups
6.3.5 数据文件
/etc/group
每行代表一个组,以冒号分隔,共四栏:
-
组名称
-
组密码
密码已移到 /etc/gshadow,该字段只有 “x”
-
GID
-
组成员
该组的组员,用逗号分隔,不能有空格。matrix:x:0:neo,trinity
/etc/gshadow
用冒号分隔,共四个字段:
-
组名称
-
密码
如果为空或为 ! 表示无合法密码,所以无组管理员
-
组管理员
-
组员 (同 /etc/group 对应字段)
gshadow 最大的功能就是创建组管理员。
6.4 手动创建帐号
可以通过手动修改 etc/passwd (以下简称 passwd )来创建用户,然后用工具创建该用户在 /etc/shadow (以下简称 shadow )中对应的信息,以便生成其完整的用户信息。
为了便于讨论和理解,某用户在 /etc/shadow 中对应条目,我们可以称为该用户的 影子。
6.4.1 pwconv
pwconv 根据 passwd 中的条目来创建其影子。
-
删除孤儿影子(没有对应的 passwd 条目)
-
如果 passwd 条目中,密码处不是 x,则更新该条目:
-
如果该帐号没有影子,则依据
/etc/login.defs中的PASS_MIN_DAYS,PASS_MAX_DAYS,PASS_WARN_AGE,为其创建影子; -
将密码从 passwd 移到 shadow,并在 passwd 原位置用 x 代替;
-
6.4.2 pwunconv
pwunconv 使用影子信息来更新 passwd,并 删除 /etc/shadow 文件。
passwd 中没有影子的条目不受影响。
这期间,用户影子信息中关于密码期限的设置全部丢失。
6.4.3 grpconv 与 grpunconv
类似地,使用 grpconv 和 grpunconv 可以对组的条目进行手动更新。
6.4.4 pwck
pwck 用于 检查用户信息的完整性。
它会检查 /etc/passwd 和 /etc/shadow ,看各条目的格式是否正确,内容是否合法,两文件中信息是否正确对应,发现错误时会提示用户删除错误条目。
6.4.5 chpasswd
chpasswd 用于以批处理形式更新密码,可用于 批量创建帐号、批量修改密码。
它从标准输入读取一系列的 username:password(用换行符分隔),并用这些信息来更新一系列的用户信息。
原始密码均为明文,由 chpasswd 加密后写入 shadow。
~]# echo "user2:passwd2" | chpasswd