龙之介大人

linux的账号与群组管理
13.1 Linux 的账号与群组管理员的工作中,相当重要的一环就是『管理账号』!因为整个系统都是你在管理的, 并...
扫描右侧二维码阅读全文
30
2019/08

linux的账号与群组管理

13.1 Linux 的账号与群组

管理员的工作中,相当重要的一环就是『管理账号』!因为整个系统都是你在管理的, 并且所有一般用户的账号申请,都必须要透过你的协助才行!所以你就必须要了解一下如何管理好一个服务器主机的账号啦! 在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一 个使用者的!

13.1.1 使用者标识符: UID 与 GID

虽然我们登入 Linux 主机的时候,输入的是我们的账号,但是其实 Linux 主机并不会直接认识你的 『账号名称』的,他仅认识 ID(ID 就是一组号码啦)。由于计算机仅认识 0 与 1,所以主机对于数字比较有概念的;至于账号只是为了让人们容易记忆而已。 而你的 ID 与账号的对应就在 /etc/passwd 当中。

如果你曾经在网络上下载过 tarball 类型的文件, 那么应该不难发现,在解压缩之后的文件中,文件拥有者的字段竟然显示『不明的数字』?奇怪吧?这没什么好奇怪的,因为 Linux 说实在话,他真的只认识代表你身份的号码而已!

那么到底有几种 ID 呢?还记得我们在第五章内有提到过,每一个文件都具有『拥有人与拥有群组』的属性?每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。

那么文件如何判别他的拥有者与群组呢?其实就是利用 UID 与 GID !每一个文件都会有所谓的 拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来!

我们可以作个小实验,你可以 用 root 的身份 vim /etc/passwd ,然后将你的一般身份的使用者的 ID 随便改一个号码,然后再到 你的一般身份的目录下看看原先该账号拥有的文件,你会发现该文件的拥有人变成了 『数字了』

看看底下的例子:

#1.先察看一下,系统里面有没有一个名为 xiaoqi 的用户?
[root@study xiaoqi]# id xiaoqi
uid=1000(xiaoqi) gid=1000(xiaoqi) 组=1000(xiaoqi),10(wheel)

[root@study xiaoqi]# ll -d /home/xiaoqi/
drwx------. 15 xiaoqi xiaoqi 4096 8月  30 17:15 /home/xiaoqi/
#瞧一瞧,使用者的字段正是 xiaoqi 本身!

#2.修改一下,将刚刚我们的 xiaoqi 的 1000 UID 改为 2000 看看:
[root@study xiaoqi]# vim /etc/passwd
......
xiaoqi:x:1000:1000:xiaoqi:/home/xiaoqi:/bin/bash
[root@study xiaoqi]# ll -d /home/xiaoqi/
drwx------. 15 1000 xiaoqi 4096 8月  30 17:15 /home/xiaoqi/
#怎么变成 1000 了?因为文件只会记录 UID 的数字而已!
#因为我们乱改,所以导致 1000 找不到对应的账号,因此显示数字!

#3.记得将刚刚的 2000 改回来!
[root@study xiaoqi]# vim /etc/passwd  
......
xiaoqi:x:1000:1000:xiaoqi:/home/xiaoqi:/bin/bash

你一定要了解的是,上面的例子仅是在说明 UID 与账号的对应性,在一部正常运作的 Linux 主机环境下,上面的动作不可随便进行,这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的 UID 很可能会导致某些程序无法进行,这将导致系统无法顺利运作的结果, 因为权限的问题啊!所以,了解了之后,请赶快回到 /etc/passwd 里面,将数字改回来!

举例来说,如果上面的测试最后一个步骤没有将 2000 改回原本的 UID,那么当 xiaoqi 下次登入时将没有办法进入自己的家目录! 因为他的 UID 已经改为 2000,但是他的家目录 (/home/xiaoqi) 却记录的是 1000 ,由于权限是 700 ,因此他将无法进入原本的家目录!

13.1.2 使用者账号

Linux 系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先,他必须要在计算机前面利用 tty1~tty6 的终端机提供的 login 接口,并输入账号与密码后才能够登入。如果是透过网络的话,那至少使用者就得要学习 ssh 这个功能了 (服务器篇再来谈)。那么你输入账号密码后,系统帮你处理了什么呢?

  1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
  2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚 刚输入的密码与里头的密码是否相符?
  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段!

    大致上的情况就像这样,所以当你要登入你的 Linux 主机的时候,那个 /etc/passwd 与 /etc/shadow 就必须要让系统读取(这也是很多攻击者会将特殊账号写到 /etc/passwd 里头去的缘故)所以呢, 如果你要备份 Linux 的系统的账号的话,那么这两个文件就一定需要备份才行!

由上面的流程我们也知道,跟使用者账号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow!那这两个文件的内容就非常值得进行研究.

底下我们会简单的介绍这两个文件,详细的说明可以参考 man 5 passwd 及 man 5 shadow!

/etc/passwd 文件结构

这个文件的构造是这样的:每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号, 例如 bin, daemon, adm, nobody 等等,这些账号请不要随意的杀掉他呢!这个文件的内容有点像这样:

[root@study xiaoqi]# head -n 4 /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

我们先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了, 你可以明显的看出来,每一行使用『:』分隔开,共有七个咚咚,分别是:

  1. 账号名称:

就是账号啦!用来提供给对数字不太敏感的人使用来登入系统的!需要用来对应 UID 喔。例如 root 的 UID 对应就是 0 (第三字段);

  1. 密码:

早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来 很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里你会看到一个『 x 』!

  1. UID:

这个就是使用者标识符!通常 Linux 对于 UID 有几个限制需要了解一下:

id 范围该 ID 使用者特性
0 (系统管理员)当 UID 是 0 时,代表这个账号是『系统管理员』! 所以当你要让其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。 这也就是说,一部系统上面的系统管理员不见得只有 root 喔! 不过,很不建议有多个账号的 UID 是 0 啦~容易让系统管理员混乱!
1~999 (系统账号)保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。 默认 1000 以下的数字让给系统作为保留账号只是一个习惯。 由于系统上面启动的网络服务或背景服务希望使用较小的权限去运作,因此不希望 使用 root 的身份去执行这些服务, 所以我们就得要提供这些运作中程序的拥有者 账号才行。这些系统账号通常是不可登入的, 所以才会有我们在第十章提到的 /sbin/nologin 这个特殊的 shell 存在。
1000~60000 (可登入账号)给一般使用者用的。事实上,目前的 linux 核心 (3.10.x 版)已经可以支持到 4294967295 (2^32-1) 这么大的 UID 号码喔!
  • UID 为 0 的时候,就是 root !所以请特别留意一下你的 /etc/passwd 文件!
  1. GID:

这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范组名与 GID 的 对应而已!

  1. 用户信息说明栏:

这个字段基本上并没有什么重要用途,只是用来解释这个账号的意义而已!不过,如果您提供使用 finger 的功能时,这个字段可以提供很多的讯息呢!本章后面的 chfn 指令会来解释这里的说明。

  1. 家目录:

这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑到 /root 目录里!如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他的硬盘去该怎么作? 可以在这个字段进行修改!默认的用户家目录在 /home/yourIDname

  1. Shell:

当用户登入系统后就会取得一个 Shell 来与系统的核心沟通以进行用户 的操作任务。那为何预设 shell 会使用 bash 呢?就是在这个字段指定的!这里比较需要注意的是,有 一个 shell 可以用来替代成让账号无法取得 shell 环境的登入动作!那就是 /sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件账号者的数据.

/etc/shadow 文件结构

我们知道很多程序的运作都与权限有关,而权限与 UID/GID 有关!因此各程序当然需要读取 /etc/passwd 来了解不同账号的权限。 因此 /etc/passwd 的权限需设定为 -rw-r--r-- 这样的情况,虽然早期的密码也有加密过,但却放置到 /etc/passwd 的第二个字段上!这样一来很容易被有心人士所窃取的,加密过的密码也能够透过暴力破解法去 trial and error (试误) 找出来!

因为这样的关系,所以后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头呢!在这里,我们先来了解一下这个文件的构造吧!

