Linux学习-24-Linux用户和用户组管理介绍

114 篇文章 11 订阅

8 Linux用户和用户组管理详解

  • Linux 是多用户多任务操作系统,多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响,不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
  • 如:某台 Linux 服务器上有若干个用户,在同一时间内,u1用户可能在查看系统日志、管理维护系统;u2 用户可能在修改自己的网页程序;u3用户可能在上传软件到服务器,每个用户互不干扰,有条不紊地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如 u2用户不能执行 u3用户的上传操作。
8.1 Linux用户和用户组
  • 用户和用户组管理:添加用户和用户组、更改密码和设定权限等操作。对于一个管理团队,共同维护一组服务器,不是所有的数据都可以对每位管理员公开,而且如果在运维团队中有某位管理员对 Linux 不熟悉,那么赋予他管理员权限的后果可能是灾难性的。因此,越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范
  • 因此,如果要使用 Linux 系统的资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是一个概念)。通过建立不同属性的用户,一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。 每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。
  • 实现用户账号的管理,要完成的工作主要有如下几个方面:
    • 用户账号的添加、删除与修改。
    • 用户口令的管理。
    • 用户组的管理。
  • 用户组:具有相同特征用户的逻辑集合。将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作。
  • 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
  • Linux用户和组的关系:用户和用户组的对应关系有以下 4 种:
    1. 一对一:一个用户可以存在一个组中,是组中的唯一成员;
    2. 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
    3. 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
    4. 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
  • centos修改主机名:vim /etc/hostname 改主机名:HOSTNAME=zk然后退出重登即可
8.2 Linux UID和GID(用户ID和组ID)
  • 登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。用户名并无实际作用,仅是为了方便用户的记忆而已。

  • 要论证 “Linux系统不认识用户名” 也很简单,在前面章节,我们曾经在网络上下载过 “.tar.gz” 或 “.tar.bz2” 格式的文件,在解压缩之后的文件中,你会发现文件拥有者的属性显示的是一串数字,这很正常,就是因为系统只认识代表你身份的 ID,这串数字就是用户的 ID(UID)号。

  • Linux 系统中,每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID),这与文件有拥有者和拥有群组两种属性相对应

  • 既然 Linux 系统不认识用户名,文件是如何判别它的拥有者名称和群组名称的呢?每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会根据 /etc/passwd 和 /etc/group 文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来。

  • 测试可以在 Linux 系统中,添加一个账户, zk 普通账户,我们先使用 root 账号登陆并 Vim /etc/passwd,在该文件中找到 zk 账户并将其 UID 随意改一个数字,这时当你查看普通账户拥有的文件时,你会发现所有文件的拥有者不再是zk ,而是数字。

#查看系统中是否存在zk这个用户
[root@CncLucZK ~]$ grep zk /etc/passwd
zk:x:1002:1002:commons user:/home/zk:/bin/bash
[root@CncLucZK ~]$ ll -d /home/zk
drwx------ 2 zk zk 4096 Oct 15 23:05 /home/zk
#修改zk账户中的UID(第一个 1002)为 1010
[root@CncLucZK test]# vi /etc/passwd
....
zk:x:1010:1002:commons user:/home/zk:/bin/bash
u-dev1:x:1003:1003:devloper user:/home/u-dev1:/bin/bash
u-dev2:x:1004:1004::/home/u-dev2:/bin/bash
u1-test:x:1005:1006::/home/u1-test:/bin/bash
:wq
[root@CncLucZK test]# grep zk /etc/passwd
zk:x:1010:1002:commons user:/home/zk:/bin/bash
#可以看到,之前的 zk 变为了 1010,因为修改了UID,导致 1002 找不到对应的账号,因此显示数字
[root@CncLucZK test]# ll -d /home/zk
drwx------ 2 1002 zk 4096 Oct 16 10:24 /home/zk
#记得最后将其再手动改正过来
#修改zkt账户中的UID从1010 改为 1002
  • 由于zk 账户的 UID 已经改为 1010,但其 home 目录却记录的是1002,会导致此用户再次登录时无法进入自己的home目录。

注意,此次为了说明 ID 和用户名的对应关系,所以才将 /etc/passwd 文件中用户的 UID 做了更改。此操作很可能会导致某些程序无法进行,因此 /etc/passwd 文件不能随意修改。

用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group,/etc/gshadow等。

8.3 Linux /etc/passwd内容解释
  • Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。打开这个文件,看看到底包含哪些内容
[root@CncLucZK /]# cat /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
...

