Skip to content

Linux-账号管理

用户账号管理

用户账号概述

用户账号的常见分类

  1. 超级用户:拥有至高无上的权限。root uid=0 gid=0 权限最大。
  2. 普通用户:权限受到限制的用户。1000-65535 做一般权限的系统管理,权限有限。
  3. 程序用户:不登录的用户 系统默认的情况。1=<uid<999 为了提升系统安全性,为了支持所对应服务对系统资源的使用,不能用于登录系统或管理系统。

UID

用户标识 0代表账号为系统管理员,1-999代表系统账号,1000-6000则是一般使用者。

账号文件 /etc/passwd详解

/etc/passwd 是 Linux 系统中存储用户账户信息的关键文件,所有用户(包括系统用户)的基本信息都记录在此。该文件为纯文本格式,全局可读但只有 root 用户可写。

字段结构(共7个字段,用冒号分隔)
序号字段名说明
1用户名用户登录名(如 root, ftp 等)
2密码占位符历史遗留字段,现代系统用 x 表示密码存储在 /etc/shadow
3UID用户ID: - 0 = root - 1-999 = 系统用户 - 1000+ = 普通用户
4GID主组ID,对应 /etc/group 中的组
5GECOS注释字段,通常包含用户全名、联系方式等信息
6家目录用户登录后的初始工作目录
7登录Shell用户默认shell(如 /bin/bash), /sbin/nologin 表示禁止登录

密码数据库文件 /etc/shadow详解

/etc/shadow 是 Linux 系统的密码数据库文件,存储所有用户的加密密码及安全策略信息。相比 /etc/passwd,该文件具有以下特性:

  • 仅 root 用户可读写
  • 采用更安全的存储机制
  • 包含密码时效控制参数
字段结构(9个字段,冒号分隔)
序号字段名格式说明特殊值含义
1用户名/etc/passwd对应-
2加密密码格式:$id$salt$hash (id=1-MD5, 5-SHA256, 6-SHA512)!=锁定账户 *=服务账户
3最后修改日期从1970-1-1起的天数0=下次登录必须修改密码
4最小修改间隔从第 3 字段起,多长时间之内不能修改密码0=无限制
5密码有效期距离第 3 字段多长时间内需要再次变更密码99999=永不过期
6密码过期前告警距离密码有效期的前 n 天告警默认7
7密码过期后宽限期密码过期后仍允许登录的天数空=立即禁用 0=过期后禁用
8账户过期日期从1970-1-1起的天数空=永不过期
9保留字段未使用-
字段详解
bash
[root@localhost ~]#head -1 /etc/shadow
root:$6$9w5Td6lg$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoomff9isV1PzdcXmixzhnMVhMxbvO:15775:0:99999:7:::

1.用户名 同 /etc/passwd 文件的用户名有相同的含义。

2.加密密码 这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。 注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"" 或 "x" 使密码暂时失效。 所有伪用户的密码都是 "!!" 或 "",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。

3.最后一次修改时间 此字段表示最后一次修改密码的时间,可是,为什么 root 用户显示的是 15775 呢? 这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 15775 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 15775 天修改的 root 用户密码。 那么,到底 15775 代表的是哪一天呢?可以使用如下命令进行换算:

bash
[root@localhost ~]# date -d "1970-01-01 15775 days"
2013年03月11日 星期一 00:00:00 CST

4.最小修改时间间隔 最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。 此字段是为了针对某些人频繁更改账户密码而设计的。

5.密码有效期 经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。 该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。

6.密码需要变更前的警告天数 与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 "再过 n 天你的密码就要过期了,请尽快重新设置你的密码!"。 该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 "修改密码" 的警告信息。

7.密码过期后的宽限天数 也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。 比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

8.账号失效时间 同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用! 该字段通常被使用在具有收费服务的系统中。

9.保留 这个字段目前没有使用,等待新功能的加入。

添加用户账号

useradd

useradd 是 Linux 系统中用于创建新用户账户的核心工具,会同时更新以下文件:

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow
  • 用户家目录(可选)
基本语法
bash
useradd [选项] 用户名
选项
选项作用描述
-c "备注"设置用户备注信息(通常为全名)
-d 目录指定家目录路径(默认 /home/用户名
-e 日期设置账户过期日期(格式:YYYY-MM-DD)
-f 天数密码过期后宽限天数(0=立即禁用,-1=禁用此功能)
-g 主组指定主用户组(GID或组名)
-G 附加组指定附加用户组(逗号分隔)
-m自动创建家目录(配合 -k 可指定模板目录)
-M不创建家目录(适用于服务账户)
-N不创建与用户同名的用户组
-p 密码设置加密后的密码(建议用 passwd 命令替代)
-r创建系统账户(UID范围 1-999)
-s shell指定登录shell(如 /bin/bash/sbin/nologin 禁止登录)
-u UID手动指定用户ID
配置文件

/etc/default/useradd 定义默认参数:

ini
GROUP=100        # 默认起始GID
HOME=/home       # 家目录位置
INACTIVE=-1      # 密码过期宽限期。-1表示永久有效,0表示失效
EXPIRE=          # 默认过期日期
SHELL=/bin/bash  # 默认shell
SKEL=/etc/skel   # 家目录模板
注意事项
  1. 创建用户后必须用 passwd 设置密码
  2. 使用 -p 选项时需提供 已加密 的密码(可通过 openssl passwd 生成)
  3. 生产环境中建议使用 -e 设置服务账户过期时间
  4. 删除用户时如需移除家目录,应使用 userdel -r

用户账号的初始配置文件

文件来源

新建用户账号时,从/etc/skel/目录中复制而来

主要的用户初始配置文件:

  • ~/.bash_profile:每次登录时执行
  • ~/.bashrc:每次进入新 bash 环境时执行
  • ~/.bash_logout:每次退出登录时执行

组账号管理

组账号概述

类型作用配置文件关键命令
用户系统使用者身份标识/etc/passwduseradd, usermod, userdel
用户集合,用于共享权限管理/etc/groupgroupadd, groupmod, groupdel
密码认证凭据(加密存储)/etc/shadowpasswd, chage
SELinux增强安全策略(可选)/etc/selinux/configsemanage, chcon

组类型

  • 主组(Primary Group):用户创建文件时默认所属组
  • 附加组(Supplementary Group):用于额外权限分配(如 sudo, docker

组账号文件

  1. /etc/group:保存组账号基本信息
  2. /etc/gshadow:保存组账号的密码信息(较少使用)