[root@study xiaoqi]# head -n 4 /etc/shadow
root:$6$IMbw1vkZUaa9tcgT$2IIAFR4RXN4Fy93tfGae3OrELBJN98EYFhFpubiGtcXUim99egm8OWBqj1Eeqx1Ioz3yubj8prWv05Drwsypz0::0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::

基本上,shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段啊,这九个字段的用途是这样的:

  1. 账号名称:

由于密码也需要与账号对应啊~因此,这个文件的第一栏就是账号,必须要与 /etc/passwd 相同才行!

  1. 密码:

这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密)! 你只会看到有一些特殊符号的字母就是了!需要特别留意的是,虽然这些加密过的密码很难被解出来,但是『很难』不等于『不会』,所以,这个文件的预设权限是『-rw-------』或者是『----------』,亦即只有 root 才可以读写就是了!你得随时 注意,不要不小心更动了这个文件的权限呢!

另外,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。 举例来说, 旧式的 DES, MD5 编码系统产生的密码长度就与目前惯用的SHA 不同,SHA 的密码长度明显的比较长些。由于固定的编码系统产生的密码长度必须一致,因此『当你让这个字段的长度改变后,该密码就 会失效(算不出来)』。 很多软件透过这个功能,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码『暂时失效』了。

  1. 最近更动密码的日期:

这个字段记录了『更动密码那一天』的日期,不过,很奇怪呀!在我的例子中怎么会是 16559 呢? 这个是因为计算 Linux 日期的时间是以 1970 年 1 月 1日作为 1 而累加的日期,1971 年 1 月 1 日则 为 366 啦! 得注意一下这个资料!上述的 16559 指的就是 2015-05-04 那一天.而想要了 解该日期可以使用本章后面 chage 指令的帮忙!至于想要知道某个日期的累积日数, 可使用如下的程序计 算:

[root@study ~]# echo $(($(date --date="2015/05/04" +%s)/86400+1))
16559

上述指令中,2015/05/04 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01 以来的累积总 秒数。由于 bash 仅支持整数,因此最终需要加上 1 补齐 1970/01/01 当天。

  1. 密码不可被更动的天数:(与第 3 字段相比)

第四个字段记录了:这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是 0 的话,表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码!

  1. 密码需要重新变更的天数:(与第 3 字段相比)

经常变更密码是个好习惯!为了强制要求用户变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个账号的密码将会 『变为过期特性』。而如果像上面的 99999 (计算为 273 年) 的话,那就表示,密码的变更没有强 制性之意。

  1. 密码需要变更期限前的警告天数:(与第 5 字段相比)

当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出『警告』言论给这个账号,提醒他『再过 n 天你的密码就要过期了,请尽快重新设定你的密码呦!』,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。

  1. 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比)

密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行其他工作的,包括登入系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用喔,这就是密码过期特性。

那这个字段的功能是什么呢?是在密码过期几天后,如果使用者还是没有登入更改密码,那么这个账号的密码将会『失效』,亦即该账号再也无法使用该密码登入了。要注意密码过期与密码失效并不相同。

  1. 账号失效日期:

这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用。就是所谓的『账号失效』,此时不论你的密码是否有过期,这个『账号』都不能再被使用! 这个字段会被使用通常应该是在『收费服务』的系统中,你可以规定一个日期让该账号 不能再使用啦!

  1. 保留:

最后一个字段是保留的,看以后有没有新功能加入。

  • 举个例子来说好了,假如我的 xiaoqi 这个用户的密码栏如下所示:
xiaoqi:$6$OAa1tCtg4vIxGeSN$ye21jxpW/qxPCeaTCmSC84tHWFsrH95awS7LrfATKmb9l4dE7vNfoGRkjzcoAiCg1Qkm7hvuFMbiu7G2lPAVN/:18138:5:60:7:5:18228:

这表示什么呢?先要注意的是 18138 是 2019/08/30 。所以 xiaoqi 这个用户的密码相关意义是:

  • 由于密码几乎仅能单向运算(由明码计算成为密码,无法由密码反推回明码),因此由上表的数据我们无法得知 xaioqi 的实际密码明文 (第二个字段);
  • 此账号最近一次更动密码的日期是 2019/08/30 (18138);
  • 能够再次修改密码的时间是 5 天以后,也就是 2019/09/04 以前 xiaoqi 不能修改自己的密码;如果用户还是尝试要更动自己的密码,系统就会出现这样的讯息:
You must wait longer to change your password
passwd: Authentication token manipulation error
#画面中告诉我们:你必须要等待更久的时间才能够变更密码
  • 由于密码过期日期定义为 60 天后,亦即累积日数为: 18138+60=18198,经过计算得到此日数代表日期为 2019/10/30。这表示:『使用者必须要在 2019/11/06 (前 5 天不能改) 到 2019/10/30 之间的 60 天限制内去修改自己的密码,若 2019/11/06 之后还是没有变更密码时,该密码就宣告为过期』
  • 警告日期设为 7 天,亦即是密码过期日前的 7 天,在本例中则代表 2019/10/30 ~ 2019/11/06 这七天。 如果用户一直没有更改密码,那么在这 7 天中,只要 xiaoqi 登入系统就会发现如下的讯息:
Warning: your password will expire in 5 days
  • 如果该账号一直到 2019/11/06 都没有更改密码,那么密码就过期了。但是由于有 5 天的宽限天数, 因此 xiaoqi 在 2019/11/11 前都还可以使用旧密码登入主机。不过登入时会出现强制更改密码的情况,画面有点像底下这样:
You are required to change your password immediately (password aged) 
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user dmtsai.
Changing password for xiaoqi
(current) UNIX password:

你必须要输入一次旧密码以及两次新密码后,才能够开始使用系统的各项资源。如果你是在 2019/11/11 以后尝试以 xiaoqi 登入的话,那么就会出现如下的错误讯息且无法登入,因为此时你的密码就失效去啦!

Your account has expired; please contact your system administrator
如果使用者在 2019/11/06 以前变更过密码,那么第 3 个字段的那个 18138 的天数就会跟着改变,因此,所有的限制日期也会跟着相对变动喔!
无论使用者如何动作,到了 18228 (大约是 2019/12/06 左右) 该账号就失效了~

由于 shadow 有这样的重要性,因此可不能随意修改,但在某些情况底下你得要使用各种方法来处理这个文件的!举例来说,常常听到人家说:『我 的密码忘记了』, 或者是『我的密码不晓得被谁改过,跟原先的不一样了』,这个时候怎么办?

  • 一般用户的密码忘记了:这个最容易解决,请系统管理员帮忙,他会重新设定好你的密码而不需要知道你的旧密码!利用 root 的身份使用 passwd 指令来处理即可。
  • root 密码忘记了:这就麻烦了!因为你无法使用 root 的身份登入了嘛! 但我们知道 root 的密码在 /etc/shadow 当中,因此你可以使用各种可行的方法开机进入 Linux 再去修改。 例如重新启动进入单人维 护模式(第十九章)后,系统会主动的给予 root 权限的 bash 接口, 此时再以 passwd 修改密码即可;或以 Live CD 开机后挂载根目录去修改 /etc/shadow,将里面的 root 的密码字段清空, 再重新启动后 root 将 不用密码即可登入!登入后再赶快以 passwd 指令去设定 root 密码即可。

另外,由于 Linux 的新旧版本差异颇大,旧的版本 (CentOS 5.x 以前) 还活在很多服务器内!因此, 如果你想要知道 shadow 是使用哪种加密的机制时, 可以透过底下的方法去查询!

[root@study ~]# authconfig --test | grep hashing 
password hashing algorithm is sha512
#这就是目前的密码加密机制!

13.2 有效与初始群组、groups, newgrp

认识了账号相关的两个文件 /etc/passwd 与 /etc/shadow 之后,你或许还是会觉得奇怪, 那么群组的 配置文件在哪里?还有,在 /etc/passwd 的第四栏不是所谓的 GID 吗?那又是啥?此时就需 要了解 /etc/group 与 /etc/gshadow ~