/etc/passwd 文件中的内容非常规律,每行记录对应一个用户。里面的这些这些默认用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。

  • 每行用户信息都以 “:” 作为分隔符,划分为 7 个字段,每个字段所表示的含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
  • 用户名,就是一串代表用户账号的字符串。Linux 系统是通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

  • 密码:“x” 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中。

在早期的 UNIX 中,这里保存的就是真正的加密密码串,但由于所有程序都能读取此文件,非常容易造成用户数据被窃取。虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。因此,现在 Linux 系统把真正的加密密码串放置在 /etc/shadow 文件中,此文件只有 root 用户可以浏览和操作,这样就最大限度地保证了密码的安全。

需要注意的是,虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。

  • UID,也就是用户 ID。一般情况下每个用户都有唯一的一个 UID,如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等,Linux 系统通过 UID 来识别不同的用户。实际上,UID 就是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份,具体如下表所示。
UID 范围用户身份
0超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
1~499系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。 其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。
500~65535普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 2的32次幂个 UID 了。
  • GID:全称“Group ID”,简称“组ID”,表示用户初始组的组 ID 号,对应着/etc/group文件中的一条记录。。这里需要解释一下初始组和附加组的概念。

初始组,指用户登陆时就拥有这个用户组的相关权限。每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组。比如说,我们手工添加用户 zk,在建立用户 zk的同时,就会建立 zk组作为 zk用户的初始组。

附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。

举例来说,刚刚的 zk用户除属于初始组 zk外,我又把它加入了 users 组,那么 zk 用户同时属于 zk 组和 users 组,其中 zk 是初始组,users 是附加组。

当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。

需要注意的是,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组。

  • 描述性信息:记录着用户的一些个人情况。例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。。

  • 主目录:也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。例如,root 超级管理员账户的主目录为 /root,普通用户的主目录为 /home/yourIDname,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 zk用户的主目录就是 /home/zk/ 目录。

  • Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。我们知道,用户登陆 Linux 系统后,要启动一个进程,通过使用 Linux 命令完成操作任务,但系统只认识类似 0101 的机器语言,这里就需要使用命令解释器。也就是说,Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等。系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/bash。

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

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

[root@CncLucZK /]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

我手工添加了 zk用户,它使用的是 bash 命令解释器,那么这个用户就可以使用普通用户的所有权限。如果我把 zk 用户的 Shell 命令解释器修改为 /sbin/nologin,那么,这个用户就不能登录了,例如:

[root@CncLucZK /]# cat /etc/passwd
zk:x:1:1:zk:/zk:/sbin/nologin

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

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

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

  • 系统中有一类用户称为伪用户(pseudo users),这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示:
伪 用 户 含 义 
bin 拥有可执行的用户命令文件 
sys 拥有系统文件 
adm 拥有帐户文件 
uucp UUCP使用 
lp lp或lpd子系统使用 
nobody NFS使用
除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。
8.4 Linux /etc/shadow(影子文件)内容
  • /etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。/etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的加密后的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文中,这个加密是不可逆的。/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。

  • 我们先打开看看,执行如下命令:

[root@CncLucZK user]# tail -15 /etc/shadow
sshd:!!:19281:0:99999:7:::
chrony:!!:19281:0:99999:7:::
tcpdump:!!:19281:0:99999:7:::
syslog:!!:19281:0:99999:7:::
apache:!!:19281:0:99999:7:::
admin:!!:19281:0:99999:7:::
mysql:!!:19281:0:99999:7:::
www:!!:19281:0:99999:7:::
zk:$6$fZvVQI1TTGM...hwnI6PQ...o0:19281:0:99999:7:::
u-dev1:$6$oMEWHX...PiCrdzqmDs5...ANOpr80lr1:19281:0:99999:7:::
u-dev2:$6$awr1Osgjnp...qLEJIHp5...hX1jmp0tOD./:19281:0:99999:7:::
u1-test:$6$Co7irpRjaE...9Nqg8N...NrXM1:19281:0:99999:7:::
ou1:!!:19281:0:99999:7:::
user01:$6$eFL/r/bBy....8JdjOHZz...WGrBv21:19281:0:99999:7:::
user02:$6$YftLR/Ot$INIIid...../vCKag...1qMEep6.:19281:0:99999:7:::

...
  • /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生
  • 同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
  • 用户名:同 /etc/passwd 文件的登录名相一致的用户账号。

  • 加密密码:这里保存的是真正加密的密码,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、“*” 或 “x” 使密码暂时失效。

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。

  • 最后一次修改时间:此字段表示最后一次修改密码的时间,时间起点对不同的系统可能不一样。可是,为什么 root 用户显示的是 18607呢?这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 18607天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 18607天修改的 root 用户密码。那么,到底 18607代表的是哪一天呢?可以使用如下命令进行换算:可以看到,通过以下命令,即可将其换算为我们习惯的系统日期。
