Linux 的账号与群组

使用者标识符: UID 与 GID

每一个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来

# 1. 先察看一下,系统里面有没有一个名为 dmtsai 的用户?
[root@www ~]# grep 'dmtsai' /etc/passwd
dmtsai:x:503:504::/home/dmtsai:/bin/bash   <==是有这个账号喔!
[root@www ~]# ll -d /home/dmtsai
drwx------ 4 dmtsai dmtsai 4096 Feb  6 18:25 /home/dmtsai
# 瞧一瞧,使用者的字段正是 dmtsai 本身喔!

# 2. 修改一下,将刚刚我们的 dmtsai 的 503 UID 改为 2000 看看:
[root@www ~]# vi /etc/passwd
....(前面省略)....
dmtsai:x:2000:504::/home/dmtsai:/bin/bash <==修改一下特殊字体部分,由 503 改过来
[root@www ~]# ll -d /home/dmtsai
drwx------ 4 503 dmtsai 4096 Feb  6 18:25 /home/dmtsai
# 很害怕吧!怎么变成 503 了?因为文件只会记录数字而已!
# 因为我们乱改,所以导致 503 找不到对应的账号,因此显示数字!

# 3. 记得将刚刚的 2000 改回来!
[root@www ~]# vi /etc/passwd
....(前面省略)....
dmtsai:x:503:504::/home/dmtsai:/bin/bash <==赶紧改回来!

使用者账号:/etc/passwd 文件结构, /etc/shadow 文件结构

Linux 系统上面的用户如果需要登陆主机以取得 shell 的环境来工作时,你输入账号口令后,系统帮你处理了以下事情:

  1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 配置也一并读出;

  2. 再来则是核对口令表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的口令与里头的口令是否相符?

  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!

/etc/passwd 文件结构

//每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里头很多账号本来就是系统正常运行所必须要的,我们可以简称他为系统账号, 例如 bin, daemon, adm, nobody 等等
[root@www ~]# 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
每一行使用『:』分隔开,共有七个咚咚,分别是:  
1. 账号名称:就是账号啦!用来对应 UID 的。例如 root 的 UID 对应就是 0 (第三字段);  
2. 口令:早期 Unix 系统的口令就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成口令数据被窃取, 因此后来就将这个字段的口令数据给他改放到 /etc/shadow 中了。所以这里你会看到一个『 x 』,呵呵!  
3. UID:当 UID 是 0 时,代表这个账号是『系统管理员』!  
        1~99:由 distributions 自行创建的系统账号;  
        100~499:若用户有系统账号需求时,可以使用的账号 UID。  
        500~65535:给一般使用者用的。  
4. GID:这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范组名与 GID 的对应而已!  
5. 用户信息说明栏:这个字段基本上并没有什么重要用途,只是用来解释这个账号的意义而已!  
6. 家目录:这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登陆之后,就会立刻跑到 /root 目录里头啦!  
7. Shell:当用户登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行用户的操作任务。

/etc/shadow 文件结构

[root@www ~]# head -n 4 /etc/shadow
root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7:::  <==底下说明用
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
adm:*:14126:0:99999:7:::
shadow 同样以『:』作为分隔符,有九个字段,这九个字段的用途是这样的:
1.账号名称:由于口令也需要与账号对应啊~因此,这个文件的第一栏就是账号,必须要与 /etc/passwd 相同才行!
2.口令:这个字段内的数据才是真正的口令,而且是经过编码的口令 (加密) 啦! 你只会看到有一些特殊符号的字母就是了!这个文件的默认权限是『-rw-------』或者是『-r--------』,亦即只有 root 才可以读写就是了!
3.最近更动口令的日期
4.口令不可被更动的天数:(与第 3 字段相比)
5.口令需要重新变更的天数:(与第 3 字段相比)
6.口令需要变更期限前的警告天数:(与第 5 字段相比)
7.口令过期后的账号宽限时间(口令失效日):(与第 5 字段相比)
8.账号失效日期
9.保留:最后一个字段是保留的,看以后有没有新功能加入。

关于群组:有效与初始群组、groups, newgrp

账号相关文件之间的 UID/GID 与口令相关性示意图

/etc/group 文件结构

[root@www ~]# head -n 4 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
1. 组名
2. 群组口令:通常不需要配置,这个配置通常是给『群组管理员』使用的,目前很少有这个机会配置群组管理员啦! 同样的,口令已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;
3. GID:就是群组的 ID 啊。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!
4. 此群组支持的账号名称:我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。

假如我同时加入多个群组,那么我在作业的时候,到底是以那个群组为准?

  • 有效群组(effective group)与初始群组(initial group)
    每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID就是他的『初始群组 (initial group) 』,也就是说,当用户一登陆系统,立刻就拥有这个群组的相关权限的意思。

    [root@www ~]# usermod -G users dmtsai  <==先配置好次要群组
    [root@www ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
    /etc/passwd:dmtsai:x:503:504::/home/dmtsai:/bin/bash
    /etc/group:users:x:100:dmtsai  <==次要群组的配置
    /etc/group:dmtsai:x:504:       <==因为是初始群组,所以第四字段不需要填入账号
    /etc/gshadow:users:::dmtsai    <==次要群组的配置
    /etc/gshadow:dmtsai:!::
    
  • groups: 有效与支持群组的观察
    如果我以 dmtsai 这个使用者的身份登陆后,该如何知道我所有支持的群组呢? 很简单啊,直接输入 groups 就可以了!

    [dmtsai@www ~]$ groups
    dmtsai users
    //第一个输出的群组即为有效群组 (effective group)
    
  • newgrp: 有效群组的切换 使用newgrp切换有效群组,但你想要切换的群组必须是你已经有支持的群组。

    [dmtsai@www ~]$ newgrp users
    [dmtsai@www ~]$ groups
    users dmtsai
    [dmtsai@www ~]$ touch test2
    [dmtsai@www ~]$ ll
    -rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test
    -rw-r--r-- 1 dmtsai users  0 Feb 24 17:33 test2
    

/etc/gshadow

[root@www ~]# head -n 4 /etc/gshadow
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
sys:::root,bin,adm
1. 组名
2. 口令栏,同样的,开头为 ! 表示无合法口令,所以无群组管理员
3. 群组管理员的账号 (相关信息在 gpasswd 中介绍)
4. 该群组的所属账号 (与 /etc/group 内容相同!)