13.2.1 /etc/group 文件结构

这个文件就是在记录 GID 与组名的对应了~

[root@study xiaoqi]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
  • 这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:
  1. 组名

就是组名啦!同样用来给人类使用的,基本上需要与第三字段的 GID 对应。

  1. 群组密码:

通常不需要设定,这个设定通常是给『群组管理员』使用的,目前很少有这个机会设定群组管理员啦! 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;

  1. GID:

就是群组的 ID 啊。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!

  1. 此群组支持的账号名称:

我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。 举例来说,如果我想要让 xiaoqi 与 study 也加入 root 这个群组,那么在第一行的最后面加上『xiaoqi,study』,注意不要有空格,使成为『 root:x:0:xiaoqi,study 』就可以!

  • 谈完了 /etc/passwd, /etc/shadow, /etc/group 之后,我们可以使用一个简单的图示来了解一下 UID / GID 与密码之间的关系,图示如下。其实重点是 /etc/passwd 啦,其他相关的数据都是根据这个文 件的字段去找寻出来的。下图中,root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知 道 GID 为 0 时的组名就是 root 。至于密码的寻找中,会找到 /etc/shadow 与 /etc/passwd 内同 账号名称的那一行,就是密码相关数据!

至于在 /etc/group 比较重要的特色在于第四栏啦,因为每个使用者都可以拥有多个支持的群组,这就好比在学校念书的时候,我们可以加入多个社团一样!不过这里你或许会觉得奇怪的,那就 是:『假如我同时加入多个群组,那么我在作业的时候,到底是以那个群组为准?』底下我们就来 谈一谈这个『有效群组』的概念。

新版的 Linux 中,初始群组的用户群已经不会加入在第四个字段!例如我们知道 root 这个账号的主 要群组为 root,但是在上面的范例中,你已经不会看到 root这个『用户』的名称在 /etc/group 的 root 那一行的 第四个字段内!

13.2.2 有效群组(effective group)与初始群组(initial group)

还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组 (initial group) 』!也就是说,当用户一登入系统,立刻就拥有这个群组的相关权限的意思。举例来说,我们上面提到 xiaoqi 这个使用者的 /etc/passwd 与 /etc/group 还有 /etc/gshadow 相关的内容如下:

[root@study xiaoqi]# usermod -a -G users xiaoqi        <--先设定好次要群组
[root@study xiaoqi]# grep xiaoqi /etc/passwd /etc/group /etc/gshadow
/etc/passwd:xiaoqi:x:1000:1000:xiaoqi:/home/xiaoqi:/bin/bash
/etc/group:wheel:x:10:xiaoqi    <--次要群组的设定、安装时指定的
/etc/group:users:x:100:xiaoqi    <--次要群组的设定
/etc/group:xiaoqi:x:1000:xiaoqi <--因为是初始群组,所以第四字段会自动填入账号
/etc/gshadow:wheel:::xiaoqi        <--次要群组的设定
/etc/gshadow:users:::xiaoqi        <--次要群组的设定
/etc/gshadow:xiaoqi:!!::xiaoqi

仔细看到上面这个表格,在 /etc/passwd 里面,xiaoqi 这个使用者所属的群组为 GID=1000 ,搜寻 一下 /etc/group 得到 1000 是那个名为 xiaoqi 的群组!这就是 initial group。因为是初始群组,使用者一登入就会主动取得,不需要在 /etc/group 的第四个字段写入该账号的!

但是非 initial group 的其他群组可就不同了。举上面这个例子来说,我将 xiaoqi 加入 users 这个群 组当中,由于 users 这个群组并非是 xiaoqi 的初始群组,因此,我必须要在 /etc/group 这个文件中,找到 users 那一行,并且将 xiaoqi 这个账号加入第四栏, 这样 xiaoqi 才能够加入 users 这个 群组啊。

那么在这个例子当中,因为我的 xaioqi 账号同时支持 xiaoqi, wheel 与 users 这三个群组, 因此, 在读取/写入/执行文件时,针对群组部分,只要是 users, wheel 与 xiaoqi 这三个群组拥有的功能, 我 xiaoqi 这个使用者都能够拥有喔!

不过,这是针对已经存在的文件而言,如果今天我要 建立一个新的文件或者是新的目录,请问一下,新文件的群组是 xiaoqi, wheel 还是 users ?

13.2.3 groups:有效与支持群组的观察

如果我以 xiaoqi 这个使用者的身份登入后,该如何知道我所有支持的群组呢? 很简单啊,直接输入 groups 就可以了!注意喔,是 groups 有加 s 呢!结果像这样:

[xiaoqi@study ~]$ groups 
xiaoqi wheel

在这个输出的讯息中,可知道 xiaoqi 这个用户同时属于 xiaoqi, wheel 这两个群组,而且,第一个输出的群组即为有效群组 (effective group) 了。 也就是说,我的有效群组为 xiaoqi 啦~ 此时,如果我以 touch 去建立一个新档,例如:『 touch test 』,那么这个文件的拥有者为 xiaoqi ,而且群组也是 xiaoqi 的。

[xiaoqi@study ~]$ touch test
[xiaoqi@study ~]$ ls -l test
-rw-r--r--. 1 xiaoqi xiaoqi 0 8月  30 23:21 test

13.2.4 newgrp: 有效群组的切换

那么如何变更有效群组呢?就使用 newgrp 啊!不过使用 newgrp 是有限制的,那就是你想要切换的 群组必须是你已经有支持的群组。举例来说, xiaoqi 可以在 xiaoqi/wheel/users 这三个群组间切换有效群组,但是 xiaoqi 无法切换有效群组成为 sshd 啦!使用的方式如下:

[xiaoqi@study ~]$ newgrp users
[xiaoqi@study ~]$ groups 
users wheel xiaoqi
[xiaoqi@study ~]$ touch test2
[xiaoqi@study ~]$ ll test*
-rw-r--r--. 1 xiaoqi xiaoqi 0 8月  30 23:21 test
-rw-r--r--. 1 xiaoqi users  0 8月  30 23:23 test2
[xiaoqi@study ~]$ exit  #注意!记得离开 newgrp 的环境喔!

此时,xiaoqi 的有效群组就成为 users 了。我们额外的来讨论一下 newgrp 这个指令,这个指令可 以变更目前用户的有效群组, 而且是另外以一个 shell 来提供这个功能的喔,所以,以上面的例子 来说, xiaoqi 这个使用者目前是以另一个 shell 登入的,而且新的 shell 给予 xiaoqi 有效 GID 为 users 就是了。如果以图示来看就是如下所示:

虽然用户的环境设定(例如环境变量等等其他数据)不会有影响,但是使用者的『群组权限』将会重新 被计算。 但是需要注意,由于是新取得一个 shell ,因此如果你想要回到原本的环境中,请输入 exit 回到原本的 shell !

既然如此,也就是说,只要我的用户有支持的群组就是能够切换成为有效群组!好了, 那么如何让 一个账号加入不同的群组就是问题的所在啰。你要加入一个群组有两个方式,一个是透过系统管理员 (root) 利用 usermod 帮你加入,如果 root 太忙了而且你的系统有设定群组管理员,那么你可以透过 群组管理员以 gpasswd 帮你加入他所管理的群组中!

13.2.5 /etc/gshadow

刚刚讲了很多关于『有效群组』的概念,另外,也提到 newgrp 这个指令的用法,但是,如果 /etc/gshadow 这个设定没有搞懂得话,那么 newgrp 是无法动作的呢!

/etc/gshadow 的 内容有点像这样:

[root@study xiaoqi]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::

这个文件内同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与 /etc/group 一模一样啊!是这样没错~不过,要注意的大概就是第二个字段吧~第二个字段是密码栏, 如果密 码栏上面是『!』或空的时,表示该群组不具有群组管理员!至于第四个字段也就是支持的账号名称!

这四个字段的意义为:

  1. 组名
  2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
  3. 群组管理员的账号 (相关信息在 gpasswd 中介绍)
  4. 有加入该群组支持的所属账号 (与 /etc/group 内容相同!)

