Linux【5】-用户管理1-用户配置文件

添加、修改和删除用户和用户组可以通过多种方式来完成。

  • 其一,可以通过 用户添加、修改、删除等实用命令来完成;
  • 其二,还能直接修改与用户和用户组 相关的配置文件来达到目的。第一种方法比较直观但是效率较低,第二种方法要 求对用户和用户组有较深入的了解但也相对效率较高,尤其是在批量添加配置用 户的时候。

不论用命令还是其他第三方程序对用户和用户组进行添加、修改、删 除最终结果还是体现在系统用户配置文件 /etc/passwd 和其对应影 子文件 /etc/shadow 以及用户组配置文件 /etc/group 和其对应影 子文件/etc/gshadow 的改变上。

配置文件:

  • 修改用户(组)
  • 添加用户(组)
  • 删除用户(组)

1.用户相关配置文件

A)/etc/passwd 文件是什么

/etc/passwd 是系统识别用户的一个文件,做个不恰当的比喻, /etc/passwd 是一个花名册,系统所有的用户都在这里有登录记载;

当我们以intern01 这个账号登录时,系统首先会查阅 /etc/passwd 文件,看是否有 intern01 这个账号,然后确定 intern01 的 UID,通过 UID 来确认用户和身 份,如果存在则读取/etc/shadow 影子文件中所对应的 intern01 的密码;如果 密码核实无误则登录系统,读取用户的配置文件;

在/etc/passwd 中,每一行都表示的是一个用户的信息;一行有 7 个字 段;每个字段用:号分割,比如下面是我的系统中的/etc/passwd 的两行;

#用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
intern01:x:500:500:张三:/home/intern01:/bin/bash
intern02:x:501:502::/home/intern02:/bin/bash
  • 第一字段:用户名,在上面的例子中,我们看到这两个用户的用户名分别是 intern01 和 intern02;用户名,就是一串代表用户身份的字符串。前面讲过,用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。
  • 第二字段:密码;在例子中我们看到的是一个 x,其实密码已被映射到/etc/shadow 文件中;
  • 第三字段:UID ;请参看本文的 UID 的解说;
  • 第四字段:GID;请参看本文的 GID 的解说;
  • 第五字段:用户名全称,这是可选的,可以不设置,在 intern01 这个用户中,用户的全称是张三 ;而 intern02 这个用户没有全称;
  • 第六字段:用户的家目录所在位置;也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。intern01 这个用户是/home/intern01 ,而 intern02 这个用户是/home/ intern02 ;
  • 第七字段:用户所用 SHELL 的类型,intern01 和 intern02 都用的是bash ;所以为/bin/bash 。
默认的Shell

Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。

我们知道,用户登陆 Linux 系统后,通过使用 Linux 命令完成操作任务,但系统只认识类似 0101 的机器语言,这里就需要使用命令解释器。也就是说,Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。

通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等。

在 /etc/passwd 文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash 命令解释器,就代表这个用户拥有权限范围内的所有权限。例如:

[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash

我手工添加了 lamp 用户,它使用的是 bash 命令解释器,那么这个用户就可以使用普通用户的所有权限。

如果我把 lamp 用户的 Shell 命令解释器修改为 /sbin/nologin,那么,这个用户就不能登录了,例如: [root@localhost ~]# vi /etc/passwd lamp:x:502:502::/home/lamp:/sbin/nologin

因为 /sbin/nologin 就是禁止登录的 Shell。同样,如果我在这里放入的系统命令,如 /usr/bin/passwd,例如:

[root@localhost ~]#vi /etc/passwd
lamp:x:502:502::/home/lamp:/usr/bin/passwd

那么这个用户可以登录,但登录之后就只能修改自己的密码。但是,这里不能随便写入和登陆没有关系的命令(如 ls),系统不会识别这些命令,同时也就意味着这个用户不能登录。

B)/etc/shadow 文件

/etc/shadow 文件是/etc/passwd 的影子文件,这个文件并不由 /etc/passwd 而产生的,这两个文件是应该是对应互补的;shadow 内容包括 用户及被加密的密码以及其它/etc/passwd 不能包括的信息,比如用户的有效 期限等;这个文件只有 root 权限可以读取和操作,权限如下:

-r-------- 1 root root 1.5K 10 月 16 09:49 /etc/shadow

/etc/shadow 的权限不能随便改为其它用户可读,这样做是危险的。如果 你发现这个文件的权限变成了其它用户组或用户可读了,要进行检查,以防系 统安全问题的发生;如果我们以普通用户查看这个文件时,应该什么也查看不 到,提示是权限不够:

[intern01@localhost ~]$ more /etc/shadow
/etc/shadow: 权限不够

/etc/shadow 文件的内容包括 9 个段位,每个段位之间用:号分割;我们以 如下的例子说明。

