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 流程

  1. 先在 /etc/passwd 里查找用户,找不到则退出,找到则读取其 UID、GID 及家目录,读取 shell 设置;

  2. /etc/shadow 里面找出对应的用户与 UID,核对密码

  3. 密码正确,就登陆 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

group文件与passwd的关系

/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_DAYSPASS_MAX_DAYSPASS_WARN_AGE,为其创建影子;

    • 将密码从 passwd 移到 shadow,并在 passwd 原位置用 x 代替;

6.4.2 pwunconv

pwunconv 使用影子信息来更新 passwd,并 删除 /etc/shadow 文件

passwd 中没有影子的条目不受影响。

这期间,用户影子信息中关于密码期限的设置全部丢失。

6.4.3 grpconvgrpunconv

类似地,使用 grpconvgrpunconv 可以对组的条目进行手动更新。

6.4.4 pwck

pwck 用于 检查用户信息的完整性

它会检查 /etc/passwd/etc/shadow ,看各条目的格式是否正确,内容是否合法,两文件中信息是否正确对应,发现错误时会提示用户删除错误条目。

6.4.5 chpasswd

chpasswd 用于以批处理形式更新密码,可用于 批量创建帐号、批量修改密码

它从标准输入读取一系列的 username:password(用换行符分隔),并用这些信息来更新一系列的用户信息。

原始密码均为明文,由 chpasswd 加密后写入 shadow。

~]# echo "user2:passwd2" | chpasswd