基本概念
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个唯一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
用户通过用户账户可以登录到系统,并访问已经被授权使用的资源。
系统根据账户来区分属于每个用户的文件、进程和任务,并给每个用户提供特定的工作环境。
用户与用户组的关系
- 一个用户可以存在于一个组中(一对一的关系)
- 一个用户可以存在多个用户组中,拥有多个组的共同权限(一对多的关系)
- 多个用户可以存在一个组中,这些用户具有和组相同的权限(多对一的关系)
- 多个用户可以存在多个组中(多对多的关系)
账户类型
- 系统账户:守护进程使用系统账户来访问文件和目录,这些操作通常不允许通过 shell 的交互式登录系统账户进行,主要是方便系统管理,大多是在安装系统及部分应用程序时自动添加的。
- 交互式账户:通过 shell 或物理控制台登录系统访问 linux 系统中的资源。
- 超级用户账户(root):对系统具有绝对的控制权,可以管理系统中的所有资源。
- 普通用户账户:访问自己权限范围内的目录和文件。
- 使用用户标识(UID)来区分不同的用户:root 用户的 uid 为0,其他系统用户的 uid从1到999,普通用户账户默认从1000开始编号,创建用户的同时会自动创建一个与用户同名的用户组;使用组标识(GID)来区分不同的组,普通组的 gid 默认也是从1000开始编号的,root 用户的 gid 为0。
用户组
- 具有相同特性的一组用户的集合。
- 一个用户拥有一个自己的主组,其他组为该用户的附加组。
不过需要注意的是,centos7系列的版本是上述所说的编号规则
用户配置文件/etc/passwd
存放用户账户及其相关信息(密码除外)
/etc/passwd 文件对所有用户可读:
/etc/passwd 具体文件内容如下:
各个字段的含义:(以冒号为分隔符)
- 用户名
- 加密的密码(使用 x 占位表示)
- 用户 ID
- 用户组 ID
- 用户的描述信息(默认用户的全名或者空值)
- 用户的主目录
- 登录 shell 类型
举例:
root:x:0:0:root:/root:/bin/bash
-
用户名:root
-
加密的密码:x占位表示
-
用户ID:0
-
用户组ID:0
-
用户的描述信息:root
-
用户的主目录:/root
-
用户登录的 shell 类型:/bin/bash(/sbin/nologin,表示禁止登录)
密码信息配置文件/etc/shadow
用于存放密码相关的信息,包括用户密码
/etc/shadow 文件只对超级用户 root 可读,普通用户无法读取
/etc/shadow 具体文件内容如下:
各个字段的含义:
- 用户名
- 加密后的密码(如果为空,不需要输入密码即可登录系统)
- 密码的最后一次修改时间(是一个相对时间)
- 密码在多少天内不能更改
- 密码在多少天后必须更改
- 密码到期前多少天给用户发出警告
- 密码在多少天后被禁用
- 密码被禁用的具体日期(相对时间)
- 保留的字段
用户组配置文件/etc/group
用于存放用户组的加密密码,每个用户组账户的信息在改文件中占用一行,每行分为4个字段,中间用“:”分割。
/etc/group 文件对所有用户可读:
/etc/group 具体文件内容如下:
各个字段的含义:
- 用户组的组名
- 加密后的用户组密码:一般不设置,提供给用户组管理员使用,同样的密码存放在用户组密码文件中/etc/gshadow 文件中
- 用户组 ID:GID,与/etc/passwd 文件中的第4个字段对应
- 用户组的成员列表(多个组成员用逗号分割):用户的主组并不把该用户作为成员列出,只有用户的附属组才能把该用户作为成员列出
用户属性配置文件/etc/login.defs
建立用户账户是会根据/etc/login.defs文件的配置信息设置用户的某些属性
/etc/login.defs 文件对所有用户可读:
/etc/login.defs 具体文件内容如下:
- MAIL_DIR /var/spool/mail (用户邮箱所在的目录)
- PASS_MAX_DAYS 99999 (账户密码最长有效天数)
- PASS_MIN_DAYS 0 (账户密码最短有效天数)
- PASS_MIN_LEN 5 (账户密码的最小长度)
- PASS_WARN_AGE 7 (账户密码过期前,提前警告的天数)
- UID_MIN 1000 (使用useradd命令添加账户是自动产生UID,最小UID值)
- UID_MAX 60000 (使用useradd命令添加账户是自动产生UID,最大UID值)
- SYS_UID_MIN 201 (使用useradd -r 添加账户时自动产生的系统UID,最小UID值)
- SYS_UID_MAX 999 使用useradd -r 添加账户时自动产生的系统UID,最大UID值)
- GID_MIN 1000 (使用groupadd命令添加账户组时自动产生GID,最小GID值)
- GID_MAX 60000 (使用groupadd命令添加账户组时自动产生GID,最大GID值)
- SYS_GID_MIN 201 使用groupadd -r 添加账户组时自动产生的系统GID,最小GID值)
- SYS_GID_MAX 999 使用groupadd -r 添加账户组时自动产生的系统GID,最大GID值)
- CREATE_HOME yes (创建用户时是否为用户创建主目录)
- USERGROUPS_ENAB yes (创建用户时是否为用户创建同名的组)
- ENCRYPT_METHOD SHA512 (密码加密方式)
用户组密码配置文件/etc/gshadow
用于存放组的加密密码,每个组账户在该行占用一行,每行分为4个字段,中间用“:”分割
/etc/gshadow 文件对所有文件可读:
/etc/gshadow 文件具体内容如下:
各字段含义:
- 用户组的组名
- 加密后的用户组密码:空值代表没密码
- 用户组管理员:空值代表没有管理员
- 用户组的成员列表:空值代表没有成员列表
配置文件总结
安全性
- 账户卫生是系统安全的决定性因素
- 12个字符是一个确保安全的密码的最小长度,虽然和企业中常见的默认要求都要长,但是确实更安全一些比较好
- shadow 密码文件中 MD5 密码字段总是以
$1$
或$md5$
开头,SHA-256密码长度以$5$
开头,SHA-512密码以$6$
开头
规范性建议
-
坚持使用字母数字字符作为登录名,采用小写形式,以字母起始
-
大型站点中,采用全名电子邮件寻址方案(jie.he@565616251),从而向外部隐藏登录名
-
不要回收重用 UID 信息
-
主目录不要通过网络文件系统挂载
-
/etc/shadow 中的相对日期指定的是从1970年1月1日起始的天数(不是秒数)
-
登录名长度限制在32个字符
-
组名长度限制在8个字符
-
组成员关系来自 passwd 和 group 文件中查找结果的合集
-
不建议通过手动维护配置文件来调整系统中的用户管理,而是借助高级一点的工具:useradd、adduser等
用户管理的常见命令
命令 | 说明 |
---|---|
useradd | 添加用户 |
usermod | 修改用户信息 |
userdel | 删除用户及与用户有关联的配置或文件 |
passwd | 为用户设置或修改密码 |
chpasswd | 批量更新用户密码 |
chage | 修改用户密码属性信息 |
id | 查看用户 uid、gid、所归属的用户组信息 |
su | 切换用户角色工具 |
sudo | 普通用户提权的工具 |
visudo | 用于编辑 suders 配置文件(sudo 授权文件) |
用户组管理的常见命令
命令 | 说明 |
---|---|
groupadd | 添加用户组 |
groupdel | 删除用户组 |
groupmod | 修改用户组 |
gpasswd | 为用户组设置密码 |
groups | 显示用户所属的用户组 |
newgrp | 更改用户所属的有效用户组 |
用户的增删改
新增用户
useradd 用法说明:
useradd [-u] [-g] [-G] [-m|M] [-c] [-d] [-s] [-e] [-f] [-r] username
参数说明:(更多参数选项可使用 --help 方式查看)
- -u:新用户的用户 id(uid)
- -g:新用户主组的名称或 gid
- -G:新用户附加组的名称或 gid
- -m:创建新用户的主目录
- -M:强制不创建新用户的主目录
- -c:新用户的说明信息
- -d:新用户的主目录
- -s:指定 shell 类型,未指定默认是 /bin/bash
命令执行后的背后过程:
- 不带任何参数时候,首先读取配置文件/etc/login.defs 和 /etc/default/useradd 中定义的规则,根据规则添加用户
- 同时向/etc/passwd 和 /etc/group 文件内容中添加新建的用户和用户组记录
- /etc/shadow 和 /etc/gshadow 同步生成记录,同时系统还会根据 /etc/defalut/useradd 及 /etc/login.defs 文件中配置的信息建立用户的家目录,并复制 /etc/skel 中所隐藏的环境配置文件到新用户的家目录中
- 最终完成对用户环境的初始化设置
实践:
- 直接不加任何参数添加用户:
useradd ceshi
- 查看相关内容:
-
分析一下过程:
-
查看配置文件:
cat /etc/default/useradd
家目录位置:/home
-1表示不启用用户过期停权
用户终止日期是空值,表示不启用
用户默认使用的 shell 类型:/bin/bash
新建用户下的默认环境变量配置文件路径:/etc/skel
是否创建 mail 文件
-
-
读取 /etc/login.defs 配置文件信息设定相关参数:
新建的用户 uid 是1002
新建家目录的权限是:700(默认umask 077)
- 其他命令用法示例:
# 不带任何参数,新建用户 test
[root@whale ~]# useradd test
# 指定用户组和 uid
[root@whale ~]# useradd -u 888 -g root test1
# 创建用户禁止登陆且不创建家目录
[root@whale ~]# useradd -M -s /sbin/nologin test2
# 创建用户并设置过期时间
[root@whale ~]# useradd -e "2022/09/05" test3
# 创建用户附带一些用户信息
[root@whale ~]# useradd -c "helloworld" test4
[root@whale ~]# tail -n 1 /etc/passwd
test4:x:1006:1006:helloworld:/home/test4:/bin/bash
# 改变配置文件/etc/default/useradd 文件的默认值
# 修改默认登陆 shell 信息
[root@whale ~]# useradd -D -s /sbin/nologin
[root@whale ~]# useradd test5
[root@whale ~]# tail -1 /etc/passwd
test5:x:1007:1007::/home/test5:/sbin/nologin
# 用户信息修改
[root@whale ~]# grep "test4" /etc/passwd
test4:x:1006:1006:ceshi:/home/test4:/bin/bash
[root@whale ~]# usermod -c "测试描述信息" test4
[root@whale ~]# grep "test4" /etc/passwd
test4:x:1006:1006:测试描述信息:/home/test4:/bin/bash
[root@whale ~]#
# 删除用户命令
# -f:强制删除用户,即时当前已登录
# -r:删除用户同时,删除与用户有关的所有文件
[root@whale ~]# grep "test" /etc/passwd
test:x:1003:1003::/home/test:/bin/bash
test1:x:888:0::/home/test1:/bin/bash
test2:x:1004:1004::/home/test2:/sbin/nologin
test3:x:1005:1005::/home/test3:/bin/bash
test4:x:1006:1006:测试描述信息:/home/test4:/bin/bash
test5:x:1007:1007::/home/test5:/sbin/nologin
[root@whale ~]# userdel -r test
[root@whale ~]# userdel -r test1
[root@whale ~]# ll /home/test
ls: cannot access /home/test: No such file or directory
[root@whale ~]#
用户组的增删改
命令用法
groupadd [-g] [-f] 用户组
- -g:指定用户组的 gid,不指定的话,则从默认的 gid 开始
- -f:新增一个账户,强制覆盖一个已经存在的组账户
示例:
# 指定一个 gid 创建
[root@whale ~]# groupadd -g 802 test99
[root@whale ~]# grep "test99" /etc/group
test99:x:802:
# 删除一个用户组(不能删除还有用户存在的用户组)
[root@whale ~]# grep "test99" /etc/group
test99:x:802:
[root@whale ~]# groupdel test99
[root@whale ~]# groupdel root
groupdel: cannot remove the primary group of user 'root'
用户密码的修改
命令用法
passwd [选项] [用户名]
- -k:为密码已经过期的用户更新有效期
- –stdin:从标准输入读取密码字符串
- …
示例:
# 修改当前账户密码
[root@whale ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@whale ~]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
# 修改任意一个账户密码(root 账号下)
[root@whale ~]# passwd test2
Changing password for user test2.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
# 显示账号密码信息
[root@whale ~]# passwd -S test2
test2 PS 2022-09-04 0 99999 7 -1 (Password set, SHA512 crypt.)
# 标准输入设置密码
[root@whale ~]# echo "admin@123"|passwd --stdin test2
Changing password for user test2.
passwd: all authentication tokens updated successfully.
[root@whale ~]#
# 批量修改密码
# chpasswd 命令后每一行按照:用户名:密码 形式输入,一行一个,在新的空行按 ctrl+d 结束输入
[root@whale ~]# grep "test" /etc/passwd
test2:x:1004:1004::/home/test2:/sbin/nologin
test3:x:1005:1005::/home/test3:/bin/bash
test4:x:1006:1006:测试描述信息:/home/test4:/bin/bash
test5:x:1007:1007::/home/test5:/sbin/nologin
[root@whale ~]# chpasswd
test2:admin@123
test3:admin@123
test4:admin@123
test5:admin@123
[root@whale ~]#
# 另一种方式批量修改密码
[root@whale ~]# cat test.txt
test2:admin@123
test3:admin@123
test4:admin@123
test5:admin@123
[root@whale ~]# chpasswd < test.txt
[root@whale ~]#
密码有效期的修改
命令用法
chage [选项] [用户名]
- -l:显示账号有效期信息
- -W:密码到期之前,提前收到警告信息的天数
- -M:密码保持有效的最大天数
- -m:密码可更改的最小天数,默认为0,表示任何时候都可以更改密码
- -I:设置密码过期多少天后禁用账户
- -E:设置密码过期的时间
- -d:设置上一次密码更改的日期
示例:
# 查看账户有效期信息
[root@whale home]# chage -l test2
Last password change : Sep 04, 2022 # 最后一次密码变化时间
Password expires : never # 密码过期时间
Password inactive : never # 密码停权时间
Account expires : never # 账户过期时间
Minimum number of days between password change : 0 # -m 控制
Maximum number of days between password change : 99999 # -M 控制
Number of days of warning before password expires : 7 # -W 控制
[root@whale home]#
# 修改示例
[root@whale ~]# useradd ceshi99
[root@whale ~]# chage -l ceshi99
Last password change : Sep 04, 2022
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@whale ~]# chage -m7 -M60 -W10 -I30 ceshi99
[root@whale ~]# chage -l ceshi99
Last password change : Sep 04, 2022
Password expires : Nov 03, 2022
Password inactive : Dec 03, 2022
Account expires : never
Minimum number of days between password change : 7
Maximum number of days between password change : 60
Number of days of warning before password expires : 10
[root@whale ~]#
用户查询的相关命令
id
## 查看当前登陆用户信息
[root@whale ~]# id
uid=0(root) gid=0(root) groups=0(root)
## 查看特定用户的信息
[root@whale ~]# id ceshi99
uid=1001(ceshi99) gid=1001(ceshi99) groups=1001(ceshi99)
## 只查看用户的 uid
[root@whale ~]# id -u ceshi99
1001
## 只查看用户组的 gid
[root@whale ~]# id -g ceshi99
1001
# 只查看用户名
[root@whale ~]# id -un
root
[root@whale ~]# id -un ceshi99
ceshi99
[root@whale ~]#
## 只查看用户组名
[root@whale ~]# id -gn ceshi99
ceshi99
whoami、w、who、last、lastlog
## 查看当前登陆的用户
[root@whale ~]# whoami
root
## 查看当前已经登陆的用户,并且展示他做了什么信息
[root@whale ~]# w
15:40:18 up 3 days, 16:58, 2 users, load average: 0.00, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 112.193.75.213 15:23 9:30 0.03s 0.03s -bash
root pts/1 112.193.75.213 15:39 2.00s 0.00s 0.00s w
## 查看当前登陆的信息并展示一些:登陆终端以及时间
[root@whale ~]# who
root pts/0 2022-09-04 15:23 (112.193.75.213)
root pts/1 2022-09-04 15:39 (112.193.75.213)
## 显示已登录的用户列表及登陆时间
[root@whale ~]# last
root pts/1 112.193.75.213 Sun Sep 4 15:39 still logged in
root pts/0 112.193.75.213 Sun Sep 4 15:23 still logged in
root pts/1 112.193.75.213 Sun Sep 4 14:38 - 15:23 (00:45)
root pts/0 112.193.75.213 Sun Sep 4 12:57 - 15:22 (02:25)
root pts/0 112.193.75.213 Sun Sep 4 12:57 - 12:57 (00:00)
root pts/1 112.193.75.234 Sat Sep 3 16:42 - 16:42 (00:00)
root pts/0 112.193.75.234 Sat Sep 3 16:22 - 18:34 (02:12)
root pts/1 112.193.75.234 Thu Sep 1 15:43 - 15:47 (00:04)
root pts/0 112.193.75.234 Thu Sep 1 15:29 - 17:41 (02:11)
root pts/2 112.193.75.234 Thu Sep 1 14:17 - 16:29 (02:12)
root pts/1 112.193.75.234 Thu Sep 1 13:24 - 15:35 (02:11)
root pts/0 112.193.75.234 Thu Sep 1 12:59 - 15:11 (02:11)
root pts/0 112.193.75.234 Thu Sep 1 10:55 - 10:55 (00:00)
root pts/0 112.193.75.234 Wed Aug 31 23:42 - 02:02 (02:20)
root pts/0 112.193.75.234 Wed Aug 31 22:44 - 22:46 (00:01)
root pts/0 112.193.75.234 Wed Aug 31 22:43 - 22:44 (00:01)
reboot system boot 3.10.0-957.21.3. Thu Sep 1 06:41 - 15:42 (3+09:01)
reboot system boot 3.10.0-957.21.3. Thu Sep 1 06:40 - 15:42 (3+09:02)
reboot system boot 3.10.0-957.21.3. Wed Oct 21 21:19 - 15:42 (682+18:23)
wtmp begins Thu Jul 11 11:10:20 2019
## 最近所有系统用户的登陆信息
[root@whale ~]# lastlog
Username Port From Latest
root pts/1 112.193.75.213 Sun Sep 4 15:39:49 +0800 2022
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
operator **Never logged in**
games **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
systemd-network