intern01:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:16662:0:99999:7:::
intern02:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:16662:0:99999:7::16668:
  • 第一字段:用户名(也被称之为登录名),在例子中有两条记录,也表示有两个用户 intern01 和 intern02
  • 第二字段:被加密的密码,如果有的用户在此字段中是 x,表示这个用户不能登录系统,也可以看作是虚拟用户,不过虚拟用户和真实用户都是相对 的,系统管理员随时可以对任何用户操作;
  • 第三字段:表示上次更改口令的天数(距 1970 年 01 月 01 日),上面的例子能说明 intern01 和 intern02 这两个用户,是在同一天更改了用户密 码,当然是通过 passwd 命令来更改的,更改密码的时间距 1970 年 01 月 01 日的天数为 13072;
  • 第四字段:禁用两次口令修改之间最小天数的功能,设置为 0
  • 第五字段:两次修改口令间隔最多的天数,在例子中都是 99999 天;这个值如果在添加用户时没有指定的话,是通过/etc/login.defs 来获取默认 值,PASS_MAX_DAYS 99999;你可以查看/etc/login.defs 来查看,具体的值;
  • 第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由 /etc/login.defs 文件定义中获取,在 PASS_WARN_AGE 中定义;在例子中的值是 7 ,表示在用户口令将过期的前 7 天警告用户更改期口令;
  • 第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也 不会提示用户过期,是完全禁用;在例子中,此字段两个用户的都是空的,表示禁用这个功能;
  • 第八字段:用户过期日期;此字段指定了用户作废的天数(从 1970 年的 1月 1 日开始的天数),如果这个字段的值为空,帐号永久可用;在例子中,我们看到 intern01 这个用户在此字段是空的,表示此用户永久可用;而 intern02 这个用户表示在距 1970 年 01 月 01 日后 16668 天后过期,算起来也就是 2010 年 11 月 21 号过期
  • 第九字段:保留字段,目前为空,以备将来 Linux 发展之用;

2. 用户组相关配置文件

A)/etc/group 文件

/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显 示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多 个不同的用户组;同一用户组的用户之间具有相似的特征。比如我们把某一用 户加入到 root 用户组,那么这个用户就可以浏览 root 用户家目录的文件,如果 root 用户把某个文件的组读写执行权限开放,root 用户组的所有用户都可以修 改此文件,如果是可执行的文件(比如脚本),root 用户组的用户也是可以执 行的; 用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也 是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有 独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外 root 用户 组一般不要轻易把普通用户加入进去。

/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组 所包含的用户(User),每个用户组一条记录;格式如下:

group_name:passwd:GID:user_list

在/etc/group 中的每条记录分四个字段:

  • 第一字段:用户组名称;
  • 第二字段:用户组密码;
  • 第三字段:GID
  • 第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为 GID 的用户名;

我们举个例子:

root:x:0:root,intern02
#用户组 root,x 是密码段,表示没有设置密码,GID 是 0,root 用户组下包括 root、intern02
以及 GID 为 0 的其它用户(可以通过/etc/passwd 查看)
intern01:x:500:intern02
#用户组 intern01,x 是密码段,表示没有设置密码,GID 是 500,intern01 用户组下包括
intern02 用户及 GID 为 500 的用户(可以通过/etc/passwd 查看)
intern02:x:502:intern02
#用户组 intern02,x 是密码段,表示没有设置密码,GID 是 502,intern02 用户组下包用户
intern02 及 GID 为 502 的用户(可以通过/etc/passwd 查看)
helloer:x:503:
#用户组 helloer,x 是密码段,表示没有设置密码,GID 是 503,helloer 用户组下包括 GID
为 503 的用户,可以通过/etc/passwd 查看    

而/etc/passwd 对应的相关的记录为:

root:x:0:0:root:/root:/bin/bash
intern01:x:500:500:intern01 sun:/home/intern01:/bin/bash
intern02:x:505:502:intern02 open,intern02 office,13898667715:/home/intern02:/bin/bash
helloer:x:502:503::/home/helloer:/bin/bash

由此可以看出 helloer 用户组包括 helloer 用户;所以我们查看一个用户组 所拥有的用户,可以通过对比/etc/passwd 和/etc/group 来得到。

B)/etc/gshadow 文件

/etc/gshadow 是/etc/group 的加密文件,比如用户组(Group)管理密码 就是存放在这个文件。/etc/gshadow 和/etc/group 是互补的两个文件;对于 大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设 置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户 组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一 些用户组特性,这时就要用到用户组密码。

/etc/gshadow 格式如下,每个用户组独占一行,我们举例来说明:

intern01:!::intern02
intern02:oUS/q7NH75RhQ::intern02
  • 第一字段:用户组名
  • 第二字段:用户组的密码,intern01 用户组无密码;intern02 用户组有已经,已经加密;
  • 第三字段:用户组管理者,两者都为空;
  • 第四字段:intern01 用户组所拥有的成员是 intern02 ,然后还要对照一下 /etc/group 和/etc/passwd 查看是否还有其它用户,一般默认添加的用 户,有时同时也会创建用户组和用户名同名称; intern02 用户组有成员 intern02。
药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn