本章主要介绍Linux系统中的用户管理。
- 基本概念的理解
- 创建及删除用户
- 修改用户属性
- 修改密码策略
- 通过sudo对用户进行授权
基本概念
用户在操作系统中是非常重要的,我们登录系统、访问共享文件夹等都需要用户进行验 证。所以,掌握管理用户的知识是非常有必要的。
说到用户,我们会提到两个名词:账户信息和密码信息。
- 账户信息:以QQ为例,可以理解为QQ号码、QQ签名、QQ中填写的个人资料等。
- 密码信息:以QQ为例,就是登录QQ的密码。
用户的账户信息是存储在/etc/passwd中的,在此文件中一行一个用户信息,各字段 用“:”隔开,如下图所示。
用户账户信息结构
- 用户名。
- 原来此处用于存储用户的密码,因为安全性问题,这里统一用x作为占位符。
- 用户的uid,每个用户都会有一个 user id,简称为uid。root的uid为0。
- 用户的gid,每个组也都会有一个 group id,简称为 gid。
- 用户的描述信息。
- 用户的家目录。
- 用户的shell。
上面的命令也可以通过“getent passwd 用户名”来获取,如下所示。
[root@rhel03 ~]# getent passwd blab
blab:x:1003:1003::/home/blab:/bin/bash
用户的密码信息存储在/etc/shadow中,如下所示。
[root@rhel03 ~]# grep blab /etc/shadow
blab:$6$y3Dvw9W.E6gv3LRP$QW0g9ELlIj23W00KqCgOYlqX40iX4iRulHEXDB0omFZHbSG7tjYaL3ODCoiqw7OcfAn4A4WN/ogDKz0FL9.qr0:19692:0:99999:7:::
上面第一个和第二个冒号之间的斜体字就是被加密后的密码。上面的信息也可以通 过"“getent shadow用户名”来获取,如下所示。
[root@rhel03 ~]# getent shadow blab
blab:$6$y3Dvw9W.E6gv3LRP$QW0g9ELlIj23W00KqCgOYlqX40iX4iRulHEXDB0omFZHbSG7tjYaL3ODCoiqw7OcfAn4A4WN/ogDKz0FL9.qr0:19692:0:99999:7:::
判断一个用户是否存在,可以使用“id 用户名”命令,如下所示。
[root@rhel03 ~]# id tab
id: “tab”:无此用户
这里tom用户不存在,则显示无此用户。如果用户存在,则显示用户信息,如下所示。
[root@rhel03 ~]# id blab
uid=1003(blab) gid=1003(blab) 组=1003(blab)
- 显示用户的uid信息。
- 显示用户的gid信息。
- 显示用户的gid信息。
如果id后面没有跟用户,则显示当前用户自己的信息。
[root@rhel03 ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
管理用户
管理用户包括创建用户和修改用户属性。
1、创建用户
利用useradd命令可以创建用户,useradd中常见的选项包括8种。
- -d:指定用户的家目录,默认为/home/用户名。
- -m:创建家目录,这是默认选项,一般不用指定。
- -M:不为用户创建家目录,即创建好用户之后没有“/home/用户名”。
- -s:指定用户的shell,默认为/bin/bash。
- -c:用来指定备注信息,不指定则为空。
- -u:指定用户的uid。
- -g:默认情况下,创建用户时会创建一个同名组。例如,创建tom用户,则会创建一 个tom组,然后把 tom用户加人 tom组中。如果指定了-g root,则创建用户时直接把tom 加入root组,就不会再创建tom组,此时 tom只属于一个组。
- -G:指定附属组,即把用户加人一个额外的组,此时 tom属于两个组。 如果同时指定-g和-G选项,如-g root-G users,这里的意思是不再为tom创建命名组,直接 加入root组,同时再额外地加入users组,此时tom 就属于两个组,即root和users组。
下面创建tom用户,如下所示。
[root@rhel03 ~]# useradd -d /tom -s /sbin/nologin \
> -c "Im tom" -u 2000 -g root -G users tom
这里创建一个tom用户,因为命令太长,所以最后加一个反斜线后按【Enter】键,这里 虽然换行了,但是系统会认为仍然是一行的。
记住,反斜线后面不能有空格,按【Enter】键之后前面会自动出现一个提示符“>”, 这个“>”不是我们输入的。
现在查看tom用户的属性,如下所示。
[root@rhel03 ~]# grep tom /etc/passwd
tom:x:2000:0:Im tom:/tom:/sbin/nologin
可以看到,这里tom用户的属性完全是按照我们的要求创建出来的。
查看密码信息,如下所示。
[root@rhel03 ~]# grep tom /etc/shadow
tom:!!:19692:0:99999:7:::
因为我们在创建用户时,并没有指定用户的密码,所以这里密码为空。当我们创建用户时, 没有给这个用户设置密码,则这个用户是处于被锁定状态,即不能登录,如下所示。
[root@rhel03 ~]# passwd -S tom
tom LK 2023-12-01 0 99999 7 -1 (密码已被锁定。)
现在为 tom用户设置密码,可以使用如下命令。
[root@rhel03 ~]# passwd tom
更改用户 tom 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它基于一个字典中的词
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
或者使用如下命令,这里把密码设置为cisco@123。
[root@rhel03 ~]# echo cisco@123 | passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
再次查看用户的状态,如下所示。
[root@rhel03 ~]# passwd -S tom
tom PS 2023-12-01 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
这里显示了用户已经设置了密码。查看密码信息,如下所示。
[root@rhel03 ~]# grep tom /etc/shadow
tom:$6$FSkfR1D210j2RuzZ$bcoWEyilqCyFxvuqnCncwJctsa20KzN90B61n1FV8Es5Ik5LKLGwK0gDsU558ustx5Mw12ms46../A856a.t4.:19692:0:99999:7:::
这里已经有了密码。
但是现在用户仍然是不能登录的,所以用su命令切换到tom用户。
[root@rhel03 ~]# su - tom
This account is currently not available.
这是因为tom用户的shell被设置为了/sbin/nologin,任何用户的shell 被设置 为/sbin/nologin,则此用户是不能登录系统的。那么,创建此用户的意义何在?很多时候我 们搭建了服务,如用samba共享了一个目录,希望其他主机来访问此共享目录时不能以匿名 用户访问,必须输入相关的用户名和密码,但又不想让他能登录系统,这种情况下就可以用到了。
2、修改用户属性
如果想修改用户属性,可以使用usermod命令。usermod命令所能用到的选项与 useradd是差不多的,下面讲最常见的5个选项。
- -c:修改注释信息。
- -s:修改shell信息。
- -d:修改家目录。
- -L:锁定用户。
- -U:解锁用户。
把tom的shell改成/bin/bash,并把备注信息改成hello tom,如下所示。
[root@rhel03 ~]# usermod -s /bin/bash -c "hello Tom" tom
[root@rhel03 ~]# grep tom /etc/passwd
tom:x:2000:0:hello Tom:/tom:/bin/bash
(1)锁定用户
[root@rhel03 ~]# usermod -L tom
[root@rhel03 ~]# passwd -S tom
tom LK 2023-12-01 0 99999 7 -1 (密码已被锁定。)
锁定用户,使用root用户是可以用su命令切换过去的,但是使用其他用户是不能用su命 令切换过去的,如下所示。
[root@rhel03 ~]# su - tom
[tom@rhel03 ~]$ exit
注销
[root@rhel03 ~]#
再打开一个终端,这个终端中是以bdqn用户登录的,然后通过su命令切换到tom用户, 如下所示。
[bdqn@rhel03 ~]$ su - tom
密码:
su: 鉴定故障
[bdqn@rhel03 ~]$
可以看到,bdqn用户不能用su命令切换过去,提示为鉴定故障。
(2)解锁用户
如果要解锁用户,可以使用usermod -U命令。下面把 tom用户解锁
[root@rhel03 ~]# usermod -U tom
[root@rhel03 ~]# passwd -S tom
tom PS 2023-12-01 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
在第二个终端中bdqn用户用 su 命令切换到 tom 用户
[bdqn@rhel03 ~]$ su - tom
密码:
[tom@rhel03 ~]$ whoami
tom
[tom@rhel03 ~]$ pwd
/tom
[tom@rhel03 ~]$ exit
注销
[bdqn@rhel03 ~]$
此时其他用户是可以正常切换的。
(3)修改用户的家目录
前面已经看到了, tom用户的家目录设置为/tom,现在想把家目录改成/home/tom,命令如下.
[root@rhel03 ~]# usermod -d /home/tom tom
[root@rhel03 ~]# grep tom /etc/passwd
tom:x:2000:0:hello Tom:/home/tom:/bin/bash
可以看到,tom用户的家目录已经设置为了/home/tom。在第二个终端中测试,输入如下命令。
[bdqn@rhel03 ~]$ su - tom
密码:
su: 警告:无法更改到 /home/tom 目录: 没有那个文件或目录
这里显示无法切换到/home/tom。因为创建用户时用户的家目录是创建在/tom下的,但 是手动修改tom的家目录为/home/tom,这个家目录并没有在/home下创建,所以才会出 现刚才的问题。我们只要把原来的家目录拷贝过去即可,在第一个终端中执行如下命令。
[root@rhel03 ~]# cp -a /tom/ /home/
[root@rhel03 ~]# ls /home/
aa bdqn blab tom
再回到第二个终端中测试,输入如下命令
[bdqn@rhel03 ~]$ su - tom
密码:
[tom@rhel03 ~]$ pwd
/home/tom
[tom@rhel03 ~]$ exit
注销
[bdqn@rhel03 ~]$
可以看到,已经可以切换到家目录了。
(4)管理组
所有组的信息都是放在/etc/group中的,如果要判断一个组是否存在,可以 到/etc/group中查询。例如,现在判断bob组是否存在,命令如下。
[root@rhel03 ~]# grep bob /etc/group
[root@rhel03 ~]#
没有任何输出,说明bob组不存在。如果想创建一个新的组,则用“groupadd 组名”命 令。例如,现在要创建bob组,命令如下。
[root@rhel03 ~]# groupadd bob
[root@rhel03 ~]# grep bob /etc/group
bob:x:1004:
[root@rhel03 ~]#
如果要删除某个组,则用“groupdel组名”命令。例如,现在要删除bob组,命令如 下。
[root@rhel03 ~]# groupdel bob
[root@rhel03 ~]# grep bob /etc/group
[root@rhel03 ~]#
创建组时,可以通过-g选项来指定gid信息。例如,创建bob组,组id设置为3000,命令如下。
[root@rhel03 ~]# groupadd -g 3000 bob
[root@rhel03 ~]# grep bob /etc/group
bob:x:3000:
再次删除 bob 组。
查看用户属于哪个组的,可以通过“groups用户”来查看。例如,查看tom属于哪个组,命令如下。
[root@rhel03 ~]# groups tom
tom : root users
可以看到,tom属于root和users 组。如果想把用户继续添加到其他组中,可以通 过“gpasswd -a用户组”来添加。例如,现在要把tom 加入bin组,命令如下。
[root@rhel03 ~]# gpasswd -a tom bin
正在将用户“tom”加入到“bin”组中
[root@rhel03 ~]# groups tom
tom : root bin users
[root@rhel03 ~]#
可以看到,tom已经属于bin组了。
要是想把用户从某个组中踢出去,则通过“gpasswd -d用户组”来删除。例如,现在要 把 tom从 bin组中删除,命令如下。
[root@rhel03 ~]# gpasswd -d tom bin
正在将用户“tom”从“bin”组中删除
[root@rhel03 ~]# groups tom
tom : root users
可以看到,tom已经不属于bin组了。
用户的密码策略
很多人是没有修改密码的习惯的,设置了一个密码就一直使用下去,这样会带来一定的安 全隐患。所以,为了提高安全性,需要设置一定的密码策略,使用的命令是chage。
chage常见的选项包括以下几个。
- -l:列出用户的信息。
[root@rhel03 ~]# chage -l tom
最近一次密码修改时间 :12月 01, 2023
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
可以看到,tom的密码是在2023年12月1日修改的。
- -d:用于更改最近一次修改密码的日期,如改成2023年12月2日。
[root@rhel03 ~]# chage -d 2023-12-02 tom
[root@rhel03 ~]# chage -l tom
最近一次密码修改时间 :12月 02, 2023
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
- -E:设置此账户什么时候过期,如要设置2023年12月10日过期。
[root@rhel03 ~]# chage -E 2023-12-10 tom
[root@rhel03 ~]# chage -l tom
最近一次密码修改时间 :12月 02, 2023
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :12月 10, 2023
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
那么,tom用户到了2023年12月10日就会被锁定,不能登录系统了。
- -E -1:设置为永不过期。
[root@rhel03 ~]# chage -E -1 tom
[root@rhel03 ~]# chage -l tom
最近一次密码修改时间 :12月 02, 2023
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
- -E 1:设置为立即过期。
- -M:最大使用天数,过了这个天数还没有修改密码,账户将被锁定。
- -m:最小使用天数,两次修改密码的间隔不得低于这个天数,不能今天改了明天再改回去。
- -W:达到最大使用天数之前,提前几天警告。如同房贷,提前一周短信通知用户银 行卡余额要足够。
- -I:达到最大使用天数之后还没有修改密码,不会立即锁定账户,而是会给几天的缓 冲期,但是在缓冲期内不管何时登录系统,都会强迫你修改密码。如果在缓冲期内也没有修 改密码,则会锁定账户。
[root@rhel03 ~]# chage -m 5 -M 30 -W 6 -I 3 tom
[root@rhel03 ~]# chage -l tom
最近一次密码修改时间 :12月 02, 2023
密码过期时间 :1月 01, 2024
密码失效时间 :1月 04, 2024
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :5
两次改变密码之间相距的最大天数 :30
在密码过期之前警告的天数 :6
这里把最小使用天数设置为5天,最大使用天数设置为30天,警告天数设置为6天,缓冲期设置为3天。
上面关于账户的锁定及密码的过期时间,也可以使用passwd结合来实现,如下所示。
[root@rhel03 ~]# passwd --help
用法: passwd [选项...] <帐号名称>
-k, --keep-tokens 保持身份验证令牌不过期
-d, --delete 删除命名帐户的密码(仅限 root 用户);也删除密码锁(如果有)
-l, --lock 锁定指名帐户的密码(仅限 root 用户)
-u, --unlock 解锁指名帐户的密码(仅限 root 用户)
-e, --expire 终止指名帐户的密码(仅限 root 用户)
-f, --force 强制执行操作
-x, --maximum=DAYS 密码的最长有效时限(只有 root 用户才能进行此操作)
-n, --minimum=DAYS 密码的最短有效时限(只有 root 用户才能进行此操作)
-w, --warning=DAYS 在密码过期前多少天开始提醒用户(只有 root 用户才能进行此操作)
-i, --inactive=DAYS 当密码过期后经过多少天该帐号会被禁用(只有 root 用户才能进行此操作)
-S, --status 报告已命名帐号的密码状态(只有 root 用户才能进行此操作)
--stdin 从标准输入读取令牌(只有 root 用户才能进行此操作)
帮助选项:
-?, --help 显示这个帮助信息
--usage 显示简短的使用说明
具体操作,同学们可以自行练习
这里需要注意的是,如果想清除某用户的密码,可以使用“passwd -d 用户名”命令来 实现,命令如下。
[root@rhel03 ~]# passwd -d tom
清除用户的密码 tom。
passwd: 操作成功
[root@rhel03 ~]# passwd -S tom
tom NP 2023-12-01 5 30 6 3 (密码为空。)
tom 再登录系统时,是不需要密码。
[tom@rhel03 ~]$ su - tom
[tom@rhel03 ~]$ exit
注销
[tom@rhel03 ~]$
删除用户的命令是userdel。
[root@rhel03 ~]# userdel -r tom
[root@rhel03 ~]# ls /home/
aa bdqn blab
[root@rhel03 ~]# id tom
id: “tom”:无此用户
userdel后面加上r选项的意思是除删除此用户外,还把用户的家目录、邮件等全部删除。
用户授权
前面讲了普通用户很多时候权限是不够的,例如,下面的命令。
[bdqn@rhel03 ~]$ mount /dev/cdrom /mnt/
mount: 只有 root 能执行该操作
要执行该操作,需要使用su命令切换到root。但是并不希望其他人知道root密码,那怎么办?我们可以让root用户通过 sudo对普通用户进行授权。
首先查看本机的主机名,命令如下。
[root@rhel03 ~]# hostname
rhel03
到/etc/sudoers.d下随便创建一个文件,建议使用用户名作为文件名(不过文件名可以随 便取),这样比较方便看出来是对哪个用户授权的。假设现在对bdqn用户授权,则创建文 件/etc/sudoers.d/bdqn,文件中的格式如下。
- userX ALL=(userY) 命令1,命令2,命令3,...
假设现在授权bdqn用户在本机能以root身份使用mount命令,编辑内容如下。
[root@rhel03 ~]# vim /etc/sudoers.d/bdqn
bdqn rhel03=(root) /bin/mount
用户要是想执行sudo授权过的命令,则命令前面要加上 sudo。
在另外一个终端中执行mount命令,命令如下。
[bdqn@rhel03 ~]$ sudo mount /dev/cdrom /mnt/
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] bdqn 的密码:
mount: /mnt: WARNING: device write-protected, mounted read-only.
[bdqn@rhel03 ~]$
可以看到,已经可以执行了,这里输入的密码会保留5分钟,5分钟之内再次执行sudo是 不需要密码的,过了5分钟再执行sudo命令则还需要输入密码。可以使用sudo -k命令立即 清除记忆的密码。
下面执行umount命令,命令如下。
[bdqn@rhel03 ~]$ sudo umount /mnt
对不起,用户 bdqn 无权以 root 的身份在 rhel03 上执行 /bin/umount /mnt。
还是不行,为何?因为我们只授权lduan执行 mount命令、并没有授权执行umount 命 令。下面使用root授权 blab 能执行umount命令,修改/etc/sudoers.d/blab的内容如下
[root@rhel03 ~]# cat /etc/sudoers.d/bdqn
bdqn rhel03=(root) /bin/mount,/bin/umount
此时已经对 blab 授权mount和 umount 命令,然后到第二个终端中再次执行如下命令
[bdqn@rhel03 ~]$ sudo umount /mnt
[bdqn@rhel03 ~]$
已经可以正常执行了。
查看bdqn被授权执行哪些命令,可以通过sudo -l来查看,命令如下。
[bdqn@rhel03 ~]$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 bdqn 可以在 rhel03 上运行以下命令:
(root) /bin/mount, /bin/umount
前面介绍了sudo命令需要输人密码,这个密码会保留5分钟,如果想修改此默认时间, 可以通过vim修改letc/sudoers,添加 Defaults timestamp_timeout=N,此处N为一个数 字,单位为分钟。如果想立即清除保存的密码,使用sudo -k即可。
如果想让bdqn执行授权命令时不需要输入密码,则可以加上NOPASSWD,修 改/etc/sudoers.d/bdqn的内容如下。
[root@rhel03 ~]# cat /etc/sudoers.d/bdqn
bdqn rhel03=(root) NOPASSWD: /bin/mount,/bin/umount
在另外一个终端中验证,命令如下。
[bdqn@rhel03 ~]$ sudo -k
[bdqn@rhel03 ~]$ sudo mount /dev/cdrom /mnt/
mount: /mnt: WARNING: device write-protected, mounted read-only.
[bdqn@rhel03 ~]$ sudo -k
[bdqn@rhel03 ~]$ sudo umount /mnt
[bdqn@rhel03 ~]$
此时并没有输人密码,这里特意执行 sudo -k命令的目的就是确保没有缓存密码。 如果想授权所有命令给bdqn,则可以在命令位置上用ALL替代,命令如下。
[root@rhel03 ~]# cat /etc/sudoers.d/bdqn
bdqn rhel03=(root) NOPASSWD: ALL
此时bdqn用户通过sudo -i无密码切换到root用户,命令如下。
[bdqn@rhel03 ~]$ sudo -i
[root@rhel03 ~]# pwd
/root
[root@rhel03 ~]# whoami
root
[root@rhel03 ~]# exit
注销
[bdqn@rhel03 ~]$
在编辑/etc/sudoers.d/bdqn时,为了防止主机名写错,可以在主机名的位置写ALL,命令如下。
[root@rhel03 ~]# cat /etc/sudoers.d/bdqn
bdqn ALL=(root) NOPASSWD: ALL