RHCE8学习指南 第8章 用户管理

8.1 基本概念

用户在操作系统中是非常重要的一块,我们登录系统,访问共享文件夹等都需要用户进行验证。所以,掌握管理用户的知识是非常有必要的。
说到用户,我们会提到两个名词账户信息和木马信息。
账户信息:我们可以理解为QQ号码,QQ签名,QQ中填写的个人资料等。
密码信息:就是登录QQ的密码。
用户的账户信息是存储在/etc/passwd中的,在此文件中一行一个用户的信息,用“:”隔开,例如,下图所示的例子。
file

1:用户名。
2:原来此处用于存储用户的密码,因为安全性问题,这里统一用x作为占位符。
3:用户的uid,每个用户都会有一个user id,简称为uid。root的uid为0。
4:用户的gid,每个组也会有一个group id,简称为gid。
5:用户的描述信息。
6:用户的家目录。
7:用户的shell。
上面的命令也可以通过命令“getent password 用户名”获取,如下所示。

[root@server ~]# getent  passwd  lduan
lduan:x:1000:1000:lduan:/home/lduan:/bin/bash
[root@server ~]#

用户的密码信息存储在/etc/shadow中,如下所示。

[root@server ~]# grep lduan /etc/shadow
lduan:$6$Z7aM5EPapyU3cvCV$ha.zQkx9XgRmGyMnub.Fw7hqxmcwhGxMqXGSO.ZXmFt.uBXSpzbzQ.1ATUfyNBA6gppPigSU45NatmpipZv48/::0:99999:7:::
[root@server ~]# 

上面第一个和第二个冒号之间部分的斜体字就是被加密后的密码。上面的信息也可以通过命令“getent shadow 用户名”获取,如下所示。

[root@server ~]# getent shadow lduan
lduan:$6$Z7aM5EPapyU3cvCV$ha.zQkx9XgRmGyMnub.Fw7hqxmcwhGxMqXGSO.ZXmFt.uBXSpzbzQ.1ATUfyNBA6gppPigSU45NatmpipZv48/::0:99999:7:::
[root@server ~]#

判断一个用户存在不存在可以使用“id 用户名”,如下所示。

[root@server ~]# id tom
id: “tom”:无此用户
[root@server ~]# 

这里tom用户不存在,则显示无此用户。如果用户存在则显示用户信息,如下图所示。
file

1:显示用户的uid信息
2:显示用户的gid信息
3:显示用户的gid信息
如果id后面没有跟用户,则显示当前用户自己的信息。

[root@server ~]# id 
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unc...
[root@server ~]#

8.2 管理用户

管理用户包括创建用户和修改用户属性。

8.2.1 创建用户

利用命令useradd可以创建用户,useradd中常见的选项包括8种。
(1)-d:用户指定家目录,默认为/home/用户名。
(2)-m:创建家目录,默认就创建一般不用指定。
(3)-M:不为用户创建家目录,即创建好用户之后没有“/home/用户名”。
(4)-s:用户指定用户的shell,默认为/bin/bash。
(5)-c:用来指定备注信息,不指定则为空。
(6)-u:指定用户UID。
(7)-g:默认情况下创建用户时会创建一个同名组,例如,创建tom用户,则会创建一个tom组,然后把tom用户加入tom组中,如果指定了-g root,则创建用户时直接把tom加入root组,就不会再创建tom组,此时tom只属于一个组。
(8)-G:指定附属组,即把用户加入一个额外的组,此时tom属于2个组。
如果-g -G同时指定比如 -g root -G users 意思就是不再为tom创建命名组直接加入root组,同时再额外地加入users组,此时tom就属于2个组,即root和user组。
下面创建tom用户,如下所示。

[root@server ~]# useradd -d /tom -s /sbin/nologin \
>  -c "Im tom" -u 2000 -g root -G users tom
[root@server ~]#

这里创建一个tom用户,因为命令太长所以最后加一个反斜线后按【Enter】键,这里虽然换行了但是系统会认为仍然是一行的。
记住反斜线后面不能有空格,当按【Enter】键之后前面会自动出现一个提示符“>”,这个“>”不是我们输入的。
现在查看tom用户的属性,如下所示。

[root@server ~]# grep tom /etc/passwd
tom:x:2000:0:Im tom:/tom:/sbin/nologin
[root@server ~]#

可以看到,这里tom的属性完全是按照我们的要求创建出来的。
查看下密码信息,如下所示。

[root@server ~]# grep tom /etc/shadow
tom:!!:18848:0:99999:7:::
[root@server ~]#

因为我们在创建用户时,并没有指定用户的密码,所以这里密码为空。当我们创建用户时,没有给这个用户设置密码,则这个用户是处于被锁定状态即不能登录,如下所示。

[root@server ~]# passwd -S tom
tom LK 2021-08-09 0 99999 7 -1 (密码已被锁定。)
[root@server ~]#

现在为tom设置密码,可以通过如下所示命令。

[root@server ~]# passwd tom
更改用户 tom 的密码 。
新的 密码:haha001
无效的密码: 密码少于 8 个字符
重新输入新的 密码:haha001
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]#

这里把密码设置为haha001,或者使用如下命令。

[root@server ~]# echo haha001 | passwd --stdin tom

更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]#

再次查看用户的状态,如下所示。

[root@server ~]# passwd -S tom
tom PS 2021-08-09 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@server ~]#

这里显示用户已经设置了密码,查看密码信息,如下所示。

[root@server ~]# grep tom /etc/shadow
tom:$6$dj7axXv3/Dw7FliM$DRlhxqOKlHCVmjrkzlk30jFYsEGm7LjQyanzZswAVpDgvo8055XJKv0LsIS9Y4kTIJMscup4mrw3qy/cg6Enl0:18848:0:99999:7:::
[root@server ~]#

这里已经有了密码。
但是现在用户仍然是不能登录的,我们现在用su命令切换到tom用户:

[root@server ~]# su - tom
This account is currently not available.
[root@server ~]#

这是因为tom用户的shell被设置为了/sbin/nologin,任何用户的shell被设置为/sbin/nologin,则此用户是不能登录系统的。那么,创建此用户的意义何在?很多时候我们搭建了服务,如用samba共享了一个目录,希望其他主机来访问此共享目录时不能以匿名用户访问,必须要输入相关的用户名和密码,但又不想让他能登录系统,这种情况下就可以用到了。

8.2.2 修改用户属性

如果想修改用户属性,可以使用usermod选项,usermod命令所能用到的选项和useradd是差不多的,下面讲最常见的5个选项。
(1)-c:修改注释信息。
(2)-s:修改shell信息。
(3)-d:修改家目录。
(4)-L:锁定用户。
(5)-U:解锁用户。
把tom的shell改成/bin/bash,并把备注信息修改成 hello tom,如下所示。

[root@server ~]# usermod -s /bin/bash -c "hello tom" tom
[root@server ~]# 
[root@server ~]# grep tom /etc/passwd
tom:x:2000:0:hello tom:/tom:/bin/bash
[root@server ~]#

1. 锁定用户

锁定用户的命令如下所示。

[root@server ~]# usermod -L tom
[root@server ~]# passwd -S tom
tom LK 2021-08-09 0 99999 7 -1 (密码已被锁定。)
[root@server ~]# 

锁定用户,使用root用户是可以su过去的,但是使用其他用户是不能su过去的,如下所示。

[root@server ~]# su - tom
[tom@server ~]$ exit
注销
[root@server ~]#

root用户可以su过去。再打开一个终端,这个终端中是以lduan用户登录的,然后通过su命令切换到tom用户,如下所示。

[lduan@server ~]$ su - tom
密码:
su: 鉴定故障
[lduan@server ~]$ 

可以看到,lduan用户su不过去,提示为鉴定故障。

2. 解锁用户

如果要解锁用户,可以用usermod -L命令,下面把tom用户解锁。

[root@server ~]# usermod -U tom
[root@server ~]# passwd -S tom
tom PS 2021-08-09 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@server ~]#

在第二个终端中用lduan用户su到tom。

