写在前面


作为一个运维工程师来讲,系统下的账号管理是工作中很重要的一个环节,所以了解系统的账号管理还是非常有必要的。

首先,我们要知道对于Linux系统而言,它并不知道你是谁,它仅识别用户的ID号,而用户想要登录Linux系统,必须取得两个ID(uidgid),用户的名称与uid的映射关系就保存在/etc/passwd。用户想要登录Linux系统,需要两种idUIDGID(组id),在登录界面,用户输入登录名后一系统首先会判断passwd文件中是否有该用户,没有就跳出,如果有的话就会取出用户的uidgid等信息,其中最重要的取出用户的shell,判断该shell是否要登录,若可登录再去匹配用户密码,相匹配成功才会登录成功。一个简单登录操作背后有着很繁杂的过程。在用户管理主要有四个配置文件/etc/passwd/etc/shadow/etc/group/etc/gshadow。详细了解这四个文件的配置以及各字段的含义是深入了解Linux账号管理的前提条件。下面笔者写下自己的了解,也许笔者了解的并不完善,可使用 man 5 [config_file]命令查看文档。

/etc/passwd 文件详解

wKiom1m_yPuBVWK0AAAPRpt6CmY665.png

passwd配置文件每行为一个账号记录使用“:”作为分隔符分为七个字段,每个一字段含义分别为【account:password:UID:GID:GECOS:directory:shell

  1. account 账户名称。

  2. 密码,在Linux系统发展初期,密码放在该字段,由于该文件每个用户都可读,出于安全方面的考虑,把加密后的密码存在shadow中。在该使用X作为密码占位符。(可以使用pwunconv/pwconv两个命令在两种密码存储方式之间进行切换,做完实验后恢复到当前状态)。

  3. 用户在系统下的标识符,在Linux系统下用户可分为三种:管理员,系统用户,一般用户.   

    通过uid判断uid=0时为管理员:                                                                                             

    CentOS6和以前版本,uid1-500之间,为系统用户;CentOS7版本中,uid1-1000之间,为系统用户。                                             CentOS6和以前版本,uid大于等于500,为一般用户;CentOS7版本中,uid大于等于1000,为一般用户。

    由于系统根据uid识别用户类型,所以不要轻易改变passwd文件,尤其是管理员用户。

  4. 用户组id,该ID号用户和/etc/group文件相关,对应于组名和gid

  5. 用户的描述信息。

  6. 用户家目录。

  7. 用户使用的shell类型,当用户shell/sbin/nologin时,用户不能登录。

 

/etc/shadow 文件详解

Linux系统早期设计中并没有shadow文件,账号密码存于passwd的第二个字段,因为很多程序运行需要读取passwd文件,每个用户都必须对该文件用有读权限,虽然密码已经经过加密,但仍然被暴力破解。所以把密码通过加密后存于shadow文件中,这样不仅安全,也方便了用户口令的管理。下面看看shadow文件的文件结构。

wKiom1m_yT2yw4bdAAAVmqI3miw145.png

shadow文件与passwd相同,使用“:”进行分割各个字段,shadow文件有9个字段,各字段分别代表【账号名称:口令:最近更改口令的日期:口令不可变更的时间:口令需要重新更改的时间:警告更改口令的时间:口令过期后的宽限时间:账号失效时间:无意义(保留)

1,账号名称。

2,用户的加密口令,用户可以使用authconfig--passalgo=[sha256] -- update命令更改口令加密方式。

3,用户口令最后更改的时间。本时间是从197011日到更改密码的天数,197011日是Linux元年(Linux历史小知识)

4,口令不可更改的时间(以第三字段为基准),如果是0表示口令随时可被更改,若是n,表示在更改口令后n天内不能更改口令。

5,口令需要更改的时间(以第三字段为基准),该字段表示在用户更改口令后n天后需要重新更改口令,否则口令将失效。

6,警告更改口令的时间(以第5字段为基准),这个字段表示在用户需要更改口令的时间之前的n天开始提示警告用户更改口令。

7,口令过期后的宽限时间(以第5字段为基准),在口令过期后,用户在这个时间内可以登录系统,但是必须更改口令才能登录成功。

8,账号失效日期,与第三字段相同,从1970开始计算天数,到期后,账户将失效,该字段优先级大于口令过期日期,到期后,账户不可使用。

9,保留。

 

/etc/group /etc/gshadow 文件简述

在了解完passwdshadow配置文件之后,我想对于理解groupgshadow文件已经是什么难事。这里就简述一下两个文件的文件结构含义。

group配置文件也是每行表示一条记录,以“:”作为分隔符,各个字段的含义为:【group_name:passwd:GID:user_list

gshadow文件各字段含义如下【group_name:passwd:group_adminster:members

这里有两个值得注意的地方:1group的用户列表中默认只保存以该组为附加组的成员;2gshadow文件的members字段必须与groupuser_list一致。

 

 

只有简单的了解了上面的四个配置文件,才能更好的了解Linux系统的账号管理的功能,下面就来讲讲Linux系统的账号管理,我把该功能分为三个部分来讲,分别为用户管理,口令管理和用户组管理。

用户管理


   用户的管理可分为用户的新增,更改,删除。

新增用户

 useradd命令添加少量用户