以系统管理员的角度来说,这个 gshadow 最大的功能就是建立群组管理员啦! 那么什么是群组管理 员呢?由于系统上面的账号可能会很多,但是我们 root 可能平时太忙碌,所以当有使用者想要加入某些群组时, root 或许会没有空管理。此时如果能够建立群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中! 可以免去 root 的忙碌啦!不过,由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了。

13.3 账号管理

13.3.1 添加用户:useradd

要如何在 Linux 的系统新增一个用户啊?我们登入系统时会输入 (1)账号与 (2)密码,所以建立一个可用的账号同样的也需要这两个数据。那账号可以使用 useradd 来新建用户,密码的给予则使用 passwd 这个指令!这两个指令下达方法如下:

[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号; 
-g :后面接的那个组名就是我们上面提到的 initial group 啦~
    该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。 
-G :后面接的组名则是这个账号还可以加入的群组。
    这个选项与参数会修改 /etc/group 内的相关资料喔!
-M :强制!不要建立用户家目录!(系统账号默认值)
-m :强制!要建立用户家目录!(一般账号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~ 
-d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径!
-r :建立一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~
-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,
    亦即账号失效日的设定项目啰;    
-f :后面接 shadow 的第七字段项目,指定密码是否会失效。0 为立刻失效,
    -1 为永远不失效(密码只会过期而强制于登入时重新设定而已。)

#范例一:完全参考默认值建立一个用户,名称为 vbird1
[root@study xiaoqi]# useradd vbird1
[root@study xiaoqi]# ll -d /home/vbird1/
drwx------. 3 vbird1 vbird1 74 9月  14 18:08 /home/vbird1/
#默认会建立用户家目录,且权限为 700 !这是重点!

[root@study xiaoqi]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:18153:0:99999:7:::
/etc/group:vbird1:x:1001:  <---预设会建立一个与账号一模一样的群组名

其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用『 useradd 账号 』来建立 使用者即可。 CentOS 这些默认值主要会帮我们处理几个项目:

  • 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
  • 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与账号名称一模一样的组名;
  • 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在建立使用者账号时, 还需要使用『 passwd 账号 』来给予密码才算是完成了用户建立的流程。如果由于特殊需求而需要 改变使用者相关参数时, 就得要透过上述表格中的选项来进行建立了,参考底下的案例:

#范例二:假设我已知道我的系统当中有个组名为 users ,且 UID 1500 并不存在,
#请用 users 为初始群组,以及 uid 为 1500 来建立一个名为 vbird2 的账号
[root@study xiaoqi]# useradd  -u 1500 -g users vbird2
[root@study xiaoqi]# ll -d /home/vbird2/
drwx------. 3 vbird2 users 74 9月  14 18:11 /home/vbird2/

[root@study xiaoqi]# grep vbird2 /etc/passwd /etc/shadow /etc/group 
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:18153:0:99999:7:::
#UID 与 initial group 确实改变成我们需要的!
在这个范例中,我们建立的是指定一个已经存在的群组作为使用者的初始群组,因为群组已经存 在,所以在 /etc/group 里面就不会主动的建立与账号同名的群组了!

此外,我们也指定了特殊的 UID 来作为使用者的专属 UID !了解了一般账号后,我们来瞧瞧那啥是系统账号 (system account)!

范例三:建立一个系统账号,名称为 vbird3
[root@study xiaoqi]# useradd -r vbird3
[root@study xiaoqi]# ll -d /home/vbird3/                           
ls: 无法访问/home/vbird3/: 没有那个文件或目录  <--不会主动建立家目录
[root@study xiaoqi]# grep vbird3 /etc/passwd /etc/shadow /etc/group 
/etc/passwd:vbird3:x:988:983::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:18153::::::
/etc/group:vbird3:x:983:

我们在谈到 UID 的时候曾经说过一般账号应该是 1000 号以后,那用户自己建立的系统账号则一般 是小于 1000 号以下的。 所以在这里我们加上 -r 这个选项以后,系统就会主动将账号与账号同名 群组的 UID/GID 都指定小于 1000 以下,

此外,由于系统账号主要是用来进行运作系统所需服务的权限设定, 所以系统账号默认都不会主动建立家目录的!

由这几个范例我们也会知道,使用 useradd 建立使用者账号时,其实会更改不少地方,至少我们就知道底下几个文件:

  • 用户账号与密码参数方面的文件:/etc/passwd, /etc/shadow
  • 使用者群组相关方面的文件:/etc/group, /etc/gshadow
  • 用户的家目录:/home/账号名称

为何useradd vbird1会主动在 /home/vbird1 建立起用户的家目录?家目录内有什么数据且来自哪里?为何预设使用的是 /bin/bash 这个 shell ?为何密码字段已经都规范好了 (0:99999:7 那一串)?

useradd 参考档

  • 其实 useradd 的默认值可以使用底下的方法呼叫出来:
[root@study xiaoqi]# useradd  -D
GROUP=100    <--预设的群组
HOME=/home    <--默认的家目录所在目录
INACTIVE=-1 <--密码失效日,在 shadow 内的第 7 栏
EXPIRE=        <--账号失效日,在 shadow 内的第 8 栏
SHELL=/bin/bash        <--预设的 shell
SKEL=/etc/skel        <--用户家目录的内容数据参考目录
CREATE_MAIL_SPOOL=yes <--是否主动帮使用者建立邮件信箱(mailbox)

这个数据其实是由 /etc/default/useradd 呼叫出来的!你可以自行用 vim 去观察该文件的内容。搭配 上头刚刚谈过的范例一的运作结果,上面这些设定项目所造成的行为分别是:

GROUP=100:新建账号的初始群组使用 GID 为 100 者

系统上面 GID 为 100 者即是 users 这个群组,此设定项目指的就是让新设使用者账号的初始群 组为 users 这一个的意思。 但是我们知道 CentOS 上面并不是这样的,在 CentOS 上面预设的 群组为与账号名相同的群组。 举例来说, vbird1 的初始群组为 vbird1 。怎么会这样啊?这是因 为针对群组的角度有两种不同的机制所致, 这两种机制分别是:

  • 私有群组机制:

系统会建立一个与账号一样的群组给使用者作为初始群组。 这种群组的设定机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会设定为 700 (仅有自己可进入自己的家目录) 之故。使用这种机制将不会参考 GROUP=100 这个设定值。代表性的 distributions 有 RHEL, Fedora, CentOS 等

  • 公共群组机制:

    就是以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组, 且默认家目录通常的权限会是『 drwxr-xr-x ... username users ... 』,由于每个账号都属于 users 群组,因此大家都可以互相分享家目录内的数据之故。代表 distributions 如 SuSE 等。

HOME=/home:用户家目录的基准目录(basedir)

用户的家目录通常是与账号同名的目录,这个目录将会摆放在此设定值的目录后。所以 vbird1 的家目录就会在 /home/vbird1/ 了!

INACTIVE=-1:密码过期后是否会失效的设定值

我们在 shadow 文件结构当中谈过,第七个字段的设定值将会影响到密码过期后, 在多久时间内 还可使用旧密码登入。这个项目就是在指定该日数啦!如果是 0 代表密码过期立刻失效, 如果 是 -1 则是代表密码永远不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效。

EXPIRE=:账号失效的日期

就是 shadow 内的第八字段,你可以直接设定账号在哪个日期后就直接失效,而不理会密码的问题。通常不会设定此项目,但如果是付费的会员制系统,或许这个字段可以设定!

SHELL=/bin/bash:默认使用的 shell 程序文件名

系统默认的 shell 就写在这里。假如你的系统为 mail server ,你希望每个账号都只能使用 email 的收发信件功能, 而不许用户登入系统取得 shell ,那么可以将这里设定为 /sbin/nologin ,如此 一来,新建的使用者预设就无法登入! 也免去后续使用 usermod 进行修改的手续!

SKEL=/etc/skel:用户家目录参考基准目录

这个就是指定用户家目录的参考基准目录.举我们的范例一为例, vbird1 家目录 /home/vbird1 内的各项数据,都是由 /etc/skel 所复制过去的~所以呢,未来如果我想要让新增使用者时,该用户的环境变量 ~/.bashrc 就设定妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下, 也可以建立 /etc/skel/www 这个目录,那么未来新增使用者后,在他的家目录下就会有 www 那个目录了!

CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox

你可以使用ll /var/spool/mail/vbird1看一下,会发现有这个文件的存在喔!这就是使用者的邮件信箱!

除了这些基本的账号设定值之外,UID/GID 还有密码参数又是在哪里参考的呢?那就得要看一下 /etc/login.defs 啦! 这个文件的内容有点像底下这样:
MAIL_DIR /var/spool/mail <==用户默认邮件信箱放置目录

PASS_MAX_DAYS 99999 <==/etc/shadow 内的第 5 栏,多久需变更密码日数

PASS_MIN_DAYS 0 <==/etc/shadow 内的第 4 栏,多久不可重新设定密码日数
PASS_MIN_LEN 5 <==密码最短的字符长度,已被 pam 模块取代,失去效用!
PASS_WARN_AGE 7 <==/etc/shadow 内的第 6 栏,过期前会警告的日数

UID_MIN 1000 <==使用者最小的 UID,意即小于 1000 的 UID 为系统保留
UID_MAX 60000 <==使用者能够用的最大 UID
SYS_UID_MIN 201 <==保留给用户自行设定的系统账号最小值 UID
SYS_UID_MAX 999 <==保留给用户自行设定的系统账号最大值 UID
GID_MIN 1000 <==使用者自定义组的最小 GID,小于 1000 为系统保留
GID_MAX 60000 <==使用者自定义组的最大 GID
SYS_GID_MIN 201 <==保留给用户自行设定的系统账号最小值 GID
SYS_GID_MAX 999 <==保留给用户自行设定的系统账号最大值 GID


CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动建立用户家目录?
UMASK 077 <==用户家目录建立的 umask ,因此权限会是 700
USERGROUPS_ENAB yes <==使用 userdel 删除时,是否会删除初始群组
ENCRYPT_METHOD SHA512 <==密码加密的机制使用的是 sha512 这一个机制!

这个文件规范的数据则是如下所示:

  • mailbox 所在目录:

用户的默认 mailbox 文件放置的目录在 /var/spool/mail,所以 vbird1 的 mailbox 就是在
/var/spool/mail/vbird1

  • shadow 密码第 4, 5, 6 字段内容:

透过 PASS_MAX_DAYS 等等设定值来指定的!所以你知道为何预设的 /etc/shadow 内每一行都会有
『 0:99999:7 』的存在了吗?不过要注意的是,由于目前我们登入时改用 PAM 模块来进行密码检验,
所以那个 PASS_MIN_LEN 是失效的!

  • UID/GID 指定数值:

虽然 Linux 核心支持的账号可高达 2^32 这么多个,不过一部主机要作出这么多账号在管理上也是很麻烦的!
所以在这里就针对 UID/GID 的范围进行规范就是了。上表中的 UID_MIN 指的就是可登入系统的一般账
号的最小 UID ,至于 UID_MAX 则是最大 UID 之意。

要注意的是,系统给予一个账号 UID 时,他是 (1)先参考 UID_MIN 设定值取得最小数值; (2)由
/etc/passwd 搜寻最大的 UID 数值, 将 (1) 与 (2) 相比,找出最大的那个再加一就是新账号的 UID 了。
我们上面已经作出 UID 为 1500 的 vbird2 , 如果再使用『 useradd vbird4 』时,你猜 vbird4 的 UID 会
是多少?答案是: 1501 。 所以中间的 1004~1499 的号码就空下来啦!

而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的选项时,就会找『比 201 大
但比 1000 小的最大的 UID 』就是了。

  • 用户家目录设定值:

强制加上『 -M 』的选项在 useradd 指令执行时啦!至于建立家目录的权限设定呢?就透过 umask 这个设定值啊!因为是 077 的预设设定,因此用户家目录默认权限才会是『 drwx------ 』!

  • 用户删除与密码设定值

使用『USERGROUPS_ENAB yes』这个设定值的功能是: 如果使用 userdel 去删除一个账号时,且该账号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组,举例来说,我们刚刚有建立 vbird4 这个账号,他会主动建立 vbird4 这个群组。 若 vbird4 这个群组并没有其他账号将他加入支持的情况下,若使用 userdel vbird4 时,该群组也会被删除的意思。 至于『ENCRYPT_METHOD SHA512』则表示使用 SHA512 来加密密码明文,而不使用旧式的 MD5.

现在知道啦,使用 useradd 这个程序在建立 Linux 上的账号时,至少会参考:
  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/*

这些文件,不过,最重要的其实是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有用户家
目录就是了~所以,如果你了解整个系统运作的状态,也是可以手动直接修改这几个文件!

13.3.2 密码设置:passwd

刚刚我们讲到了,使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就知道了~
那该如何是好?设定密码就使用 passwd !

[root@study ~]# passwd [--stdin] [账号名称] <==所有人均可使用来改自己的密码
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能
选项与参数:
--stdin :可以透过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接『日期』,shadow 的第 7 字段,密码失效日期

#范例一
请 root 给予 vbird2 密码
[root@study ~]# passwd vbird2
Changing password for user vbird2.
New password:     <--这里直接输入新的密码,屏幕不会有任何反应
BAD PASSWORD: The password is shorter than 8 characters    <--密码太简单或过短的错误!
Retype new password:     <--再输入一次同样的密码
passwd: all authentication tokens updated successfully.  <--密码更新成功提示

当我们要给予用户密码时,透过 root 来设定即可。 root 可以设定各式各样的密码,系统几乎一定会接受!
如同上面的范例一,明明输入的密码太短了,但是系统依旧可接受 vbird2 这样的密码设定。这个是 root 帮忙设定的结果,那如果是用户自己要密码呢?包括 root 也是这样修改的喔!

#范例二用 vbird2 登入后,修改 vbird2 自己的密码
[vbird2@study ~]$ passwd         <==后面没有加账号,就是改自己的密码!
Changing password for user vbird2.
Changing password for vbird2.
(current) UNIX password:         <==这里输入『原有的旧密码』
New password:         <==这里输入新密码
BAD PASSWORD: The password is shorter than 8 characters    <==密码太短!不可以设定!重新想
New password:         <==这里输入新想的密码
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
#同样的,密码设定在字典里面找的到该字符串,所以也是不建议!无法通过,再想新的!
New password:     <==这里再想个新的密码来输入吧
Retype new password:        <==通过密码验证!所以重复这个密码的输入
passwd: all authentication tokens updated successfully.        <==有无成功看关键词
密码设置规则
  • 密码不能与账号相同;
  • 密码尽量不要选用字典里面会出现的字符串;
  • 密码需要超过 8 个字符;
  • 密码不要使用个人信息,如身份证、手机号码、其他电话号码等;
  • 密码不要使用简单的关系式,如 1+1=2, Iamvbird 等;
  • 密码尽量使用大小写字符、数字、特殊字符($,_,-等)的组合。

为了方便系统管理,新版的 passwd 还加入了很多创意选项!个人认为最好用的大概就是这个--stdin了! 举例来说,你想要帮 vbird2 变更密码成为 abc543CC ,可以这样下达指令呢!

#范例三:使用standard input 建立用户的密码
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.

这个动作会直接更新用户的密码而不用再次的手动输入!好处是方便处理,缺点是这个密码会保留在 指令中,未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码!所以这个动作通常仅用在 shell script 的大量建立使用者账号当中!要注意的是,这个选项并不存在所有 distributions 版本中, 请使用 man passwd 确认你的 distribution 是否有支持此选项!

如果你想要让 vbird2 的密码具有相当的规则,举例来说你要让 vbird2 每 60 天需要变更密码, 密 码过期后 10 天未使用就宣告账号失效,那该如何处理?
#范例四:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后账号失效的设定
[root@study vbird2]# passwd -S vbird2 
vbird2 PS 2019-09-23 0 99999 7 -1 (Password set, SHA512 crypt.)
#上面说明密码建立时间(2019-09-23),0 最小天数,99999 变更天数,7 警告日数与密码不会失效(-1)

[root@study /]# passwd -x 60 -i 10 vbird2 
Adjusting aging data for user vbird2.
passwd: Success
[root@study /]# passwd -S vbird2
vbird2 PS 2019-09-23 0 60 7 10 (Password set, SHA512 crypt.)

那如果我想要让某个账号暂时无法使用密码登入主机呢?举例来说,我不想要vbird2这个账号登录, 所以我想要暂时让她无法登入的话,最简单的方法就是让她的密码变成不合法 (shadow 第 2 字段长度变掉)! 处理的方法就更简单的!

#范例五:让vbird2的账号失效,观察完毕后让她失效
[root@study /]# passwd -l vbird2 
Locking password for user vbird2.
passwd: Success
[root@study /]# passwd -S vbird2 
vbird2 LK 2019-09-23 0 60 7 10 (Password locked.)
#第二个字段变成了[LK,Lock]了,就无法登录

[root@study /]# grep vbird2  /etc/shadow 
vbird2:!!$6$bpyLNoJK$LMIc.tfc4iioOH34NKqcnIhgyUXQrjjBQTofUHenoiSCb3xGX3gQvSZGOoy34RVirdOccjDZJi56U2//IZSBK0:18162:0:60:7:10::
#其实只是在用户密码这一列加上了"!!"而已

[root@study /]# passwd -u vbird2  <--解锁账号
Unlocking password for user vbird2.
passwd: Success
[root@study /]# grep vbird2  /etc/shadow
vbird2:$6$bpyLNoJK$LMIc.tfc4iioOH34NKqcnIhgyUXQrjjBQTofUHenoiSCb3xGX3gQvSZGOoy34RVirdOccjDZJi56U2//IZSBK0:18162:0:60:7:10::
#密码字段恢复正常了

13.3.3 密码修改:chage

除了使用 passwd -S 之外,有没有更详细的密码参数显示功能呢?有的!那就是 chage 了!他的用法如下:

[root@study ~]# chage [-ldEImMW] 账号名
选项与参数:
-l :列出该账号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD 
-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更) 
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

#范例一:列出vbird2的详细参数
[root@study /]# chage -l vbird2 
最近一次密码修改时间                                    :9月 23, 2019
密码过期时间                                    :11月 22, 2019
密码失效时间                                    :12月 02, 2019
帐户过期时间                                            :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :60
在密码过期之前警告的天数        :7
们在 passwd 的介绍中谈到了处理 vbird2 这个账号的密码属性流程,使用 passwd -S 却无法看到很清楚的说明。如果使用 chage 那可就明白多了!

chage 有一个功能很不错喔!如果你想要让『使用者在第一次登入时, 强制她们一定要更改密码后才能够使用系统资源』,可以利用如下的方法来处理的!

#范例二:建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,但必须要更改过密码后,使用新密码才能够登入系统使用 bash 环境
[root@study /]# useradd agetest
[root@study /]# echo "agetest" | passwd --stdin agetest 
更改用户 agetest 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@study /]# chage -d 0 agetest 
[root@study /]# chage -l agetest | head -n 3
最近一次密码修改时间                                    :密码必须更改
密码过期时间                                    :密码必须更改
密码失效时间                                    :密码必须更改
#此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!

#尝试使用agetest登入系统则会提示一下信息并且强制要求更改密码
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 agetest 的密码 。
为 agetest 更改 STRESS 密码。
(当前)UNIX 密码:    

非常有趣吧!你会发现 agetest 这个账号在第一次登入时可以使用与账号同名的密码登入, 但登入时就会被要求立刻更改密码,更改密码完成后就会被踢出系统。再次登入时就能够使用新密码登入了!

13.3.4 修改账号:usermod

所谓这『人有失手,马有乱蹄』,您说是吧?所以啰,当然有的时候会『不小心手滑了一下』在 useradd 的时候加入了错误的设定数据。或者是,在使用 useradd 后,发现某些地方还可以进行细部修改。此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关的指令让大家来进行账号相关数据的微调呢~那就是 usermod .

[root@study ~]# usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。 
-d :后面接账号的家目录,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦! 
-f :后面接天数,为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-a :与 -G 合用,可『增加次要群组的支持』而非『设定』喔!
-l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-m, --move-home  将家目录内容移至新位置 (仅于 -d 一起使用)
-o, --non-unique  允许使用重复的(非唯一的) UID
-p, --password PASSWORD  将加密过的密码 (PASSWORD) 设为新密码
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料;
-L :暂时将用户的密码冻结,让他无法登入。其实仅改 /etc/shadow 的密码栏。
-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!

如果你仔细的比对,会发现 usermod 的选项与 useradd 非常类似! 这是因为 usermod 也是用来微调 useradd 增加的使用者参数嘛!不过 usermod 还是有新增的选项, 那就是 -L 与 -U ,不过这两个选项其实与 passwd 的 -l, -u 是相同的!而且也不见得会存在所有的 distribution当中!接下来,让我们谈谈一些变更参数的实例吧!

#范例一:修改使用者 vbird2 的说明栏,加上『VBird's test』的说明。
[root@study /]# usermod -c "VBird's test" vbird2 
[root@study /]# grep vbird2 /etc/passwd
vbird2:x:1500:100:VBird's test:/home/vbird2:/bin/bash

#范例二:使用者vbird2这个账号在"2019-10-20"失效
[root@study /]# usermod -e "2019-10-20" vbird2
[root@study /]# chage  -l vbird2 | grep 'Account'
Account expires                                         : Oct 20, 2019

#范例三:我们建立 vbird3 这个系统账号时并没有给予家目录,请建立他的家目录
[root@study /]# ll -d ~vbird3 
ls: 无法访问/home/vbird3: 没有那个文件或目录
[root@study xiaoqi]# cp -a /etc/skel/ /home/vbird3
[root@study xiaoqi]# chown -R vbird3:vbird3 /home/vbird3     
[root@study xiaoqi]# chmod 700 /home/vbird3
[root@study xiaoqi]# ll -a ~vbird3
总用量 12
drwx------. 3 vbird3 vbird3  74 8月   9 03:42 .
drwxr-xr-x. 7 root   root    69 10月  2 16:28 ..
-rw-r--r--. 1 vbird3 vbird3  18 11月 20 2015 .bash_logout
-rw-r--r--. 1 vbird3 vbird3 193 11月 20 2015 .bash_profile
-rw-r--r--. 1 vbird3 vbird3 231 11月 20 2015 .bashrc
drwxr-xr-x. 4 vbird3 vbird3  37 8月   9 03:41 .mozilla
#使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思;
#使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限!

13.3.5 删除用户:userdel

这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:

  • 用户账号/密码相关参数:/etc/passwd, /etc/shadow
  • 使用者群组相关参数:/etc/group, /etc/gshadow
  • 用户个人文件数据: /home/username, /var/spool/mail/username..

整个指令的语法非常简单:

 [root@study ~]# userdel [-r] username 
 选项与参数:
 -r :连同用户的家目录也一起删除

 范例一:删除 vbird2 ,连同家目录一起删除 
 [root@study ~]# userdel -r vbird2

这个指令下达的时候要小心了!通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可!

一般而言,如果该账号只是『暂时不启用』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 设定为 0 就可以让该账号无法使用,但是所有跟该账号 相关的数据都会留下来! 使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』

另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。 举例来说,他的邮件信箱 (mailbox) 或者是例行性工作排程之类的文件。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!

13.4 用户功能

不论是 useradd/usermod/userdel ,那都是系统管理员所能够使用的指令,如果我是一般身份使用者, 那么我是否除了密码之外,就无法更改其他的数据呢? 当然不是啦!这里我们介绍几个一般身份用 户常用的账号数据变更与查询指令!

13.4.1 id查看UID/GID

[root@study ~]# id [username]

#范例一:查阅 root 自己的相关 ID 信息!
[root@study xiaoqi]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#后面那个 context=... 则是 SELinux 的内容,先不要理会他!

范例二:查阅一下 vbird1 吧~
[root@study xiaoqi]# id vbird1
uid=1001(vbird1) gid=1001(vbird1) 组=1001(vbird1)

13.4.2 finger查询用户信息

finger 的中文字面意义是:『手指』或者是『指纹』的意思。这个 finger 可以查阅很多用户相关的信息! 大部分都是在 /etc/passwd 这个文件里面的信息啦!不过,这个指令有点危险,所以新的 版本中已经默认不安装这个软件!

[root@study ~]# finger [-s] username
选项与参数:
-s :仅列出用户的账号、全名、终端机代号与登入时间等等;
-m :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)

范例一:观察 vbird1 的用户相关账号属性 
[root@study xiaoqi]# finger vbird1
Login: vbird1                           Name: 
Directory: /home/vbird1                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

由于 finger 类似指纹的功能,他会将用户的相关属性列出来!如上表所示,其实他列出来的几乎都是 /etc/passwd 文件里面的东西。列出的信息说明如下:

  • Login:为使用者账号,亦即 /etc/passwd 内的第一字段;
  • Name:为全名,亦即 /etc/passwd 内的第五字段(或称为批注);
  • Directory:就是家目录了;
  • Shell:就是使用的 Shell 文件所在;
  • Never logged in.:figner 还会调查用户登入主机的情况喔!
  • No mail.:调查 /var/spool/mail 当中的信箱资料;
  • No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!

不过是否能够查阅到 Mail 与 Plan 则与权限有关了!因为 Mail / Plan 都是与使用者自己的权限设定有关, root 当然可以查阅到用户的这些信息,但是 vbird1 就不见得能够查到 vbird3 的信息, 因为 /var/spool/mail/vbird3 与 /home/vbird3/ 的权限分别是 660, 700 ,那 vbird1 当然就无法查阅的到!

#范例二:利用 vbird1 建立自己的计划档
[vbird1@study ~]$ echo "I will study Linux during this year." > ~/.plan
[vbird1@study ~]$ finger vbird1
Login: vbird1                           Name: 
Directory: /home/vbird1                 Shell: /bin/bash
Last login 三 10月  2 17:40 (CST) on pts/1
No mail.
Plan:
I will study Linux during this year.

#范例三:找出目前在系统上面登入的用户与登入时间
[vbird1@study xiaoqi]$ finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
xiaoqi    xiaoqi     pts/1      12  Oct  2 15:54                           (macbookpro.lan)
xiaoqi    xiaoqi     pts/0          Oct  2 17:54                           (macbookpro.lan) 

在范例三当中,我们发现输出的信息还会有 Office, Office Phone 等信息,那这些信息要如何记录呢? 底下我们会介绍 chfn 这个指令!来看看如何修改用户的 finger 数据吧!

13.4.3 chfn 添加个人信息

chfn 有点像是: change finger 的意思!这玩意的使用方法如下:

[root@study ~]# chfn [-foph] [账号名] 选项与参数:
-f :后面接完整的大名;
-o :您办公室的房间号码; 
-p :办公室的电话号码; 
-h :家里的电话号码!

范例一:vbird1 自己更改一下自己的相关信息!
[root@study xiaoqi]# su vbird1
[vbird1@study xiaoqi]$ chfn 
Changing finger information for vbird1.
名称 []: VBird Tsai test  <--输入你想要呈现的全名
办公 []:  DIC in KSU        <--办公室号码
办公电话 []: 09-12345678  <--办公室电话
住宅电话 []: 09-123567    <--家里电话号码

密码:        <--确认身份,所以输入自己的密码
Finger information changed

[vbird1@study xiaoqi]$ grep vbird1 /etc/passwd
vbird1:x:1001:1001:VBird Tsai test,DIC in KSU,09-12345678,09-123567:/home/vbird1:/bin/bash
#其实就是改到第五个字段,该字段里面用多个『 , 』分隔就是了!

[vbird1@study xiaoqi]$ finger  vbird1
Login: vbird1                           Name: VBird Tsai test
Directory: /home/vbird1                 Shell: /bin/bash
Office: DIC in KSU, 09-12345678         Home Phone: 09-123567
Last login 三 10月  2 21:13 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
#就是上面特殊字体呈现的那些地方是由 chfn 所修改出来的!

这个指令说实在的,除非是你的主机有很多的用户,否则倒真是用不着这个程序!这就有点像是 bbs 里更改你『个人属性』的那一个资料!

13.4.4 chsh 修改用户的shell

这就是 change shell 的简写!使用方法就更简单了!

[vbird1@study ~]$ chsh [-ls]
选项与参数:
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容! 
-s :设定修改自己的 Shell 

#范例一:用 vbird1 的身份列出系统上所有合法的 shell,并且指定 csh 为自己的 shell
[vbird1@study xiaoqi]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin    <--所谓:合法不可登入的 Shell 就是这玩意!
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh        <--这就是 C shell 啦!
#其实上面的信息就是我们在 bash 中谈到的 /etc/shells 啦!

[vbird1@study xiaoqi]$ chsh -s /bin/csh;grep vbird1 /etc/passwd
Changing shell for vbird1.
密码:  <--验证一下密码
Shell changed.
vbird1:x:1001:1001:VBird Tsai test,DIC in KSU,09-12345678,09-123567:/home/vbird1:/bin/csh

#测试完毕后需要改回来
[vbird1@study xiaoqi]$ chsh -s /bin/bash 
Changing shell for vbird1.
密码:
Shell changed.

[vbird1@study xiaoqi]$ ll $(which chsh)
-rws--x--x. 1 root root 23856 11月 20 2015 /usr/bin/chsh

不论是 chfn 与 chsh ,都是能够让一般用户修改 /etc/passwd 这个系统文件的!所以你猜猜,这两 个文件的权限是什么? 一定是 SUID 的功能!

13.5 群组管理

了解了账号的新增、删除、更动与查询后,再来我们可以聊一聊群组的相关内容了。 基本上,群组的内容都与这两个文件有关:/etc/group, /etc/gshadow。 群组的内容其实很简单,都是上面两个 文件的新增、修改与移除而已,不过,如果再加上有效群组的概念,那么 newgrp 与 gpasswd 则不可不知呢!

13.5.1 增加群组:groupadd

[root@study ~]# groupadd [-g gid] [-r] 组名
选项与参数:
-g :后面接某个特定的 GID ,用来直接给予某个 GID ~
-r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。

范例一:新建一个群组,名称为 group1
[root@study xiaoqi]# groupadd group1
[root@study xiaoqi]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1002:
/etc/gshadow:group1:!::
#群组的 GID 也是会由 1000 以上最大 GID+1 来决定!

曾经有某些版本的教育训练手册谈到,为了让使用者的 UID/GID 成对,她们建议新建的与使用者私有群组无关的其他群组时,使用小于 1000 以下的 GID 为宜。 也就是说,如果要建立群组的话, 最好能够使用『 groupadd -r 群组名』的方式来建立啦! 不过,这见仁见智啦!看你自己的抉择啰!

13.5.2 群组信息修改:groupmod

跟 usermod 类似的,这个指令仅是在进行 group 相关参数的修改而已。

[root@study ~]# groupmod [-g gid] [-n group_name] 群组名 
选项与参数:
-g :修改既有的 GID 数字; 
-n :修改既有的组名

#范例一:将刚刚上个指令建立的 group1 名称改为 mygroup , GID 为 201
[root@study xiaoqi]# groupmod  -g 201 -n mygroup group1 
[root@study xiaoqi]# grep mygroup /etc/group /etc/gshadow      
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::

不过,还是那句老话,不要随意的更动 GID ,容易造成系统资源的错乱!

13.5.3 删除群组:groupdel

groupdel 就是在删除群组的啰~用法很简单:

[root@study ~]# groupdel [groupname]

范例一:将刚刚的 mygroup 删除!
[root@study ~]# groupdel mygroup

范例二:若要删除 vbird1 这个群组的话?
[root@study xiaoqi]# groupdel vbird1
groupdel:不能移除用户“vbird1”的主组

为什么 mygroup 可以删除,但是 vbird1 就不能删除呢?原因很简单,『有某个账号 (/etc/passwd) 的 initial group 使用该群组!』如果查阅一下,你会发现在 /etc/passwd 内的 vbird1 第四栏的 GID 就是 /etc/group 内的 vbird1 那个群组的 GID ,所以啰,当然无法删除~否则 vbird1 这个用户登入系统后,就会找不到 GID ,那可是会造成很大的困扰的!那么如果硬要删除 vbird1 这个群组呢? 你 『必须要确认 /etc/passwd 内的账号没有任何人使用该群组作为 initial group 』才行喔!所以,你可以:

  • 修改 vbird1 的 GID ,或者是:
  • 删除 vbird1 这个使用者。

13.5.4 群组管理员功能:gpasswd

如果系统管理员太忙碌了,导致某些账号想要加入某个项目时找不到人帮忙!这个时候可以建立『群 组管理员』喔! 什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管理员可以管理哪些账号可以加入/移出该群组! 那要如何『建立一个群组管理员』呢?就得要透过 gpasswd !

#关于系统管理员(root)做的动作:
[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname 
[root@study ~]# gpasswd [-rR] groupname
选项与参数:
   :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) -M :将某些账号加入这个群组当中!
-r :将 groupname 的密码移除
-R :让 groupname 的密码栏失效

#关于群组管理员(Group administrator)做的动作:
[someone@study ~]$ gpasswd [-ad] user groupname
选项与参数:
-a :将某位使用者加入到 groupname 这个群组当中!
-d :将某位使用者移除出 groupname 这个群组当中。

#范例一:建立一个新群组,名称为 testgroup 且群组交由 vbird1 管理:
[root@study xiaoqi]# groupadd testgroup    <--先建立群组
[root@study xiaoqi]# gpasswd testgroup  <--给这个群组一个密码吧!
正在修改 testgroup 组的密码
新密码:
请重新输入新密码:  <--验证一下密码

[root@study xiaoqi]# gpasswd -A vbird1 testgroup    <--加入群组管理员为 vbird1
[root@study xiaoqi]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1002:
/etc/gshadow:testgroup:$6$AJVpm/JqntM/$lSKaX/y0cWBe8clgIyVXwknX7HqGwXZ66puOPRzIbD68zX5HJAjAhHkTch10.RPy3lXILA7dpCHkeLykI5KrO.:vbird1:
#此时 vbird1 则拥有 testgroup 的主控权喔!

#范例二:以 vbird1 登入系统,并且让他加入 vbird1, vbird3 成为 testgroup 成员
[vbird1@study xiaoqi]$ id
uid=1001(vbird1) gid=1001(vbird1) 组=1001(vbird1) ....


[vbird1@study xiaoqi]$ gpasswd -a vbird1 testgroup
正在将用户“vbird1”加入到“testgroup”组中
[vbird1@study xiaoqi]$ gpasswd  -a vbird3 testgroup
正在将用户“vbird3”加入到“testgroup”组中
[vbird1@study xiaoqi]$ grep testgroup /etc/group
testgroup:x:1002:vbird1,vbird3

我们可以让 testgroup 成为一个可以公开的群组,然后建立起群组管理员, 群组管理员可以有多个。在这个案例中,我将 vbird1 设定为 testgroup 的群组管理员,所以 vbird1 就可以自行增加群组成员.然后,该群组成员就能够使用 newgrp

13.6 账号管理实例

账号管理不是随意建置几个账号就算了!有时候我们需要考虑到一部主机上面可能有多个账号在协同 工作! 举例来说,在大学任教时,我们学校的专题生是需要分组的,这些同一组的同学间必须要能够互相修改对方的数据文件, 但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录 是不适宜的。那该如何是好? 为此,我们底下提供几个例子来让大家思考看看:

  • 任务一:单纯的完成上头交代的任务,假设我们需要的账号数据如下,你该如何实作?
账号名称账号全名支援次要群组是否可登入主机密码
myuser11st usermygroup1可以password
myuser22nd usermygroup1可以password
myuser33rd user无额外支持不可以password

处理的方法如下所示:

[root@study xiaoqi]# groupadd  mygroup1
[root@study xiaoqi]# useradd -G mygroup1 -c "1st user" myuser1 
[root@study xiaoqi]# useradd -G mygroup1 -c "2nd user" myuser2   
[root@study xiaoqi]# useradd -c "3rd user" -s /sbin/nologin  myuser3 

#再处理账号的密码相关属性的数据:
[root@study xiaoqi]# echo "password" | passwd --stdin myuser1 
更改用户 myuser1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@study xiaoqi]# echo "password" | passwd --stdin myuser2
更改用户 myuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@study xiaoqi]# echo "password" | passwd --stdin myuser3
更改用户 myuser3 的密码 。
passwd:所有的身份验证令牌已经成功更新。

要注意的地方主要有:myuser1 与 myuser2 都有支援次要群组,但该群组不见得会存在,因此需要先手动建立他! 然后 myuser3 是『不可登入系统』的账号,因此需要使用 /sbin/nologin 这个 shell 来给予,这样该账号就无法登入啰!

  • 接下来再来讨论比较难一些的环境!如果是 专题环境该如何制作?
#]1.假设这三个账号都尚未建立,可先建立一个名为 projecta 的群组, 
#再让这三个用户加入其次要群组的支持即可:
[root@study xiaoqi]# groupadd projecta
[root@study xiaoqi]# useradd -G projecta -c "projecta user" pro1
[root@study xiaoqi]# useradd -G projecta -c "projecta user" pro2
[root@study xiaoqi]# useradd -G projecta -c "projecta user" pro3
[root@study xiaoqi]# echo "password" | passwd --stdin pro1
更改用户 pro1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@study xiaoqi]# echo "password" | passwd --stdin pro2
更改用户 pro2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@study xiaoqi]# echo "password" | passwd --stdin pro3
更改用户 pro3 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#2.开始建立此项目的开发目录:
[root@study xiaoqi]# mkdir /srv/projecta
[root@study xiaoqi]# chgrp  projecta  /srv/projecta
[root@study xiaoqi]# chmod 2770 /srv/projecta/
[root@study xiaoqi]# ll -d /srv/projecta/
drwxrws---. 2 root projecta 6 10月  2 22:56 /srv/projecta/

由于此项目计划只能够给 pro1, pro2, pro3 三个人使用,所以 /srv/projecta 的权限设定一定要正确才行! 所以该目录群组一定是 projecta ,但是权限怎么会是 2770 呢还记得之前谈到的 SGID ? 为了让三个使用者能够互相修改对方的文件,这个 SGID 是必须要存在的喔!如果连这里都能够理解!您的账号管理已经有一定程度的概念!

但接下来有个困扰的问题发生了!假如任务一的 myuser1 是 projecta 这个项目的助理,他需要这个 项目的内容, 但是他『不可以修改』项目目录内的任何数据!那该如何是好?你或许可以这样做:

  • 将 myuser1 加入 projecta 这个群组的支持,但是这样会让 myuser1 具有完整的 /srv/projecta 的权限, myuser1 是可以删除该目录下的任何数据的!这样是有问题的;
  • 将 /srv/projecta 的权限改为 2775 ,让 myuser1 可以进入查阅数据。但此时会发生所有其他人均可进入该目录查阅的困扰! 这也不是我们要的环境。

13.7 使用外部身份认证系统

在谈 ACL 之前,我们再来谈一个概念性的操作~因为我们目前没有服务器可供练习....

有时候,除了本机的账号之外,我们可能还会使用到其他外部的身份验证服务器所提供的验证身份的 功能!举例来说, windows 底下有个很有名的身份验证系统,称为 Active Directory (AD)的东西, 还有 Linux 为了提供不同主机使用同一组账号密码, 也会使用到 LDAP, NIS 等服务器提供的身份验证等等!

如果你的 Linux 主机要使用到上面提到的这些外部身份验证系统时,可能就得要额外的设定一些数据了! 为了简化用户的操作流程,所以 CentOS提供一只名为 authconfig-tui 的指令给我们使用.

最后修改:2020 年 01 月 21 日 04 : 33 PM

发表评论