[lduan@server ~]$ su - tom
密码:
[tom@server ~]$ whoami
tom
[tom@server ~]$ pwd
/tom
[tom@server ~]$ exit
注销
[lduan@server ~]$ 

此时其他用户是可以正常切换的。

3. 修改用户家目录

前面已经看到了,tom用户的家目录设置为/tom,现在想把家目录改到/home/tom,命令如下所示。

[root@server ~]# usermod -d /home/tom tom
[root@server ~]# grep tom /etc/passwd
tom:x:2000:0:hello tom:/home/tom:/bin/bash
[root@server ~]#

可以看到,tom的家目录已经设置为了/home/tom,在第二个终端中测试输入如下命令。

[lduan@server ~]$ su - tom
密码:
su: 警告:无法更改到 /home/tom 目录: 没有那个文件或目录
[tom@server lduan]$

这里显示无法切换到/home/tom,因为创建用户时用户的家目录是创建在/tom下的,但是手动修改tom的家目录为/home/tom,但是这个家目录并没有在/home下创建,所以才会出现刚才的问题。我们只要把原来的家目录拷贝过去即可,在第一个终端中执行如下命令。

[root@server ~]# cp -a /tom/ /home/
[root@server ~]# ls /home/
lduan  tom
[root@server ~]#

再回到第二个终端中测试,输入如下命令。

[tom@server lduan]$ exit
注销
[lduan@server ~]$ su - tom
密码:
[tom@server ~]$ pwd
/home/lduan
[tom@server ~]$ exit
注销
[lduan@server ~]$

可以看到,已经可以切换到家目录了。

4. 管理组

所有组的信息都是放在/etc/group中的,如果判断一个组是否存在,可以到/etc/group中查询,例如,现在判断bob组是否存在,命令如下。

[root@server ~]# grep bob /etc/group
[root@server ~]#

没有任何结果显示,则是bob组不存在,如果想创建一个新的组,则用“groupadd 组名”,例如,现在要创建bob组,命令如下。

[root@server ~]# groupadd bob
[root@server ~]# grep bob /etc/group
bob:x:1001:
[root@server ~]#

如果要删除某个组,则用groupdel 组名,例如,现在要删除bob组,命令如下。

[root@server ~]# groupdel bob
[root@server ~]# grep bob /etc/group
[root@server ~]#

创建组时,可以通过-g来指定gid信息,例如,创建bob组,组id设置为3000,命令如下。

[root@server ~]# groupadd -g 3000 bob
[root@server ~]# grep bob /etc/group
bob:x:3000:
[root@server ~]#

再次删除bob组。
查看用户属于哪个组的,可以用 groups 用户 来查看,例如,查看tom属于哪个组,命令如下。

[root@server ~]# groups tom
tom : root users
[root@server ~]#

可以看到,tom属于root和users组。如果想把用户继续添加到其他组中,可以用“gpasswd -a 用户 组”来添加,例如,现在要把tom加入bin组,命令如下。

[root@server ~]# gpasswd -a tom bin
正在将用户“tom”加入“bin”组中
[root@server ~]# 
[root@server ~]# groups tom
tom : root bin users
[root@server ~]# 

这里可以看到,tom已经属于bin组了。
要是想把用户从某个组中踢出去,则用“gpasswd -d 用户 组”来删除,例如,现在要把tom从bin组中删除,命令如下。

[root@server ~]# gpasswd -d tom bin
正在将用户“tom”从“bin”组中删除
[root@server ~]# groups tom
tom : root users
[root@server ~]#

此处可以看到,tom已经不属于bin组了。

8.3 用户的密码策略

很多人是没有修改密码习惯的,设置了一个密码就一直使用下去,那么这样会带来一定的安全隐患。所以,为了安全性需要设置一定的密码策略,使用的命令是chage。
chage常见的选项包括以下几种。
(1)-l:列出用户的信息。

[root@server ~]# chage -l tom
最近一次密码修改时间          :8月 09, 2021
密码过期时间                  :从不
密码失效时间                  :从不
    ...输出...
[root@server ~]# 