[root@CncLucZK /]# date -d '1970-01-01 18607 days'
Fri Dec 11 00:00:00 CST 2020
  • 最小修改时间间隔:也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,指的是两次修改口令之间所需的最小天数。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。此字段是为了针对某些人频繁更改账户密码而设计的。

  • 密码有效期:经常变更密码是有必要的,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)指的是口令保持有效的最大天数,否则该账户密码进行过期阶段。该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。

  • 密码需要变更前的警告天数:与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户到用户密码正式失效之间的天数。该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。

  • 密码过期后的宽限天数:也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

  • 账号失效时间:同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,期满后,该账号就不再是一个合法的账号,也就不能再用来登录了!该字段通常被使用在具有收费服务的系统中。

  • 保留:这个字段目前没有使用,等待新功能的加入。

  • 忘记密码怎么办:经常有用户会忘记自己的账户密码,该怎么处理呢?

对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用 passwd 命令即可)

如果 root 账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无法密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码。

  • centos 7进入单用户模式的方法:首先进入开机界面,按e进入编辑页面;然后找到相关的行,在行尾添加init=/bin/sh;最后按住Ctrl+x执行就可以进入单用户模式。

1.首先开机进入初始界面
在这里插入图片描述
2.在进入该页面之后要按e进入编辑页面 ,在编辑页面中按↓向下寻找,找到下图标红处,在标红处添加 init=/bin/sh
在这里插入图片描述
3.输入后,按下ctrl+x进入单用户模式,在该模式下位root用户权限,但是不需要密码登录,在此模式下,我们可以用passwd root命令修改root用户密码 ,完成之后我们输入exec /sbin/init 回车后便可退出单用户模式,进入系统设定的模式。
在这里插入图片描述
4.按修改好的root密码进行登陆即可。
在这里插入图片描述

8.5 Linux /etc/group文件
  • 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
  • /ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中。此文件是记录组 ID(GID)和组名相对应的文件。etc/passwd 文件中每行用户信息的第四个字段记录的是用户的初始组 ID对应的组名就要从 /etc/group 文件中查找。
  • 查看/etc/group 文件的内容