useradd(adduser)每次只能添加一个用户,用于添加少量用户。在参数未指定时,采取默认方式添加添加用户,默认创建的用户参数信息保存于/etc/default/useradd文件中,下面简单介绍该命令的常用参数。

       -b   #指定用户的base_dir ,也就是家目录的上一级目录

       -u   #指定用户uid

       -o   #不检查uid的唯一性,使用该参数一般都指定已存在的uid,对于系统而言依旧是一个用户,只是登录名不同

       -d   #指定用户家目录

       -s   #指定用户的默认shell类型

       -c  #用户描述信息

       -r   #创建系统账号

       -g  #指定用户的主组或者gid(每个用户必须要有一个主组,在下文会谈到)

       -G   #指定用户的附加组

      

       -D  后面不加参数,输出创建用户的默认参数

       -D   [options]  修改创建用户的默认参数

 

 批量添加用户

在系统中批量添加用户有两种方式:使用newusers命令,脚本批量添加

在使用newusers命令时,后从文件中读取添加信息,批量添加。文件的格式必须与passwd文件的格式完全相同,冒号分隔,冒号为英文半角状态下的符号。

脚本批量依据不同生产环境而言,这里不再详陈。

在默认创建用户参数中有一个/etc/skel的目录文件,在新增用户的家目录下会默认生成该目录下的所有文件,所以管理员可以把一些所有用户需要的文件放置在目录下。

 

用户信息修改

    修改用户信息最常用的命令时usermod,该命令的参数与useradd命令参数含义很多都相同,这里只列出一些常用的与之不同的选项。

   -a   #-G选项配合,增加附加组

    -L   #锁定用户,不允许用户直接登录(可以使用su登录),执行该命令后,shadow文件的密码字段前会增加一个“!”,当然,可以修改shadow文件中的该字段,删除!或者密码实现无密码登录(不安全)

    -U   #解除用户锁定,与-L选项相对

    -d   #修改用户家目录,但不创建用户家目录

    -m   #创建用户家目录,可配合-d实现用户家目录的更改

    -l   #更改用户的登录名

    -e   #指定用户过期时间,时间格式为yyyy-mm-dd

    -f  #指定用户非活动期限

 

除了使用usermod之外还有一些可以修改用户某些信息的命令,比如可以使用chfn或者finger命令来更改用户描述,使用chsh来更改用户的默认shell等。

 

删除用户

       用户的删除很简单,userdel命令。

              

 -f   #强制删除用户,即使用户在登录状态,也能强制的删除

 -r   #删除用户的家目录和邮件目录

      

在使用userdel命令就像使用rm命令一样危险,要考虑该用户是不是有一些文件后期还要用或者正在使用,所以一般使用默认删除,暂时保留家目录。

口令管理


  用户的新增,修改,删除的操作体现在passwd文件的更改,而口令的管理作用的对象就是shadow配置文件。口令的添加也可以逐条添加或者批量添加。

常用命令有passwd命令:

  -l  #锁定用户,与usermod -L 功能类似

  -u  #解锁用户  usermod -U类似

  -e  #强制用户下次登录修改口令

  -n  #指定口令的不可变更时间

  -x  #指定口令的需要更改的时间

  -w  #指定警告用户修改口令的时间

  -i  #指定非活动期限

  --stdin   #从标准输入接收用户口令

  eq:  echo   "linuxpasswd"|passwd --stdin root

 

  除了passwd之外还有一个chage命令与之类似,想深入了解可使用man chage查看。笔者认为在使用同等功能的命令时,只要熟悉掌握其中一种就好,到深入了解之后可以根据具体环境来判断哪个命令实现更符合自己需求。

  除了使用上述两个命令之外,口令还可以批量添加,使用chapasswd 命令,从账号和口令文件读取。该文件有固定格式,每行一个用户,以login_name:passwd格式保存。         

用户组管理


  上面曾提到一个主组和附加组的概念,这里阐述一下

  用户组可分为主要组合附加组两种,对于用户来讲,有且只有一个主要组,也就是说用户必须属于一个主要组也只能属于一个主要组,在用户默认创建过程中会创建一个与用户同名的组,且只包含该用户一个成员,这时这个主要组也称为私有组。对于用户来讲,它可以属于任意多个附加组。属于某个组的成员,自然继承了该组的权限。若属于多个组,对于文件来讲,用户权限是该文件的组权限的累加。

用户组的管理也可分为组的新建,更改和删除和口令管理。常用groupadd,groupmod,groupdel命令管理组。 

groupadd   #添加组

       -g    #指定gid

       -r    #创建系统组    CentOS6    gid<500

                          CentOS7      gid<1000

    groupmod   #修改组信息

       -n    #新名字

       -g    #新的gid

    groupdel   #删除组

       #在删除组的过程中若有用户以该组为主要组会删除失败

     用户组的口令管理使用gpasswd命令

      

gpasswd 

       -a user   #添加某用户到到指定组中

       -d user   #从指定组中删除指定用户

      -A user1,user2..  #添加管理员列表以逗号分隔

 

      除了上述几个组管理命令外groupmems也可对用户组进行管理,这里不再详述,读者可自行查阅相关文档

在用户组的管理中有时需要临时切换主组,这时会使用newgrp命令,如果用户不在该组中则主要密码,该命令只是临时生效,所有也叫当前有效组的切换。不写入配置文件。在切换后做的操作会永久作用于当前有效组。

杂项

       在用户账号管理中有一些经常使用的命令,比如idsu命令       

id 

       -u   #显示uid

       -g   #显示gid

       -G   #所有组的gid

       -n   #显示名称,配合上述三个选项

    su   [-] user

       -    # 完全切换,等同于用户登录

            #不加“-”号,不完全切换,不改变当前工作目录,不读取用户配置文件信息。

    vipw     #  ==vim /etc/passwd

    vigr     #  ==vim /etc/groups

    pwck     # 检查passwd

    grpck    # 检查grpck   这两个命令可以在批量用户是否有格式错误