这里也可以看到,tom的密码是在2021-08-09改的。
(2)-d:用于更改最近一次修改密码的日期,如改成2021-07-08。

[root@server ~]# chage -d 2021-07-08 tom
[root@server ~]# chage -l tom
最近一次密码修改时间          :7月 08, 2021
密码过期时间                  :从不
密码失效时间                  :从不
    ...输出...
[root@server ~]#

(3)-E:设置此账户什么时候过期,如要设置2022-12-21日过期。

[root@server ~]# chage -E 2022-12-21 tom
[root@server ~]# chage -l tom
    ...输出...
账户过期时间                      :12月 21, 2022
两次改变密码之间相距的最小天数     :0
    ...输出...
[root@server ~]#

那么,tom用户到了2022-12-21就会被锁定,不能登录系统了。
(4)-E -1:设置为永不过期。

[root@server ~]# chage -E -1 tom
[root@server ~]# chage -l tom
最近一次密码修改时间              :7月 08, 2021
    ...输出...
账户过期时间                      :从不
    ...输出...
[root@server ~]# 

(5)-E 1:立即过期的意思。
(6)-M:最大使用天数,过了这个天数还不修改密码,账户将被锁定。
(7)-m:最小使用天数,两次修改密码的间隔不得低于这个天数,不能今天改了明天再改回去。
(8)-W:达到最大使用天数之前,提前几天警告。如同房贷,提前一周短信通知银行卡余额要足够。
(9)-I:达到最大使用天数之后还没修改密码,不会立即锁定账户,再给你几天的缓冲期,但是在这缓冲期内不管何时登录系统,都会强迫你修改密码。如果在缓冲期内也没有修改密码,则要锁定账户。

[root@server ~]# chage -m 5 -M 30 -W 6 -I 3 tom
[root@server ~]# chage -l tom
最近一次密码修改时间          :7月 08, 2021
密码过期时间                  :8月 07, 2021
密码失效时间                  :8月 10, 2021
账户过期时间                      :从不
两次改变密码之间相距的最小天数     :5
两次改变密码之间相距的最大天数     :30
在密码过期之前警告的天数    :6
[root@server ~]#

这里把最小使用时间设置为5天,密码最大使用天数设置为30天,警告天数为6天,缓冲期为3天。我们能看到上次修改密码是在7月8号,到8月7日是最大使用天数了,加上3天的缓冲期即8月10号,到现在还在缓冲期内(做本实验的日期是8月9号)。在第二个终端中su 到tom。

[lduan@server ~]$ su - tom
密码:旧密码
You are required to change your password immediately (password expired)
Current password: 旧密码
新的 密码:
重新输入新的 密码:
[tom@server ~]$

此处输入原来的密码之后并没有进入系统,而是开始强制设置新密码了。
在第一个终端中,再次把密码设置为haha001。

[root@server ~]# echo haha001 | passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]#

设置下次登录强制修改密码,命令如下所示。

[root@server ~]# chage -d 0 tom
[root@server ~]# 

此时tom登录时,必须要重置密码才可以。
上面关于账户的锁定及密码的过期时间,也可以使用passwd命令实现,如下图所示。
file
提示:具体操作,读者可以自行练习。
这里需要注意的是,如果想清除某用户的密码,可以使用passwd -d 用户名 来实现,命令如下所示。

[root@server ~]# passwd -d tom
清除用户的密码 tom。
passwd: 操作成功
[root@server ~]# passwd -S tom
tom NP 2021-08-09 5 30 6 3 (密码为空。)
[root@server ~]#

tom再登录系统时,是不需要密码的。

[lduan@server ~]$ su - tom
[tom@server ~]$
[tom@server ~]$ exit
注销
[lduan@server ~]$

删除用户的命令是userdel。

[root@server ~]# userdel -r tom
[root@server ~]# ls /home/
lduan
[root@server ~]# id tom
id: “tom”:无此用户
[root@server ~]#

userdel 后面加上-r的意思是除删除此用户外,同时把用户的家目录,邮件等全部删除。

8.4 用户的授权

前面讲了普通用户很多时候权限是不够的,例如,下面的命令。

