1、使用者的UID和GID
我们在登入Linux主机的时候,输入的是我们的账号,但其实Linux主机并不认识账号名称,它仅认识ID。由于计算机仅认识0与1,所以主机对数字比较有概念,账号只是为了便于记忆。账号与ID对应存储在/etc/passwd中。对于每一个文件都具有拥有者和群组属性,即每个人登入使用至少会取得两个ID,一个是使用者ID(User ID,简称UID),一个是群组ID(Group ID,简称GID)文件是通过UID 和 GID进行判断拥有者和群组 ,当我们要显示文件属性时,系统依据/etc/passwd与/etc/group的内容,找到UID/GID对应的账号与组名再显示出来
2、使用者账号
linux 上的用户如果需要登入主机以取得shell的环境来进行工作,必须在计算机前面利用tty1~tty6的终端机提供的login端口,并输入账号密码进行登入。系统执行流程如下
(1)寻找/etc/passwd中是否有账号,无则跳出,如果有则将该账号对应的UID与GID读出来,并将该账号的家目录与shell设定也一并读出。
(2)核对密码表
(3)进入shell控管阶段
我们应该知道的两个非常重要的文件,一个是管理使用者UID/GID重要参数的/etc/passwd,一个是专门管理密码相关数据的/etc/shadow.
<1>/etc/passwd文件结构
该文件的结构是每一行都代表一格账号,有几行就代表有几个账号在系统中,其中有很多账号是系统正常运作必须要有的,简称为系统账号,例如bin、daemon、adm、nobody等,切勿随意删除。
第一行为root系统管理员用户,文件内每一项都使用 : 隔开,总共有七项,分别是:
(1)账号名称:需要用来对应UID
(2)密码:早期的unix系统的密码是放在这个字段的,但是由于该文件可以被所有的程序读取,导致密码数据容易被窃取,因此后来将该字段的密码数据改放到/etc/shadow中,现在看到的是x
(3)UID:(UID为0时为root)
id 范围 | 该 ID 使用者特性 |
---|---|
0(系统管理员) | 当 UID 是 0 时,代表这个账号是『系统管理员』! 所以当你要让其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。 这也就是说,一部系统上面的系统管理员不见得只有 root 喔! 不过,很不建议有多个账号的 UID 是 0 啦~容易让系统管理员混乱! |
1~999 (系统账号) | 保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。默认 1000 以下的数字让给系统作为保留账号只是一个习惯。由于系统上面启动的网络服务或背景服务希望使用较小的权限去运作,因此不希望使用 root 的身份去执行这些服务, 所以我们就得要提供这些运作中程序的拥有者账号才行。这些系统账号通常是不可登入的, 所以才会有我们在第十章提到的/sbin/nologin 这个特殊的 shell 存在。根据系统账号的由来,通常这类账号又约略被区分为两种: o 1~200:由 distributions 自行建立的系统账号; o 201~999:若用户有系统账号需求时,可以使用的账号 UID。 |
1000~60000 (可登入账号) | 给一般使用者用的。事实上,目前的 linux 核心 (3.10.x 版)已经可以支持到4294967295 (2^32-1) 这么大的 UID 号喔! |
(4)GID:该项与/etc/group有关,作用是用来规范组名与GID的对应
(5)用户信息说明栏:解释账号的意义
(6)家目录:当用户登入后会立即进入到该用户的家目录中,所以想要将该账号的家目录移动到其它的硬盘中去,可以通过修改该字段的方式进行移动。
(7)shell:当用户登入系统后悔取得一个shell来与系统的核心沟通以进行用户的操作任务。预设的shell会使用bash,其就是通过该字段进行指定的。有一个shell可以用来代替成让账号无法取得shell环境的登入动作,那就是/sbin/nologin,也可以用来制作纯pop邮箱账号者的数据。
<2>/etc/shadow文件结构
shadow以:作为分隔,每行共有9个字段
(1)账号名称:与/etc/passwd想对应
(2)密码:该字段内的为密码,且经过编码的加密(加密),加密过的密码很难破解,但是仍然可以破解开,请勿更动该文件。由于各种密码的编码技术不一样,因此不同的编码系统会造成该字段的长度不同。例如,旧式的DES、MD5编码系统产生的密码长度与目前惯用的SHA不同。由于固定的编码系统产生的密码长度必须一致,因此当该字段的长度改变后,改密码就会失效(无法计算),很多软件都会透过该功能,在此字段前加上一定的字符让密码暂时的失效。
(3)最近更动密码的日期:17632,linux的日期时间是以1970年1月1日最为1进行累加的,1971年1月1日就是366,由此17362指的就是2017年起之后的160天
(4)命令不可被更动的天数:(与第三字段进行对比)该字段记录该账号的密码在最近一笔被更改后需要经过几天后才可以被更改。
(5)密码需用重新变更的天数(与第三字段进行对比)为了强制要求用户更改密码,这个字段可以制定在最近一次更改密码后,在多少天内需要再次变更密码,我们必须要在这个天数内重新设定密码,否则这个账号将变为过期特性
(6)密码需要变更前期限前的警告天数(与第五字段相比)当账号密码的有效期快要到的时候,系统会依据该字段的设定,发出警告给该账号。
(7)密码过期后的账号宽限日(密码失效日)(与第五字段相比)密码有效日期为:更新日期(第三字段0)+重新变更日期(第五字段),过期后用户依旧没有更新密码,那该密码就算过期了,虽然密码过期,但是该账号还是可以用来进行其他工作的,包括登入系统bash。不过如果密码过期了,当你登入系统时,就会强制要求你必须重新设定密码才可以继续使用,这就是密码过期特性,该字段的功能是在密码过期几天后,如果使用者还是没有登入改密码,那么该账号将会失效,即该账号再无法使用该密码登入。注意密码过期与密码失效并不相同。
(8)账号失效日期:与第三字段的设定方式一样。该账号在此字段规定日期之后,将无法再使用。就是所谓的账号失效
(9)保留:为以后加入新功能所保留的。
当用户忘记自己的用户密码时
[1]对于一般用户而言,请系统管理员来解决,他会重新设定新的密码而不需要知道旧密码。使用root身份下达passwd命令。
[2]root密码忘记:这个就比较头大了,我们知道root的密码在/etc/shadow中,因此我们可以使用各种可行的办法开机进入到Linux系统中去修改。例如重新启动进入单人维护模式后,系统会主动给予root权限的bash接口,此时再使用passwd修改密码即可,或以Live CD开机后挂载根目录去修改/etc/shadow,将root密码字段清空,重新启动后root将不用密码登入,登入后使用passwd指令立即修改新密码。
由于Linux新旧版本差异较大,如果想知道shadow使用的是哪种加密机制,可以通过下面的方式进行查询
命令:authconfig --test | grep hashing
3、关于群组:有效与初始群组、groups、newgrp
<1>/etc/gropu文件结构
该文件记录了GID 与组名的对应关系。文件中中的每一行代表一个群组,以 : 分隔,共四栏
(1)组名
(2)群组密码:通常不需要设定,该设定通常是给群组管理员使用的,目前很少有这个机会设定群组管理员了,同样,密码已经移动到/etc/gshadow,在该字段只会存在一个x
(3)GID:群组ID
(4)此群组支持的账号名称:一个群组支持多个账号,我们想让某个账号加入到该群组中,只需要将该账号天填入到该字段。
注意:在新版的Linux中,初始群组的用户群已经不会加入到第四个字段中,例如我们知道root这个主账号的主要群组为root,从上图可以看出,root用户已经不在root群组那一行了。
<2>有效群组(effctive group)与初始群组(initial group)
GID为所谓的初始群组(initial group),当用户登入系统后,就立刻拥有该群组的相关权限。上面我们提到的dmtsai使用者的/etc/passwd与/etc/group、/etc/gshadow相关内容如下
dmtsai所属群组为dmtsai的群组,这就是初始群组,初始群组在用户登入后就会主动取得,不需要在/etc/group第四字段写入该账号。对于不是初始群组的情况下,必须要将用户加入该群组的第四字段中,才可以使用该群组的功能。如果一个用户所属多个群组,则其同时拥有多个群组的功能。如果我需要新建一个文件或目录,则所属群组为当时情况下的有效群组。
<3>groups:有效和支持群组的观察
命令:groups ##观察当前用户所支持的群组。其中第一个输出的为有效群组
<4>newgrp有效群组的切换
命令:$ newgrp 新的群组 #可以在自己所属的群组中进行切换,但是无法切换为sshd。该指令是通过另外一个新的shell进行提供的,即dmtsai这个使用者目前是以另一个shell登入的,而新的shell给予dmtsai有效的GID为新的群组。由于获得一个新的shell,需要使用exit回到原来的shell。
用户加入群组的方法有两种(1)透过系统管理员使用usermod加入。(2)透过群组管理员以gpasswd加入。
<5>/etc/gshadow
gshadow的内容:
四个字段的意义分别为
(1)组名
(2)密码栏,开头为!表示无合法密码,所以无群组管理员
(3)群组管理员的账号
(4)有加入该群组支持的所属账号