8. 用户和群组

本文详细介绍了Linux系统中的用户和群组管理,包括密码文件`/etc/passwd`、影子密码文件`/etc/shadow`和群组文件`/etc/group`的结构和作用。重点讨论了用户ID、群组ID、加密密码以及如何从这些文件中获取用户和群组信息。此外,还提及了密码加密和用户验证的过程,以及如何安全地处理密码信息。
摘要由CSDN通过智能技术生成

每个用户都有唯一的登录名和相关的用户ID(UID)。用户可以属于一个或者多个群组。每一个群组有自己的名字和唯一的群组ID(GID)。

使用用户和群组ID的主要目的就是能够确定不同系统资源对不同目标群体的控制权限。比如说,一个文件属于一个特定的用户和群体,每一个进程也有自己所属的用户和群体ID,这时候通过匹配可以决定该进程是否可以拥有某些系统资源。

这一章我们将会看到用于决定用户和群组的系统文件,然后我们会描述从这些文件当中提取信息的库函数。最后我们会讨论crypto()函数,它是一个用来加密和认证登陆密码的函数。

8.1 密码文件:/etc/passwd

系统文件password file,/etc/passwd,它每一行的内容都是一个用户账户。每一行都有7个域,他们通过":"分隔,比如在我这里:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...
pi:x:1000:1000:,,,:/home/pi:/bin/bash

上面包含了所有账户,其中找到我们在树莓派上作为用户来登录的pi用户。

我们现在按顺序来一一讲解这些fields都是什么,有什么意义:

  • Login name登录名: 这是用户为了登录所需要使用的唯一名称,通常被称之为user name。相比于user ID我们可以将该login name设置为人可以理解的字符。使用ls(1)的话,可以显示login name而不是数字user ID,比如 ls -l。可以看到拥有该文件访问权的是user "pi"。
pi@raspberrypi:~/sysprog/learn_tlpi/build $ ls -l
total 20
-rwxr-xr-x 1 pi pi 14020 Aug  3 21:52 out
drwxr-xr-x 4 pi pi  4096 Aug  3 21:52 src
  • Encrypted password被加密密码:这个域包含了一个13个字符的被加密的密码(但是在我这里只显示一个x,具体见该部分后半段),具体的见章8.5。如果password域包含了别的字符串,尤其是当不是13位的时候,那么登录该账户的权限就会被冻结,因为该非13字符的域并不能代表一个有效的被加密密码。注意,如果影子密码被使能的话,这个位置则会显示一个字母x,也就是我这里碰到的情况,同时影子密码会被另外存在一个影子密码文件当中,见8.2章。如果password域什么都没有的话,那么就表明该账户登录不需要任何密码(在影子密码被使能的情况下也是一样)。
  • User ID(UID):这个就是在Login name中所提到的它所相对应的那个数字ID。这里有一个特殊的UID就是0,它代表着超级权限。通常来说0一般会被root账户所占据。在早期Linux 2.2版本之前,UID只是一个16位的数值从0-65535,但是现在他已经被在Linux2.4版本之后扩展到32位。
    另外,Login Name可以和User ID N:1映射,也就是说可以有多个登录名和密码使用同一个UserID,那么这也就同时允许多个用户在使用不同的密码的情况下有权进入同一个资源。甚至这些不同的用户名还可以被分配在不同的用户组ID里。
  • Group ID(GID):这个是上面UID所属的第一个Group的ID。其他这个UID所属的GID可以在系统group文件中找到。
  • Comment:这个域保存了一些关于该用户文字性的内容,并且它可以通过比如finger(1)读出来。
  • Home Directory:这是用户登录之后所被放置的初始文件夹的位置。
  • Login Shell:在用户登陆之后,控制权就会被转移到的程序。一般来说,他会是一个shell,比如bash,但是他也可以是任何其他程序。如果这个位置是空着的话,那么login shell就会被默认在/bin/sh上,也就是Bourne shell。这一个位置同时会变成SHELL环境变量的值。

在一个stand-alone系统(独立系统)上,所有的password信息都会存放在/etc/passwd里。然而,如果我们使用例如Network Inormation System的话或者别的系统的话,那么password就会被分布在网络环境上面,部分这些信息会被保存在远程系统上。

8.2 影子密码文件:/etc/shadow

历史上来说UNIX系统在/etc/passwd中维持着所有的用户信息包括被加密的密码。但是这种方式有着严重的security问题。因为很多有非高权限的系统都需要使用并得到该password文件中的一些信息,所以他就必须对所有用户开放。这就相当于为破解密码的程序开了一个后门,如果我们进行重复计算实验总是能够得到相应的密码。因此/etc/shadow文件就孕育而生来阻止这一类攻击。(其实一般来讲密码是通过HASH算法进行加密,当我们给定正确密码的时候,计算机会计算出他的HASH值和存储的HASH值进行比较,如果黑客知道用的哪一种标准算法,通过暴力破解,是可以通过HASH算出来所给的密码是什么,所以这也是为什么要隐藏HASH值得原因)。因此这里就是将所有非敏感信息放在/etc/passwd文件当中,而被加密得密码则维持在/etc/shadow当中,它只可以被有权限的程序读取。

另外对于用户名来说,它提供了/etc/passwd和/etc/shadow映射关系的角色,在shadow密码文件当中他也提供了一些列包含信息安全相关的域。关于这些域的信息可以通过shadow(5)查找用户手册。我们这里只会关心被加密的密码域,之后在8.5节当中会进行进一步的讲解。

SUSv3并没有要求要有shadow密码,而且并不是所有的UNIX都实现了类似功能。

8.3 群组文件:/etc/group

处于管理的目的,尤其是当控制对文件以及其他系统资源访问的时候,那么将用户归于某一些群组会非常有帮助。

用户所属的群组的集合被定义在/etc/passwd和/etc/group当中来表明该用户属于哪一个或者哪几个群组。将这同一类信息分到两个文件当中是出于历史原因:在早期的UNIX实现中,一个用户仅仅可以存在于一个Group当中。一个用户的初始用户组信息再登陆的时候就由password文件当中的GID所决定的,并且之后可以通过newgrp(1)来进行修改,当然为了达到这个目的需要提供Group的密码才可以。从4.2BSD开始引入了多群组概念,后来成为了POSIX.1-1990标准。在这个概念底下,一个群组文件则被列在一个单独的文件当中。

/etc/group群组文件,每一行都是一个单独的群组信息。这里面由“:”隔出来四个域,其中包含了以下信息。首先参考树莓派上所读取出来的部分group的内容。

root:x:0:
...
kmem:x:15:
dialout:x:20:pi
fax:x:21:
voice:x:22:
cdrom:x:24:pi
floppy:x:25:
tape:x:26:
sudo:x:27:pi
audio:x:29:pi
dip:x:30:
www-data:x:33:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值