[root@CncLucZK ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
...
www:x:1001:
zk:x:1002:u-dev2
u-dev1:x:1003:
u-dev2:x:1004:
u-dev3:x:1005:u-dev2
group1-test:x:1006:
group2-test:x:1007:u1-test
group3-test:x:1008:u1-test
ou1:x:1009:
tgroup:x:1010:u-dev1
tgroup2:x:1011:
  • 可以看到,此文件中每一行各代表一个用户组。创建用户时系统默认生成一个用户组作为用户的初始组。各用户组中,还是以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为:

    组名:密码:GID:该用户组中的用户列表
    
  • 组名:是用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。

  • 组密码和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。不过,用户设置密码是为了验证用户的身份,那用户组设置密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。即这个字段一般为空,或者是。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

  • 组ID (GID):群组的 ID 号,是一个整数。Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

  • 组内用户列表:此字段列出每个群组包含的所有用户,不同用户之间用逗号(,)分隔。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。若:zk组的组信息为 zk:x:612:,可以看到,第四个字段没有写入 zk用户,因为 zk 组是 zk用户的初始组。如果要查询这些用户的初始组,则需要先到 /etc/passwd 文件中查看 GID(第四个字段),然后到 /etc/group 文件中比对组名。每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 zk也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 zk,即 root:x:0:zk就可以了。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。

/etc/passwd、/etc/shadow、/etc/group,它们之间的关系,先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow 文件中提取和这个用户相匹配的密码。

8.6 Linux /etc/gshadow文件
  • /etc/passwd 文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件 /etc/shadow 中。本节要将的 /etc/gshadow 文件也是如此,组用户信息存储在 /etc/group 文件中,而将组用户的密码信息存储在 /etc/gshadow 文件中。

  • 先查看一下此文件中的内容

[root@CncLucZK ~]# tail -15 /etc/gshadow
root:::
bin:::
daemon:::
...
syslog:!::
apache:!::
admin:!::
mysql:!::
www:!::
zk:!::u-dev2
u-dev1:!::
u-dev2:!::
u-dev3:$6$...gKd9qXiaSB6MPXaWaG0:zk:u-dev2
group1-test:!::
group2-test:!::u1-test
group3-test:!::u1-test
ou1:!::
tgroup:!::u-dev1
tgroup2:!::

  • 文件中,每行代表一个组用户的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下:
组名:加密密码:组管理员:组附加用户列表
  • 组名:同 /etc/group 文件中的组名相对应。
  • 组密码:对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。
  • 组管理员:从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。不过,由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用了。
  • 组中的附加用户:该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。
8.7 Linux初始组和附加组
  • /etc/passwd 文件中每个用户信息分为 7 个字段,其中第 4 字段(GID)指的就是每个用户所属的初始组,也就是说,当用户一登陆系统,立刻就会拥有这个群组的相关权限。
  • 当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的初始组,而其他组称为附加组。
  • 如:我们新建一个用户zk,并将其加入 users 群组中,执行命令如下:

useradd 和 groupadd 分别是添加用户和群组的命令

[root@CncLucZK ~]# useradd zk							#添加新用户	
[root@CncLucZK ~]# grep 'users' /etc/group		#查看有没有这个users组,发现系统初始建立了users用户组,但是没有附加用户
users:x:100:				
[root@CncLucZK ~]# groupadd users						#若/etc/group文件中没有users用户组则添加新群组
[root@CncLucZK ~]# usermod -G users zk					#将用户zk加入 users群组
[root@CncLucZK ~]# grep 'zk' /etc/passwd
zk:x:1002:1002::/home/zk:/bin/bash
[root@CncLucZK ~]# grep 'zk' /etc/group
users:x:100:zk
zk:x:1002:
[root@CncLucZK ~]# grep 'zk' /etc/shadow
zk:!!:19279:0:99999:7:::
[root@CncLucZK ~]# grep 'zk' /etc/passwd /etc/group /etc/shadow /etc/gshadow
/etc/passwd:zk:x:1002:1002::/home/zk:/bin/bash
/etc/group:users:x:100:zk
/etc/group:zk:x:1002:
/etc/shadow:zk:!!:19279:0:99999:7:::
/etc/gshadow:users:::zk
/etc/gshadow:zk:!::
  • 可以看到,在 etc/passwd 文件中,zk用户所属的 GID(群组 ID)为 1002,通过搜索 /etc/group 文件得知,对应此 GID 的是 zk群组,也就是说,zk群组是 zk用户的初始组。zk 群组是添加 zk用户时默认创建的群组,在 root 管理员使用 useradd 命令创建新用户时,若未明确指定该命令所属的初始组,useradd 命令会默认创建一个同用户名相同的群组,作为该用户的初始组。正因为 zk群组是 zk用户的初始组,该用户一登陆就会自动获取相应权限,因此不需要在 /etc/group 的第 4 个字段额外标注。但是,附加组就不一样了,从例子中可以看到,我们将 zk用户加入 users 群组中,由于 users 这个群组并不是 zk 的初始组,因此必须要在 /etc/group 这个文件中找到 users 那一行,将 zk 这个用户加入第 4 段中(群组包含的所有用户),这样 zk用户才算是真正加入到 users 这个群组中。在这个例子中,因为 zk用户同时属于 zk和users 两个群组,所在,在读取\写入\运行文件时,只要是 user 和 zk 群组拥有的功能,zk 用户都拥有。

  • 一个用户可以所属多个附加组,但只能有一个初始组。那么,如何知道某用户所属哪些群组呢?使用 groups 命令即可。

  • 例如,我们现在以 zk用户的身份登录系统,通过执行如下命令即可知晓当前用户所属的全部群组:

[root@CncLucZK /]# su  - zk 
[zk@CncLucZK ~]$ groups
zk users
[zk@CncLucZK ~]$ exit
logout
[root@CncLucZK /]# 
  • 通过以上输出信息可以得知,zk用户同时属于 zk 群组和 users 群组,而且,第一个出现的为用户的初始组,后面的都是附加组,所以 zk 用户的初始组为 zk群组,附加组为 users 群组。
8.8 Linux /etc/login.defs:创建用户的默认设置文件
  • /etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度.需要注意的是,该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。

  • cat查看该文件中的内容,表 1 中对文件中的各个选项做出了具体的解释。

设置项含义
MAIL_DIR /var/spool/mail创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 zk用户的邮箱是 /var/spool/mail/zk。
PASS_MAX_DAYS 99999密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000指定用户最大的 UID 为 60000。
GID_MIN 500指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000用户 GID 最大为 60000。
CREATE_HOME yes指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077用户主目录的权限默认设置为 077。
USERGROUPS_ENAB yes指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

参考文献:
Linux 用户和用户组管理
Linux用户和用户组

下一篇:Linux学习-25-useradd命令:添加新的系统用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值