[lduan@server ~]$ mount /dev/cdrom /mnt
mount: 只有 root 能执行该操作
[lduan@server ~]$ 

要执行该操作,需要使用su命令切换到root。但是并不希望其他人知道root密码,那怎么办?那么,我们可以让root用户通过sudo对普通用户进行授权。
首先查看本机的主机名,命令如下所示。

[root@server ~]# hostname
server.rhce.cc
[root@server ~]#

到/etc/sudoers.d/下随便创建一个文件,建议使用用户名作为文件名(不过文件名可以随便取的),这样比较方便看出来是对哪个用户授权的,假设现在对lduan用户授权,则创建文件/etc/sudoers.d/lduan,文件中的格式如下。

userX   主机名Z=(userY)    命令1,命令2,命令3,...

这里表明授权用户userX在主机名Z这台主机上有权限执行命令1,命令2,命令3,...。

需要注意的是,这里主机名要写本机的主机名,不要写错了,为了防止写错,可以把主机名写成ALL。

userX   ALL=(userY)    命令1,命令2,命令3,...

假设现在授权lduan用户在本机能以root身份使用mount命令,编辑内容如下。

[root@server ~]# cat /etc/sudoers.d/lduan
lduan   server.rhce.cc=(root)   /bin/mount
[root@server ~]#

用户要是想执行sudo授权过的命令,则命令前面要加上sudo。
在另外一个终端中,执行mount命令,如下所示。

[lduan@server ~]$ sudo mount /dev/cdrom /mnt
    ...输出...
[sudo] lduan 的密码:此处输入lduan的密码
mount: /mnt: WARNING: device write-protected, mounted read-only.
[lduan@server ~]$

此时可以看到,已经可以执行了,这里输入的密码会保留5分钟,5分钟之内再次执行sudo是不要密码的,过了5分钟再执行sudo命令则还需要密码。可以使用“sudo -k”立即清除记忆的密码。
下面执行umount操作,命令如下所示。

[lduan@server ~]$ sudo umount /mnt
对不起,用户lduan无权以root的身份在server.rhce.cc上执行/bin/umount /mnt。
[lduan@server ~]$

还是不行,为何?因为我们只授权lduan执行mount命令,并没授权执行umount命令。下面使用root授权lduan能执行umount命令,修改/etc/sudoers.d/lduan内容如下。

[root@server ~]# cat /etc/sudoers.d/lduan
lduan   server.rhce.cc=(root)   /bin/mount,/bin/umount
[root@server ~]#

此时对lduan授权mount和umount命令,然后到第二个终端中再次执行如下命令。

[lduan@server ~]$ sudo umount /mnt
[lduan@server ~]$

已经可以正常执行了。
查看lduan被授权执行哪些命令,可以通过sudo -l查看,命令如下所示。

[lduan@server ~]$ sudo -l
...一堆输出...
用户lduan可以在server上运行以下命令:
    (root) /bin/mount, /bin/umount
[lduan@server ~]$

前面介绍了sudo命令需要输入密码,这个密码会保留5分钟,如果想修改此默认时间,可以通过vim修改/etc/sudoers添加Defaults timestamp_timeout=N,此处N为一个数字,单位为分钟,如果想立即清除保存的密码,用sudo -k即可。
如果让lduan执行授权命令时不需要输入密码,则可以加上NOPASSWD即可,修改/etc/sudoers.d/lduan内容如下。

[root@server ~]# cat /etc/sudoers.d/lduan
lduan    server.rhce.cc=(root) NOPASSWD:   /bin/mount,/bin/umount
[root@server ~]# 

在另外终端上验证,命令如下所示。

[lduan@server ~]$ sudo -k
[lduan@server ~]$ sudo mount /dev/cdrom /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[lduan@server ~]$ sudo -k
[lduan@server ~]$ sudo umount /mnt
[lduan@server ~]$

此时并没有输入密码,这里特意执行sudo -k的目的就是确保没有缓存密码。
如果想授权所有命令给lduan,则可以在命令位置上用ALL替代,命令如下所示。

