# 用户和用户组管理
# 用户配置文件
# 用户信息文件 /etc/passwd
用户管理简介
- 越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。
- 在 linux 中主要通过用户配置文件来查看和修改用户信息。
/etc/passwd
整体格式:
name:password:UID:GID:GECOS:directory:shell
[root@core-pods-3 ~]# man 5 passwd # 查看配置文件说明
# (1)name:用户名称,非特殊字符
# (2)password:密码标志,x 代表该用户有密码,具体查 shadow 文件;如果 x 不写会默认该用户没密码并可以直接登录(没有密码的登录只允许本机登录,不允许远程 ssh 登录的,所以不用太担心)
# (3)UID:user id,
# - 0:超级用户,可以手动赋予一个普通用户的 uid 为 0,此时该用户行使和 root 同样的权限;
# - 1-499 是系统用户,不能删,删除可能会导致系统崩溃
# - 500 - 65535:普通用户,内核 2.6 后支持 2 的 32 次方用户数量
# (4)GID:(用户初始组 ID)
# - 初始组:就是指用户一登陆就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。
# - 附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个
# (5)用户说明,备注,可以不加
# (6)家目录(宿主目录)
# - 普通用户:/home/ 用户名 /
# - 超级用户:/root/
# (7) 登录之后的 shell,shell 就是 linux 的命令解释器,在 /etc/passwd 当中,除了标准 shell 是 /bin/bash 之外,还可以写如 /sbin/nologin,但是不能写错,写错是登录不了的
[root@core-pods-3 ~]# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
... ...
[root@core-pods-3 ~]#
# linux 一开始密码就放在 passwd 下面,后来密码放在了 /etc/shadwow 下,ll 可以查看到 shadow 文件没有任何操作权限
[root@core-pods-3 ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1785 Aug 4 04:14 /etc/passwd
[root@core-pods-3 ~]# ll /etc/shadow
---------- 1 root root 2161 Aug 4 04:14 /etc/shadow
[root@core-pods-3 ~]# vim /etc/shadow # 可以看到密码以非明文方式记录,只有 root 可以查看
影子文件:/etc/shadow
#(1)root:用户名
#(2)$6$2...:加密后的密码,md5 -> sha512,如果密码位是 "!!" 或 "*",代表没有密码,不能登录
#(3)19174:密码最后一次修改日期:使用 1970 年 1 月 1 日作为标准时间,每过一天时间戳 + 1,这里指 1970 年 1 月 1 日后的第 19174 天
#(4)0:指从第 19174 天开始,任何时间都可以修改密码,如果是 10 的话意思就是 10 天内不能修改密码,所以这个字段指两次密码的修改间隔时间
#(5)99999:密码的有效期,即 19174 + 99999
#(6)7:密码修改到期前的警告天数(和第五个字段相比)
#(7)空:密码过期后的宽限天数(和第五个字段相比)
# - 0:代表密码过期后立即失效,写 0 和不写是一个意思,所以空意味着到期即失效
# - -1:代表密码永远不会失效
#(8)空:账号失效时间,要用时间戳表示
#(9)空:保留
[root@core-pods-3 ~]# vi /etc/shadow
root:$6$2cP08Sf/$/rH6Zw6my.hemDc8/5TDpVfS2an3Hho.HyVU4qYN3d7CMxn0d1zzAHVxrvfzOJBoxWJaaDR.lKkis4iMjO0:19174:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
... ...
user1:!!:19205:0:99999:7:::
user2:!!:19205:0:99999:7:::
user3:!!:19205:0:99999:7:::
# 时间戳换算
[root@core-pods-3 ~]# date -d "1970-01-01 16066 days"
Fri Dec 27 00:00:00 EST 2013
[root@core-pods-3 ~]# echo $(($(date --date="2014/01/06" +%s)/86400+1))
16077
组信息文件
组信息文件:/etc/group
组密码文件:/etc/gshadow
# /etc/group
#
# 总共有 4 个字段:组名、组的密码标志、GID、组中附加用户
# 第一字段 - 组名:默认就是和用户名一样,linux 每添加一个用户会默认添加一个同名的用户组
# 第二字段 - 组密码:不推荐使用组密码,设了组密码可能会行使 root 部分权限,会降低系统安全性
# 第三字段 - GID:group id,组 id,可以强制修改组 id,比如改成和 root 一样的 id 行使和 root 一样的权限
# 第四字段 - 附加用户:只能看到附加用户,看不到初始用户(查看初始用户需要参照 /etc/passwd)
[root@core-pods-3 ~]# vim /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
... ...
Bella3:x:1011:
Bella4:x:1012:
Bella5:x:1013:
# /etc/gshadow
# 第一字段:组名。
# 第二字段:组密码。
# 第三字段:组管理员用户名。
# 第四字段:组中附加用户。
[root@core-pods-3 ~]# vim /etc/gshadow
root:::
bin:::
daemon:::
sys:::
... ...
Bella3:!::
Bella4:!::
Bella5:!::
# 用户管理相关文件
用户的家目录
- 普通用户:/home/ 用户名 /,所有者和所属组都是此用户,权限是 700。
- 超级用户:/root/,所有者和所属组都是 root 用户,权限是 550。
[root@core-pods-3 ~]# ll -d /root/
dr-xr-x---. 6 root root 4096 Aug 8 22:22 /root/
[root@core-pods-3 ~]# ll -d /home/Jalen1
drwx------ 2 Jalen1 Jalen1 4096 Aug 4 04:09 /home/Jalen1
怎么把一个普通用户变为超级用户?
答案:将 /etc/passwd 下的 uid 改为 0,和 root 一样即可,此时它的家目录不会更改,只是登录后不在是 $ 符号而是 #号,也就是权限更改了但是家目录不变。
用户的邮箱
这里的邮箱只是客户端,并没有邮件服务器(类似 qq 邮箱),这里只 linux 用户之间发送邮件,利用的是内存管理,虽然每个用户都有邮箱 (每个用户都会默认创建一个邮箱,名字和用户名一样),但是并没有邮件服务器,邮箱路径是/var/spool/mail/用户名/
。var 是 linux 系统中可变数据保存位置。[root@core-pods-3 ~]# ll /var/spool/mail/
total 4
-rw-rw---- 1 Bella1 mail 0 Aug 4 04:14 Bella1
-rw-rw---- 1 Bella2 mail 0 Aug 4 04:14 Bella2
-rw-rw---- 1 Bella3 mail 0 Aug 4 04:14 Bella3
-rw-rw---- 1 Bella4 mail 0 Aug 4 04:14 Bella4
-rw-rw---- 1 Bella5 mail 0 Aug 4 04:14 Bella5
-rw-rw---- 1 Jalen1 mail 0 Aug 4 04:09 Jalen1
-rw-rw---- 1 Jalen2 mail 0 Aug 4 04:09 Jalen2
-rw-rw---- 1 Jalen3 mail 0 Aug 4 04:09 Jalen3
-rw-rw---- 1 Jalen4 mail 0 Aug 4 04:09 Jalen4
-rw-rw---- 1 Jalen5 mail 0 Aug 4 04:09 Jalen5
-rw-rw---- 1 linzhiling mail 0 Jul 15 22:27 linzhiling
-rw------- 1 root mail 628 Jul 17 22:39 root
-rw-rw---- 1 user1 mail 0 Aug 1 00:21 user1
-rw-rw---- 1 user2 mail 0 Aug 1 00:21 user2
-rw-rw---- 1 user3 mail 0 Aug 1 00:21 user3
[root@core-pods-3 ~]#
用户模板目录
目录为/etc/skel
。在这个目录下可以写一些说明信息,这样在新用户添加后,这些规则性的文件或说明会自动创建在这个新用户的家目录下,也就是家目录下会根据这个模板去生成相应的文件,我们可以使用ls -a
查看下这个目录,能够发现有很多用户配置文件比如.bash_profile
和.bashrc
都在这个目录下。[root@core-pods-3 ~]# cd /home/Jalen1
[root@core-pods-3 Jalen1]# ls
[root@core-pods-3 Jalen1]# ls -a
. .. .bash_logout .bash_profile .bashrc
[root@core-pods-3 Jalen1]# ll /etc/skel/
total 0
[root@core-pods-3 Jalen1]# cd /etc/skel/
[root@core-pods-3 skel]# vi warning.txt # 随便写点
[root@core-pods-3 skel]# ls
warning.txt
[root@core-pods-3 skel]# ls -a
. .. .bash_logout .bash_profile .bashrc warning.txt
[root@core-pods-3 skel]# useradd superman
[root@core-pods-3 skel]# passwd superman
Changing password for user superman.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@core-pods-3 skel]# cd /home/superman/
[root@core-pods-3 superman]# ls -a
. .. .bash_logout .bash_profile .bashrc warning.txt
[root@core-pods-3 superman]# cat warning.txt
Please follow the rules.
# 用户和用户组管理
用户添加命令 useradd
命令
# useradd [选项] 用户名
,选项:- -u UID:手工指定用户的 UID 号。不建议手动指定
- -d 家目录:手工指定用户的家目录。不推荐
- -c 用户说明:手工指定用户的说明。
- -g 组名:手工指定用户的初始组
- -G 组名:指定用户的附加组
- -s shell:手工指定用户的登录 shell。默认是
/bin/bash
[root@core-pods-3 ~]# useradd jalen
[root@core-pods-3 ~]# passwd jalen
Changing password for user jalen.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@core-pods-3 ~]# grep jalen /etc/passwd
jalen:x:1015:1015::/home/jalen:/bin/bash
[root@core-pods-3 ~]# grep jalen /etc/shadow
jalen:$6$YfI2Q0.f$8yPh9s7e7jmAE1ifpvyc3LdEyZqVY/tTKGKZPDlYYRS90lEmINh.FdXssa87c4f/s3NEz9wqkNt..aypD1.:19213:0:99999:7:::
[root@core-pods-3 ~]# grep jalen /etc/group
jalen:x:1015:
[root@core-pods-3 ~]# grep jalen /etc/gshadow
jalen:!::
[root@core-pods-3 ~]# ll -d /home/
drwxr-xr-x. 18 root root 4096 Aug 8 23:15 /home/
[root@core-pods-3 ~]# ll -d /home/jalen/
drwx------ 2 jalen jalen 4096 Aug 8 23:15 /home/jalen/
[root@core-pods-3 ~]# ll /var/spool/mail/jalen
-rw-rw---- 1 jalen mail 0 Aug 8 23:15 /var/spool/mail/jalen
[root@core-pods-3 ~]#
[root@core-pods-3 ~]# useradd -u 550 -G root,bin -d /home/jjj -c "test user jjj" -s /bin/bash kkk
[root@core-pods-3 ~]# grep kkk /etc/passwd
kkk:x:550:1016:test user jjj:/home/jjj:/bin/bash
[root@core-pods-3 ~]# ll -d /home/jjj
drwx------ 2 kkk kkk 4096 Aug 9 00:10 /home/jjj
[root@core-pods-3 ~]#
用户默认值文件
/etc/default/useradd
- GROUP=100:用户默认组
- HOME=/home:用户家目录
- INACTIVE=-1:密码过期宽限天数(shadow 文件 7 字段)
- EXPIRE=:密码失效时间(shadow 文件 8 字段)
- SHELL=/bin/bash:默认 shell
- SKEL=/etc/skel:模板目录
- CREATE_MAIL_SPOOL=yes:是否建立邮箱
[root@core-pods-3 ~]# vi /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/login.defs
- PASS_MAX_DAYS 99999:密码有效期(shadow 文件的第五个字段)
- PASS_MIN_DAYS 0:密码修改间隔(shadow 文件的第四个字段)
- PASS_MIN_LEN 5:密码最少 5 位(现在 PAM 生效,这个属性不生效了,要求最低 8 位)
- PASS_WARN_AGE 7:密码到期警告(shadow 文件的第六个字段)
- UID_MIN 500:最小和最大 UID 范围
- GID_MAX 60000
- ENCRYPT_METHOD SHA512:加密模式
[root@core-pods-3 ~]# vi /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
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
修改用户密码 passwd
命令格式
# passwd [选项] 用户名
,选项:- -S:查询用户密码的密码状态。仅 root 用户可用。
- -l:暂时锁定用户。使该用户暂时不能登入,仅 root 用户可用。(其实是在 /etc/shadow 里密码前加了一个感叹号)
- -u:解锁用户。仅 root 用户可用。
- --stdin:可以通过管道符输出的数据作为用户的密码。
[root@core-pods-3 ~]# passwd kkk
Changing password for user kkk.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@core-pods-3 ~]# passwd # 不加用户名默认修改当前登录用户的密码
Changing password for user root.
New password:
[root@core-pods-3 ~]# passwd -S kkk # 查看密码状态 (对比 shadow 看)
# 用户名,密码设定时间,密码修改时间间隔,密码有效期,警告时间,密码不失效 - 1
kkk PS 2022-08-08 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@core-pods-3 ~]# cat /etc/shadow | grep kkk
kkk:$6$OLQqCgMg$wAAR686.a9PQs0gJDRiswjV5S.1sQ4oWS9Cum.owam9orBcZCfQjx6/UaaZHFnlh96wyfCZwF1RpjjRog60:19213:0:99999:7:::
[root@core-pods-3 ~]# echo "123" | passwd --stdin kkk
Changing password for user kkk.
passwd: all authentication tokens updated successfully.
修改用户信息 usermod 和修改用户密码状态 chage
命令
# usermod [选项] 用户名
,选项:- -u UID:修改用户的 UID 号
- -c 用户说明:修改用户的说明信息
- -G 组名:修改用户的附加组
- -L:临时锁定用户 lock
- -U:解锁用户锁定 unlock
命令
# chage [选项] 用户名
,选项:- -l:列出用户的详细密码状态
- -d 日期:修改密码最后一次更改日期(shadow 3 字段)
- -m 天数:两次密码修改间隔(4 字段)
- -M 天数:密码有效期(5 字段)
- -W 天数:密码过期前警告天数(6 字段)
- -I 天数:密码过期后宽限天数(7 字段)
- -E 日期:账号失效时间(8 字段)
[root@core-pods-3 ~]# chage -l kkk
Last password change : Aug 09, 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@core-pods-3 ~]# chage -d 0 kkk
# 这个命令其实是把密码修改日期归 0 了(shadow 第三字段),这样用户一登陆就要修改密码
[root@core-pods-3 ~]# grep kkk /etc/shadow
kkk:$6$9.3inrrJ$wSy.U1PsX6idF4J8KkDo7Uru5Q26hgEX3sY174jLdFphZG2FCi6cfCVON2eOMLSZ3JvgCE2i46vJMTDCcz.:0:0:99999:7:::
## 使用 kkk 登录直接让你改密码
You are required to change your password immediately (root enforced)
Warning: I am a policeman, will catch you!
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user kkk.
Changing password for kkk.
(current) UNIX password:
删除用户 userdel 和用户切换命令 su
- 删除用户 userdel:
userdel [-r] 用户名
,-r 意思是删除用户的同时删除用户家目录 - 手工删除用户:
[root@core-pods-3 ~]# vi /etc/passwd
[root@core-pods-3 ~]# vi /etc/shadow
[root@core-pods-3 ~]# vi /etc/group
[root@core-pods-3 ~]# vi /etc/gshadow
[root@core-pods-3 ~]# rm -rf /home/kkk
[root@core-pods-3 ~]# rm -rf /var/spool/mail/kkk
- 查看用户 ID:
id 用户名
[root@core-pods-3 ~]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@core-pods-3 ~]# id kkk
uid=550(kkk) gid=1016(kkk) groups=1016(kkk),0(root),1(bin)
[root@core-pods-3 ~]#
- 切换用户身份 su:
su [选项] 用户名
,选项- -:选项只使用 “-” 代表连带用户的环境变量一起切换
- -c 命令:仅执行一次命令,而不切换用户身份
[root@core-pods-3 ~]$ su - root
[root@core-pods-3 ~]$ su - root -c "useradd user3"
# 用户组管理
添加用户组:
groupadd [选项] 用户组名
- g GID:指定组 ID
[root@core-pods-3 ~]# groupadd tg
[root@core-pods-3 ~]# vi /etc/group
修改用户组:
groupmod [选项] 用户组名
- g GID:修改组 ID
- n 新组名:修改组名
[root@core-pods-3 ~]# groupmod -n lampg tg
[root@core-pods-3 ~]# vi /etc/group
删除用户组:
groupdel 用户组名
,删除时组里不能有初始用户,可以有附加用户[root@core-pods-3 ~]# groupadd tg
[root@core-pods-3 ~]# useradd -g tg lamp
[root@core-pods-3 ~]# useradd -G tg lamp1
[root@core-pods-3 ~]# vi /etc/group
[root@core-pods-3 ~]# groupdel tg
groupdel: cannot remove the primary group of user 'lamp'
[root@core-pods-3 ~]# userdel -r lamp
[root@core-pods-3 ~]# groupdel tg
把用户添加入组或从组中删除:
gpasswd [选项] 组名
- -a 用户名:把用户加入组
- -d 用户名:把用户从组中删除
[root@core-pods-3 ~]# grep "Bella" /etc/passwd
Bella1:x:1009:1009::/home/Bella1:/bin/bash
Bella2:x:1010:1010::/home/Bella2:/bin/bash
Bella3:x:1011:1011::/home/Bella3:/bin/bash
Bella4:x:1012:1012::/home/Bella4:/bin/bash
Bella5:x:1013:1013::/home/Bella5:/bin/bash
[root@core-pods-3 ~]# grep "Bella" /etc/group
Bella1:x:1009:
Bella2:x:1010:
Bella3:x:1011:
Bella4:x:1012:
Bella5:x:1013:
[root@core-pods-3 ~]# gpasswd -a Bella1 root
Adding user Bella1 to group root
[root@core-pods-3 ~]# grep "Bella" /etc/group
root:x:0:kkk,Bella1
Bella1:x:1009:
Bella2:x:1010:
Bella3:x:1011:
Bella4:x:1012:
Bella5:x:1013:
[root@core-pods-3 ~]# gpasswd -a Bella2 root
Adding user Bella2 to group root
[root@core-pods-3 ~]# grep "Bella" /etc/group
root:x:0:kkk,Bella1,Bella2
Bella1:x:1009:
Bella2:x:1010:
Bella3:x:1011:
Bella4:x:1012:
Bella5:x:1013:
[root@core-pods-3 ~]# gpasswd -d Bella2 root
Removing user Bella2 from group root
[root@core-pods-3 ~]# grep "Bella" /etc/group
root:x:0:kkk,Bella1
Bella1:x:1009:
Bella2:x:1010:
Bella3:x:1011:
Bella4:x:1012:
Bella5:x:1013:
[root@core-pods-3 ~]#