l25.Linux用户管理知识与应用实践(一)

1,024 阅读10分钟

“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”

14.1 用户及用户组配置文件介绍

在Linux系统中创建、增加、以及删除用户和用户组,实际上都是修改系统中对应的文件,因此有必要熟悉一下与用户和用户组相关的重要文件知识。

在Linux系统中,与用户和用户组直接相关的文件主要有/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow这四个文件,下面分别详细阐述。

14.1.1 Linux系统用户相关的配置文件

在Linux系统中,与用户相关的配置文件主要包含如下两个:

/etc/passwd     #存储用户信息的文件。
/etc/shadow     #存储用户密码信息的文件。

14.1.1.1 存储用户信息的文件/etc/passwd

/etc/passwd文件是Linux中的重要系统文件之一,主要作用是存储系统用户的信息,文件中的每一行表示一个用户信息,有多少行就表示存在多少个用户信息,仔细观察其中的一行,可以清晰地看出,各内容之间通过“:”号划分成了多个字段,共7部分,这7部分分别定义了用户的不同属性,/etc/passwd文件的实际内容具体如下:

[root@centos7 ~]# head -5 /etc/passwd   #通过head命令查看/etc/passwd的前5行。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

提示: passwd文件中有很多虚拟用户,如bin、daemon等,一般来说,这些用户都是系统正常运行所需要的,在不确定的情况下,请不要随意删改此类用户。

在passwd文件中,第一行的内容就是超级用户root所在的行,我们可以看到它的UID和GID都为0,为了让读者能够清晰地了解passwd文件中内容的含义,笔者特意列举了表14-1和表14-2,供读者学习参考。

表14-1 以passwd文件中root一行为例介绍各个字段的作用

b14-1.png

表14-2 对passwd文件中每一行各个字段的详细说明

b14-2.png

下面来看一下/etc/passwd文件的权限:

[root@centos7 ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1332 Oct 17 14:21 /etc/passwd
#所有用户都有读的权限。

因为每个用户登录时都需要取得UID与GID来判断权限,所以/etc/passwd文件的权限为644,但这样一来就会带来安全问题,即所有的用户都可以读/etc/passwd文件。即使文件内的密码是加密的,也还是存在一定的被攻击破解的安全隐患。因此,后来就将密码的信息移动到/etc/shadow文件了。

14.1.1.2 存储用户密码信息的文件/etc/shadow

前面提到了,由于passwd文件必须要被所有的用户读取,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。下面我们来看一下/etc/shadow文件的权限:

[root@centos7 ~]# ll /etc/shadow
----------. 1 root root 1135 Oct 17 14:21 /etc/shadow   #理论上所有用户都没有权限。

可以发现,/etc/shadow的权限属性位都是“-”,即所有用户都不可读(不包含root),其文件内容具体如下:

[root@centos7 ~]# head -5 /etc/shadow   #通过head命令查看/etc/shadow的前5行。
root:$6$FGicBVmizj9Un9Bi$6Nfy71My.5qc/HcrrXHGhiAKt/vONzDJCT/s8wedHJkj3Fkh84Mzv/WCt.kc7ftGYIys4DNuFKVz8ey5FVF520::0:99999:7:::   #长串特殊字符是设置了密码以后加密的数据信息。
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::

与/etc/passwd文件一样,shadow文件中的每一行内容,也是以冒号(:)作为分隔符的,共包含9个字段,其各个字段的意义如表14-3所示。

表14-3 shadow文件中每一行各个字段的详细说明

b14-3.png

提示:

  • 使用useradd命令添加用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow。
  • 使用passwd或chpasswd为用户设置密码会更改/etc/shadow。

14.1.2 Linux系统用户组相关的配置文件

在Linux系统中,与用户组直接相关的主要配置文件也有两个:

/etc/group      #用户组信息文件。
/etc/gshadow    #用户组密码信息文件。

14.1.2.1 存储用户组信息的文件/etc/group

/etc/group文件是存储用户组相关信息的文件,内容包括用户组名称、用户组GID等属性。/etc/group文件与/etc/passwd文件的权限相同,也是644,示例代码具体如下:

[root@centos7 ~]# ll /etc/group
-rw-r--r--. 1 root root 674 Oct 17 14:21 /etc/group

/etc/group文件的实际内容格式具体如下:

[root@centos7 ~]# head -5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

/etc/group文件中每一行的内容也是使用冒号进行分隔的,表14-4是有关group文件的每一行中各个字段的详细说明。

表14-4 group文件中每一行各个字段的详细说明

b14-4.png

提示: 使用groupadd添加用户组会更改/etc/group、/etc/gshadow。

14.1.2.2 存储用户组密码的文件/etc/gshadow

/etc/gshadow是存储用户组密码信息的文件,比如,用户组管理密码就存放这个文件中。/etc/gshadow和/etc/group是两个互补的文件;早期对于大型服务器,针对很多用户和用户组,定制一些关系结构比较负责的权限模型,可以选择设置用户组密码。比如,如果不想让一些非用户组成员永久拥有用户组的权限和特性,那么可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码了,在实际运维工作中,一般是用不到这个功能的,因此读者了解一下本节内容就行了。

/etc/gshadow文件权限及内容格式如下,每个用户组独占一行;

[root@centos7 ~]# ll /etc/gshadow
----------. 1 root root 530 Oct 17 14:21 /etc/gshadow
[root@centos7 ~]# head -5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::

gshadow文件中每一行的内容都是使用冒号进行分隔的,表14-5是有关gshadow文件的每一行中各个字段的详细说明。

表14-5 gshadow文件中每一行各个字段的详细说明

b14-5.png

提示: 有关用户组的两个配置文件都是非重要知识点,了解即可,不要在其上过多花费时间。

14.2 Linux用户及用户组命令介绍

在Linux系统中,与用户及用户组相关的系统命令有很多,在这里笔者仅对比较常用的命令做详解,并给出重点,读者可以根据建议学习和掌握。

14.2.1 有关用户管理的常见命令汇总

表14-6 中针对用户管理的常见命令进行了汇总,其中,带※的建议读者重点掌握,其余的命令了解即可。

表14-6 Linux系统中与用户管理相关的常用命令集合

b14-6.png

14.2.2 有关用户组管理的常见命令汇总

表14-7针对用户组管理的常见命令进行了汇总,同样,带※的建议读者重点掌握,其余的命令了解即可,一般用不到。

表14-7 Linux系统中与用户组管理相关的常用命令

b14-7.png

下文将为大家逐一讲解Linux系统中的常用用户和用户组管理的命令及知识。

14.3 添加用户命令useradd

14.3.1 useradd命令的工作原理

Linux系统中添加用户的命令有useradd和adduser,这两个命令的功能是一样的。当然除了useradd和adduser命令以外,我们还可以通过修改用户配置文件/etc/passwd和/etc/group等文件的办法来直接添加用户,不过笔者不推荐使用该方法。这里推荐大家统一使用useradd命令添加用户,本节也仅以useradd命令为例讲解添加用户的知识。

14.3.1.1 useradd命令的工作原理

当不带任何参数使用useradd命令添加用户时,首先会读取配置文件/etc/login.defs和/etc/default/useradd中预先定义的规则,并根据设置的规则添加用户,同时还会向/etc/passwd和/etc/group文件内添加新建的用户和用户组记录。当然,/etc/shadow和/etc/gshadow也会同步生成记录,同时系统还会根据/etc/default/useradd及/etc/login.defs文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。

14.3.1.2 与创建用户相关的文件/etc/login.defs

/etc/login.defs文件的作用是预先定义创建用户时需要的一些用户默认配置信息。如创建用户时,是否需要家目录,以及UID和GID的取值起始值及取值范围,用户及密码的有效期限等,完整功能请参见下文配置文件中的注释说明。

[root@centos7 ~]# cat /etc/login.defs 
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR  Maildir
MAIL_DIR    /var/spool/mail     #设定用户对应的mail文件所在路径。
#MAIL_FILE  .mail

# Password aging controls:
#
#   PASS_MAX_DAYS   Maximum number of days a password may be used.
#   PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#   PASS_MIN_LEN    Minimum acceptable password length.
#   PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999   #密码最长可以使用的天数
PASS_MIN_DAYS   0   #更换密码的最小天数
PASS_MIN_LEN    5   #密码的最小长度。
PASS_WARN_AGE   7   #密码失效之前提前多少天开始警告。

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000   #默认最小UID为1000,也就是说添加用户时,UID是从1000开始的。
UID_MAX                 60000   #默认最大UID为60000。
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000   #默认最小GID为1000,也就是说添加用户时,GID是从1000开始的。
GID_MAX                 60000   #默认最大GID为60000。
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local     #删除用户时,删除与用户相关的所有工作,默认关闭。

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes #是否创建用户家目录,默认要求创建;可以用-m参数进行控制。

# The permission mask is initialized to this value. If not specified, 
# the permission mask will be initialized to 022.
UMASK           077 #家目录对应umask默认值。

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes     #删除用户同时删除用户组(如果用户组没有其他成员,则删除)。

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512   #密码加密算法SHA512。

提示: 上述内容是笔者在不影响阅读的情况下,针对源文件的格式进行了一定的调整而整理出来的。

14.3.1.3 与创建用户相关的文件/etc/default/useradd

/etc/default/useradd文件是在使用useradd添加用户时预先加载的默认用户信息配置文件,可以使用"useradd -D参数"修改此文件的配置(实践见后文),当然,也可以直接使用vim编辑器来修改文件里面的内容,下面就来看看它的内容,具体如下:

[root@centos7 ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100   #依赖于/etc/login.defs的USERGROUPS_ENAB参数,如果为no,则此处控制。
HOME=/home  #在/home目录下创建用户的家目录。
INACTIVE=-1 #是否启用用户过期停权,-1表示不启用。
EXPIRE= #用户终止日期,不设置表示不启用。
SHELL=/bin/bash #新用户默认使用的Shell解释器类型。
SKEL=/etc/skel  #配置新用户家目录的默认环境变量文件的存放路径。当我们使用useradd添加用户时,用户家目录下的隐藏环境变量文件,都是从这里配置的/etc/skel目录中复制过去的。
CREATE_MAIL_SPOOL=yes   #创建mail文件。

14.3.1.4 与创建用户相关的目录/etc/skel

/etc/skel目录是用来存放新用户需要的所有基础环境变量文件的目录,当添加新用户时,这个目录下的所有文件都会被自动复制到新添加的用户的家目录下;默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以点号开头的文件),通过修改、添加、删除/etc/skel目录下的环境变量文件,我们可以为新创建的用户提供统一的、标准的、定制化的初始化用户环境。

下面来看下/etc/skel目录下的内容:

[root@centos7 ~]# ll -a /etc/skel/
total 24
drwxr-xr-x.  2 root root   62 Oct  1 16:03 .
drwxr-xr-x. 81 root root 8192 Oct 17 14:21 ..
-rw-r--r--.  1 root root   18 Apr  1  2020 .bash_logout #用户环境变量文件,退出时加载。
-rw-r--r--.  1 root root  193 Apr  1  2020 .bash_profile    #用户环境变量文件,登录时加载。
-rw-r--r--.  1 root root  231 Apr  1  2020 .bashrc  #用户环境变量文件,登录时加载。

了解了/etc/skel目录下的内容,再来看个企业面试案例。

范例14-1: 使用neteagle用户登录到Linux系统后,发现提示符为如下所示的异常情况,请问如何恢复到正常的Linux命令行提示符情况?

-bash-4.2$

解答: 首先模拟故障重现,完整步骤如下。

[root@centos7 ~]# mv /etc/profile.d/env.sh .    #把配置PS1的配置文件env.sh移到当前目录。
[root@centos7 ~]# ls
env.sh
[root@centos7 ~]# logout    #可以按快捷键(Ctrl+d),退出当前环境。
[root@centos7 ~]# su - neteagle     #切换到neteagle用户下。
Last login: Fri Oct 16 14:22:59 CST 2020 from 10.0.0.1 on pts/1
[neteagle@centos7 ~]$ rm -f .bash*  #故障原因就是,用户家目录下的环境变量不存在了。
[neteagle@centos7 ~]$ logout    #可以按快捷键(Ctrl+d),退出当前环境。
[root@centos7 ~]# su - neteagle #重新切换到neteagle用户下。
Last login: Sat Oct 17 19:30:35 CST 2020 on pts/0
-bash-4.2$  #看到了吧,故障重现了,让故障重现也是运维人员的一项重要能力。

下面是故障恢复方案及步骤。

方法1:正解方法。

-bash-4.2$ cp /etc/skel/.bash* ~/   #从/etc/skel中将所有环境变量文件复制回来,注意当前用户。
-bash-4.2$ logout   #可以按快捷键(Ctrl+d),退出当前环境。
[root@centos7 ~]# su - neteagle     #重新切换到neteagle用户下。
Last login: Sat Oct 17 19:37:53 CST 2020 on pts/0
[neteagle@centos7 ~]$   #故障排除了。
[root@centos7 ~]# mv env.sh /etc/profile.d  #实验完成把env.sh文件再移回去。
[root@centos7 ~]# logout    #可以按快捷键(Ctrl+d),退出当前环境。
[root@centos7 ~]# 

方法2:仅适合临时情况。

执行export PS1='[\u@\h \W]$ ',PS1是控制Linux命令提示符的环境变量。

14.3.1.5 有关创建用户的工作原理总结

当不添加任何参数使用useradd添加用户时,默认配置就是读取/etc/default/useradd信息,并根据该文件的信息设定用户。这时,会从/etc/skel中复制用户需要的环境变量文件,同时还会读取/etc/login.defs,并根据该文件设定相关的默认信息。这时一个用户在创建过程中的实现过程,当然了,还可以加上参数选项以改变文件中的默认设定。

14.3.2 useradd命令的常用参数介绍

为了方便读者查看,这里用表格的方式将useradd的常用参数选项展现给大家,如表14-8所示。

表14-8 useradd命令常用参数一览表

b14-8.png

14.3.3 useradd添加用户命令的应用实践

范例14-2: 不加任何参数,添加用户alex。

解答命令及步骤如下所示:

[root@centos7 ~]# useradd alex  #添加用户alex。
[root@centos7 ~]# ll -d /home/alex/ #在/home(在useradd文件中设定的)下,增加了以alex为目录的家目录(在/etc/login.defs中设定的)。
drwx------. 2 alex alex 62 Oct 17 19:51 /home/alex/ #权限是700,/etc/login.defs中设定的。
[root@centos7 ~]# ll -a /home/alex/
total 12
drwx------.  2 alex alex  62 Oct 17 19:51 .
drwxr-xr-x. 10 root root 123 Oct 17 19:51 ..
-rw-r--r--.  1 alex alex  18 Apr  1  2020 .bash_logout  #用户环境变量文件,来自/etc/skel。
-rw-r--r--.  1 alex alex 193 Apr  1  2020 .bash_profile#用户环境变量文件,来自/etc/skel。
-rw-r--r--.  1 alex alex 231 Apr  1  2020 .bashrc   #用户环境变量文件,来自/etc/skel。
[root@centos7 ~]# grep -w alex /etc/passwd  #查看用户生产情况。
alex:x:1008:1010::/home/alex:/bin/bash

需要提醒的是,在添加用户alex的同时,还会添加与用户名相同的用户组alex。

[root@centos7 ~]# tail -1 /etc/group    #查看用户组的生成情况。
alex:x:1010:
[root@centos7 ~]# tail -1 /etc/shadow   #同时还会在shadow里记录用户的信息。
alex:!!:18552:0:99999:7:::
[root@centos7 ~]# tail -1 /etc/gshadow  #同时还会在gshadow里记录用户组的信息。
alex:!::

在这个例子中,我们添加了一个名为alex的系统用户,并且“/home”目录下自动生成了名字为alex的家目录,并且权限是700。在/etc/passwd文件里,从对应alex的用户行还可以看到UID和GID以及登录解释器等设置信息,前面已经介绍过这方面的知识了,因此,对于这么多的默认设置,我们并不感到奇怪。

至此可以得出一个结论,使用useradd添加用户时,涉及的核心文件包括/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow,其他文件还有/etc/login.defs、/etc/default/uaeradd,涉及的目录包括/etc/skel、/home。

范例14-3: userad的-g、-u参数的使用示例。

创建用户zuma,属于指定组root,UID为888,实现步骤具体如下:

[root@centos7 ~]# useradd zuma -u 888 -g root   #创建用户zuma,属于指定组root,UID为888。
[root@centos7 ~]# id zuma   #查看生效信息。
uid=888(zuma) gid=0(root) groups=0(root)

范例14-4: useradd的-M、-s参数的使用示例。

创建一个虚拟用户mysql。禁止其登录,且不创建家目录,实现步骤具体如下:

[root@centos7 ~]# useradd mysql -s /sbin/nologin -M
[root@centos7 ~]# tail -1 /etc/passwd
mysql:x:1009:1011::/home/mysql:/sbin/nologin

说明: 这个例子比较具有代表性,在生产场景部署忘了服务时,经常会用到。

范例14-5: useradd的-e参数的使用示例。

在本例中,我们主要是练习下-e参数的使用,这个参数的作用是设定用户到什么时候过期。在生产场景中,员工离职,或者一些临时有需求的用户,或者对时间有限制的一些用户,可能会需要这个选项,下面示例代码会实现添加用户pig的操作,用户有效期1个月,实现步骤具体如下:

[root@centos7 ~]# date +%F  #查看当前系统日期。
2020-10-17
[root@centos7 ~]# useradd pig -e "2020/11/17"   #设置用户过期时间,一个月后过期。
[root@centos7 ~]# chage -l pig  #查看过期设置结果。
Last password change                    : Oct 17, 2020
Password expires                    : never
Password inactive                   : never
Account expires                     : Nov 17, 2020  #显示2020-11-17过期,Nov是11月。
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

这样当日期过了2020年11月17日之后,再使用pig登录就会出现如下无法登录的提示,或者直接就是无法连接:

Your account has expired; please contact your system administrator

提示:不同的Linux系统及版本用户过期时间可能有1~2天的误差,读者可以自行测试了解。

范例14-6: useradd -c、-u、-G、-s、-d、-m多个参数组合的示例。

描述如下:添加用户neteagletest,并设置其用户注释信息为good training,UID指定为806,分别属于用户组root、neteagle、sa的成员,其Shell解释器类型为/bin/sh,设置家目录为/home/luffy。实际操作步骤及结果具体如下:

[root@centos7 ~]# useradd -c "good training" -u 806 -G root,neteagle,sa -s /bin/sh -d /home/luffy neteagletest
[root@centos7 ~]# tail -1 /etc/passwd   #passwd里增加了neteagletest用户记录。
neteagletest:x:806:1014:good training:/home/luffy:/bin/sh   #各个字段的内容均符合预期。
[root@centos7 ~]# id neteagletest   #查询UID和GID以及所归属的用户组。
uid=806(neteagletest) gid=1014(neteagletest) groups=1014(neteagletest),0(root),1004(sa),1013(neteagle)
[root@centos7 ~]# ll -d /home/luffy/    #家目录。
drwx------. 2 neteagletest neteagletest 62 Oct 17 20:20 /home/luffy

14.3.4 useradd -D参数的特殊用法

useradd加-D参数的作用是改变配置文件/etc/default/useradd文件的默认设置值。

当然,这样的修改操作也可以通过命令编辑器来实现,比如,直接修改/etc/default/useradd文件更新预设值。

为了方便读者阅读查看,下面依然用表格的方式将useradd加-D选项后,命令后面可使用的参数选项展现给大家,如表14-9所示。

表14-9 useradd -D后可接的参数表

b14-9.png

范例14-7: 设置添加用户时的默认解释器类型为/sbin/nologin。

完整的操作步骤具体如下:

[root@centos7 ~]# cat /etc/shells   #查看当前系统支持的Shell解释器种类。
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@centos7 ~]# grep -w SHELL /etc/default/useradd    #查看/etc/default/useradd解释器配置
SHELL=/bin/bash
[root@centos7 ~]# useradd -D -s /sbin/nologin   #修改默认解释器为/sbin/nologin。
[root@centos7 ~]# grep -w SHELL /etc/default/useradd    #查看修改结果。-
SHELL=/sbin/nologin
[root@centos7 ~]# useradd newuser   #此时不加参数添加用户。
[root@centos7 ~]# grep newuser /etc/passwd
newuser:x:1011:1015::/home/newuser:/sbin/nologin    #解释器默认就是/sbin/nologin了。
[root@centos7 ~]# useradd -D -s /bin/bash   #测试完毕后改回默认状态,以防止后面的测试出错。
[root@centos7 ~]# grep -w SHELL /etc/default/useradd 
SHELL=/bin/bash

关于这个-D参数的讲解就到这里。如果还不会使用,那么可直接修改/etc/default/useradd参数配置文件;Linux系统中解决问题的方式是很灵活的,读者可以选择简单、方便、适合自己掌握的方式,但是思路必须要清晰。