[root@server ~]# cat /etc/sudoers.d/lduan
lduan      server.rhce.cc=(root) NOPASSWD:      ALL
[root@server ~]#

此时lduan用户通过sudo -i无密码切换到root用户,命令如下所示。

[lduan@server ~]$ sudo -i
[root@server ~]# 
[root@server ~]# exit
注销
[lduan@server ~]$

在编辑/etc/sudoers.d/lduan时,为了防止主机名写错,可以把主机名的位置可以写ALL,命令如下所示。

[root@server ~]# cat /etc/sudoers.d/lduan
lduan            ALL=(root) NOPASSWD:              ALL
[root@server ~]#

8.5重置root密码

在前面已经讲了对用户的管理,我们都是以root用户操作的,如果忘记了root用户的密码,那么该如何重新设置root密码呢?下面开始练习如何重置root密码。
步骤1:首先重启系统,在看到内核引导界面时通过上下键选择第一行(默认选择的就是第一行),如图8-4显示。
file

步骤2:在键盘上按【e】键,表示编辑,通过上下键把光标调到linux那行,然后按键盘上的【End】键,把光标调整到linux那行的最后,输入“rd.break”,如下图。
file

步骤3:修改之后按【Ctrl+x】组合键启动系统,之后能看到一个提示符,如下图。
file

现在进入的是一个处于内存中的临时系统,之前挂载到"/"的分区/dev/sda1被挂载到当前这个系统的/sysroot目录中了,如图8-7。
file

这里/dev/sda1是以只读(ro)的方式挂载在/sysroot目录上的,如下图。
file

步骤4:把/dev/sda1以读写(rw)的方式重新挂载到/sysroot,如下图
file

这样就把/dev/sda1以rw的方式挂载到/sysroot中了,如下图。
file

步骤5:通过chroot /sysroot命令切换到硬盘所在系统,如下图。
file

这样我们所处在就不再是内存中的那个临时系统了,而是进入了之前安装在/dev/sda1中的操作系统中了。
步骤6:把root密码修改为haha001,如下图。
file

因为我们的系统默认语言是简体中文,在当前模式下并不能显示中文所以这里会出现方块字。如果要把结果以英文来输出,在passwd命令前加上LANG=C即可,如下图。
file

步骤7:在/目录下创建隐藏文件/.autorelabel。
file
因为重置了密码,所以要重置selinux标签,创建这个文件的目的就是重置selinux标签。关于selinux的内容,在后面有专门章节讲解。
需要注意的是,这里是/.autorelabel,不是/.autorelable,也不是./autorelabel。
步骤8:执行exit 回车,再次执行exit回车,如下图。
file

之后系统会自动重启系统,不过这里需要稍微等待一会才能重启成功。

作业

  1. 下面哪个文件是存储用户加密后密码信息的?
    a. /etc/passwd
    b. /etc/shadow
    c. /etc/users
    d. /etc/secure

  2. 下面哪个文件是存储用户账户信息的?
    a. /etc/passwd
    b. /etc/shadow
    c. /etc/users
    d. /etc/secure

  3. 下面哪个配置文件,可以指定创建用户时的默认家目录?
    a. /etc/login.defaults
    b. /etc/login.defs
    c. /etc/default/useradd
    d. /etc/default/login.defs

  4. 设置用户tom密码最大使用天数为40天,请问在该使用哪个命令?
    a. chage –M 40 tom
    b. passwdmax 40 tom
    c. chage –m 40 tom
    d. passwd –M 40 tom

  5. 创建用户bob时,默认会为此用户创建一个私人组群bob,现在要求创建bob时不创建bob组,而是直接把bob加入root组,使用哪个选项?
    a. –G
    b. –g
    c. –a
    d. 不可能的

  6. 如果想锁定tom账户,请问用如下哪个命令?
    a. usermod –l tom
    b. usermod –L tom
    c. userloack tom
    d. passwd –L tom

  7. 系统中存在tom用户,如果此时想查看tom的账户信息,可以用的命令是?
    a. getent passwd tom
    b. getent password tom
    c. getent shadow tom
    d. grep tom /etc/passwd

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读