8.1 基本概念
用户在操作系统中是非常重要的一块,我们登录系统,访问共享文件夹等都需要用户进行验证。所以,掌握管理用户的知识是非常有必要的。
说到用户,我们会提到两个名词账户信息和木马信息。
账户信息:我们可以理解为QQ号码,QQ签名,QQ中填写的个人资料等。
密码信息:就是登录QQ的密码。
用户的账户信息是存储在/etc/passwd中的,在此文件中一行一个用户的信息,用“:”隔开,例如,下图所示的例子。
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用户不存在,则显示无此用户。如果用户存在则显示用户信息,如下图所示。
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 2023-12-23 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 2023-12-23 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 2023-12-19 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 2023-12-19 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
最近一次密码修改时间 :12月 19, 2023
密码过期时间 :从不
密码失效时间 :从不
...输出...
[root@server ~]#
这里也可以看到,tom的密码是在2023-12-19改的。
(2)-d:用于更改最近一次修改密码的日期,如改成2023-12-08。
[root@server ~]# chage -d 2023-12-08 tom
[root@server ~]# chage -l tom
最近一次密码修改时间 :12月 08, 2023
密码过期时间 :从不
密码失效时间 :从不
...输出...
[root@server ~]#
(3)-E:设置此账户什么时候过期,如要设置2025-12-21日过期。
[root@server ~]# chage -E 2025-12-21 tom
[root@server ~]# chage -l tom
...输出...
账户过期时间 :12月 21, 2025
两次改变密码之间相距的最小天数 :0
...输出...
[root@server ~]#
那么,tom用户到了2025-12-21就会被锁定,不能登录系统了。
(4)-E -1:设置为永不过期。
[root@server ~]# chage -E -1 tom
[root@server ~]# chage -l tom
最近一次密码修改时间 :12月 08, 2023
...输出...
账户过期时间 :从不
...输出...
[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
最近一次密码修改时间 :12月 08, 2023
密码过期时间 :1月 07, 2024
密码失效时间 :1月 10, 2024
账户过期时间 :从不
两次改变密码之间相距的最小天数 :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命令实现,如下图所示。
提示:具体操作,读者可以自行练习。
这里需要注意的是,如果想清除某用户的密码,可以使用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,...
如果要通过sudo给某个组里所有的用户授权的用法是:
%组名 主机名Z=(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显示。
步骤2:在键盘上按【e】键,表示编辑,通过上下键把光标调到linux那行,然后按键盘上的【End】键,把光标调整到linux那行的最后,输入“rw rd.break”,如下图。
步骤3:修改之后按【Ctrl+x】组合键启动系统,之后能看到一个提示符,如下图。
然后直接回车,之后进入到界面
现在进入的是一个处于内存中的临时系统,之前挂载到"/"的分区/dev/sda1被挂载到当前这个系统的/sysroot目录中了,且这里是以rw的方式挂载的如图。
步骤4:通过chroot /sysroot命令切换到硬盘所在系统,如下图。
这样我们所处在就不再是内存中的那个临时系统了,而是进入了之前安装在/dev/sda1中的操作系统中了。
步骤6:把root密码修改为redhat111,如下图。
步骤7:在/目录下创建隐藏文件/.autorelabel。
因为重置了密码,所以要重置selinux标签,创建这个文件的目的就是重置selinux标签。关于selinux的内容,在后面有专门章节讲解。
需要注意的是,这里是/.autorelabel,不是/.autorelable,也不是./autorelabel。
步骤8:执行exit 回车,再次执行exit回车,如下图。
之后系统会自动重启系统,不过这里需要稍微等待一会才能重启成功。
作业
-
下面哪个文件是存储用户加密后密码信息的?
a. /etc/passwd
b. /etc/shadow
c. /etc/users
d. /etc/secure -
下面哪个文件是存储用户账户信息的?
a. /etc/passwd
b. /etc/shadow
c. /etc/users
d. /etc/secure -
下面哪个配置文件,可以指定创建用户时的默认家目录?
a. /etc/login.defaults
b. /etc/login.defs
c. /etc/default/useradd
d. /etc/default/login.defs -
设置用户tom密码最大使用天数为40天,请问在该使用哪个命令?
a. chage –M 40 tom
b. passwdmax 40 tom
c. chage –m 40 tom
d. passwd –M 40 tom -
创建用户bob时,默认会为此用户创建一个私人组群bob,现在要求创建bob时不创建bob组,而是直接把bob加入root组,使用哪个选项?
a. –G
b. –g
c. –a
d. 不可能的 -
如果想锁定tom账户,请问用如下哪个命令?
a. usermod –l tom
b. usermod –L tom
c. userloack tom
d. passwd –L tom -
系统中存在tom用户,如果此时想查看tom的账户信息,可以用的命令是?
a. getent passwd tom
b. getent password tom
c. getent shadow tom
d. grep tom /etc/passwd