13.1 Linux的账号与群组
13.1.1 使用者识别码:UID与GID
每一个文件都具有“拥有人与拥有群组”的属性。每个登陆的使用者至少都会取得两个 ID ,一个是使用者 ID (UserID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。
那么文件如何判别他的拥有者与群组呢?其实就是利用 UID 与 GID 。每一个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd与 /etc/group 的内容, 找到 UID / GID 对应的帐号与群组名称再显示出来!我们可以作个小实验,你可以用 root 的身份 vim /etc/passwd ,然后将你的一般身份的使用者的 ID 随便改一个号码,然后再到你的一般身份的目录下看看原先该帐号拥有的文件,你会发现该文件的拥有人变成了 “数字了”。
13.1.2 使用者帐号
输入帐号密码后,系统帮你处理了什么呢?
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。
/etc/passwd 文件结构
这个文件的构造是这样的:每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中! 不过需要特别留意的是,里头很多帐号本来就是系统正常运行所必须要的,我们可以简称他为系统帐号, 例如 bin, daemon, adm, nobody 等等,这些帐号请不要随意的杀掉他。
我们先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了, 你可以明显的看出来,每一行使用“:”分隔开,分别是:
1. 帐号名称: 就是帐号。用来提供给对数字不太敏感的人类使用来登陆系统的!需要用来对应 UID 。例如 root 的 UID 对应就是 0 (第三字段);
2. 密码: 早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”。
3. UID: 这个就是使用者识别码。
4. GID: 这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范群组名称与 GID 的对应而已!
5. 使用者信息说明栏: 这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意义而已!不过,如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息。
6. 主文件夹: 这是使用者的主文件夹,以上面为例, root 的主文件夹在 /root ,所以当root 登陆之后,就会立刻跑到 /root 目录里头。如果你有个帐号的使用空间特别的大,你想要将该帐号的主文件夹移动到其他的硬盘去,可以在这个字段进行修。默认的使用者主文件夹在 /home/yourIDname。
7. Shell: 我们在第十章 BASH 提到很多次,当使用者登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行使用者的操作任务。
8. /etc/shadow 文件结构
我们知道很多程序的运行都与权限有关,而权限与 UID/GID 有关!因此各程序当然需要读取/etc/passwd 来了解不同帐号的权限。 因此 /etc/passwd 的权限需设置为 -rw-r--r-- 这样的情况, 虽然早期的密码也有加密过,但却放置到 /etc/passwd 的第二个字段上。
/etc/shadow文件像这样:
基本上, shadow 同样以“:”作为分隔符号,如果数一数,会发现共有九个字段啊,这九个字段的用途是这样的:
1. 帐号名称: 由于密码也需要与帐号对应。因此,这个文件的第一栏就是帐号,必须要与 /etc/passwd 相同才行。
2. 密码: 这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) 啦! 你只会看到有一些特殊符号的字母就是了!需要特别留意的是,虽然这些加密过的密码很难被解出来, 但是“很难”不等于“不会”,所以,这个文件的默认权限是“-rw-------”或者是“----------”,亦即只有 root 才可以读写就是了。
举个例子,假如我的 dmtsai 这个使用者的密码栏如下所示:
这表示什么呢?先要注意的是 16559 是 2015/05/04 。所以 dmtsai 这个使用者的密码相关意义是:
由于密码几乎仅能单向运算(由明码计算成为密码,无法由密码反推回明码),因此由上表的数据我们无法得知 dmstai 的实际密码明文 (第二个字段);
此帐号最近一次更动密码的日期是 2015/05/04 (16559);
能够再次修改密码的时间是 5 天以后,也就是 2015/05/09 以前 dmtsai 不能修改自己的密码;如果使用者还是尝试要更动自己的密码,系统就会出现这样的讯息:
由于密码过期日期定义为 60 天后,亦即累积日数为: 16559+60=16619,经过计算得到此日数代表日期为 2015/07/03。 这表示:“使用者必须要在 2015/05/09 (前 5 天不能改) 到 2015/07/03 之间的 60 天限制内去修改自己的密码,若 2015/07/03 之后还是没有变更密码时,该密码就宣告为过期”了!
警告日期设为 7 天,亦即是密码过期日前的 7 天,在本例中则代表 2015/06/26 ~2015/07/03 这七天。 如果使用者一直没有更改密码,那么在这 7 天中,只要 dmtsai 登陆系统就会发现如下的讯息:
如果该帐号一直到 2015/07/03 都没有更改密码,那么密码就过期了。但是由于有 5 天的宽限天数, 因此 dmtsai 在 2015/07/08 前都还可以使用旧密码登陆主机。 不过登陆时会出现强制更改密码的情况,画面有点像下面这样:
你必须要输入一次旧密码以及两次新密码后,才能够开始使用系统的各项资源。如果你是在 2015/07/08 以后尝试以 dmtsai 登陆的话,那么就会出现如下的错误讯息且无法登陆,因为此时你的密码就失效了。
如果使用者在 2015/07/03 以前变更过密码,那么第 3 个字段的那个 16559 的天数就会跟着改变,因此, 所有的限制日期也会跟着相对变动。
无论使用者如何动作,到了 16679 (大约是 2015/09/01 左右) 该帐号就失效了。
一般用户的密码忘记了:这个最容易解决,请系统管理员帮忙, 他会重新设置好你的密码而不需要知道你的旧密码!利用 root 的身份使用 passwd 指令来处理即可。
root密码忘记,无法使用root身份登陆,但是root密码在/etc/shadow当中,因此可以使用可行的方法开机进入Linux再去修改。例如系统会主动给予root权限的bash接口,此时再用passwd修改密码。或以 Live CD 开机后挂载根目录去修改/etc/shadow,将里面的 root 的密码字段清空, 再重新开机后 root 将不用密码即可登陆!登陆后再赶快以 passwd 指令去设置 root 密码即可。






