与用户账号管理有关的系统文件


默认情况下,系统中所有账号信息都记录在/etc/passwd文件中,用户的口令密码记录在/etc/shadow文件中,用户组信息纪录在/etc/group文件内!
用户在登录linux的时候,login进程会去/etc/passwd文件查找和登录用户匹配的用户信息,包括UID、GID、用户家目录、登录shell等;
然后将用户输入的口令密码和/etc/shadow文件中记录的用户口令密码进行比较,如果密码匹配正确,就会开启登录shell进程,将登录shell提供给用户。
上面就是简单的登录过程描述,涉及到两个重要的系统账号文件,一个是记录用户账号信息的/etc/passwd文件, 一个则是记录用户账号密码信息的/etc/shadow文件!
用户和用户组的添加、修改、删除等账号管理命令就是通过修改这三个文件而实现的。 这三个文件都是系统的重要文件,不能随便修改和删除。
文件中的每个字段都有对应的修改命令,不能随便用vim等文本编辑器编辑这些文件,而是应该用对应的命令进行编辑。

一./etc/passwd文件

回到顶部

linux将所有添加到系统中的帐号信息都记录到/etc/passwd文件中.该文件为文本文件,通过cat命令可以查看该文件的内容:

              peter@initroot:~$ cat /etc/passwd
              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
              #...省略...
              nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
              #...省略...
              peter:x:1000:1000:peter,,,:/home/peter:/bin/bash
              vboxadd:x:999:1::/var/run/vboxadd:/bin/false
              test:x:1001:1001::/home/test:/bin/sh
            
从上面的输出可以看出/etc/passwd文件中每一行记录对应着一个用户账号,每行记录又分为7个字段,各字段用冒号(:)分隔,各字段含义表示如下:
用户名:口令密码:用户ID号:用户组ID号:注释性描述:用户主目录:登录Shell
1.用户名 该字段为用户账号的字符串。一般用户名由大小写英文字母和数字组成,长度不超过8个字符。登录名中不能有冒号(:),因为冒号在这里是分隔符。 登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。
2.口令密码 该字段存放加密后的用户口令。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。 现代Linux系统使用了shadow技术,把真正加密后的用户口令存放到/etc/shadow文件中,而/etc/passwd文件中的口令字段只存放一个特殊的字符,例如“x”或者“*”。
3.用户ID号UID linux内部使用ID标识每一个用户.账号名只是为了方便人类识别。 UID是一个整数,在系统内部用来标识用户。一般情况下它与用户名是一一对应的。如果有多个用户名对应一个UID,系统内部将它们视为同一个用户, 但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。
通常用户ID号的取值范围是0~65535。超级用户root的ID号为0,1~999由系统保留,作为管理账号,普通用户的标识号从1000开始。
4.用户组ID号GID 该字段记录的是用户所属的用户组ID。对应着/etc/group文件中的一条记录。
5.注释性描述 该字段记录用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux系统中,这个字段的格式并没有统一。 在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。
6.用户主目录 用户登录后的起始工作目录,又称家目录.超级用户root的家目录为/root.在大多数系统中,普通用户的主目录都被组织在同一个特定的目录下, 一般都是/home/loginname目录下,用户主目录的名称就是该用户的登录名。比如登录用户是peter,那么peter的主目录就是/home/peter. 各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
7.登录shell 用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。
Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
关于shell的更多内容参考:
什么是linux shell
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。 有些Linux系统要求只有那些在系统中注册了的程序才能出现在这个字段中。
通过查看/etc/passwd文件,可以发现有一些账号的登录shell为/usr/sbin/nologin, 这类账号无法正常登录系统,称为伪账号(pseudo users)。
这些账号主要是为了方便系统管理,某些系统进程会以这些账号身份运行,相对应的文件所有者也是这些账号。
常见的伪账号如下所示:
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用
除了上面列出的伪账号外,还有许多标准的伪账号,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。

2./etc/shadow文件

回到顶部

由于/etc/passwd文件对所有用户都可读,如果用户的密码太简单或规律比较明显,就会很容易被破解。 对安全性要求较高的Linux系统都把加密后的口令分离出来,单独存放在/etc/shadow文件中。 只有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。
/etc/shadow中的记录与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生.
通过cat命令查看该文件的内容如下:

              peter@initroot:/home/wwwroot/default/kblog$ sudo cat /etc/shadow
              root:!:18218:0:99999:7:::
              daemon:*:18106:0:99999:7:::
              bin:*:18106:0:99999:7:::
              sys:*:18106:0:99999:7:::
              #...省略...
              peter:$6$UijNFQxM$WngK/M6zBGigopeCaqZoV.seytIU70WQU6VKtfmxvdxUjzAZkooW0F/xslozTjfAtUVa5hydsynOoiWb8YHib1:18218:0:99999:7:::
              vboxadd:!:18218::::::
              test:$6$2wD0/fkz$QkwBGuE1C1UTRAhAeaYmd2C8hmO43mbbqtoNJJqBwX2O/xIulUhExvfFN/ar7PzCf67mAp3rXO2yWoYJulZ7M/:18239:0:99999:7:::
            
/etc/shadow的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段的含义解释如下:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
1."登录名"是与/etc/passwd文件中的登录名相一致的用户账号
2."口令"字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令; 如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
3."最后一次修改时间"表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。 例如在SCO Linux 中,这个时间起点是1970年1月1日。
4."最小时间间隔"指的是两次修改口令之间所需的最小天数。
5."最大时间间隔"指的是口令保持有效的最大天数。
6."警告时间"字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7."不活动时间"表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8."失效时间"字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。 期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

3./etc/group文件

回到顶部

用户组的所有信息都存放在/etc/group文件中。
将用户分组是Linux系统对用户进行管理及控制访问权限的一种手段。
每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。
当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组
用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。
通过cat命令查看该文件的内容如下:

              peter@initroot:/home/wwwroot/default/kblog$ cat /etc/group
              root:x:0:
              daemon:x:1:
              bin:x:2:
              sys:x:3:
              adm:x:4:syslog,peter
              tty:x:5:
              #...省略...
              peter:x:1000:
              sambashare:x:128:peter
              vboxsf:x:999:peter
              test:x:1001:
            
/etc/group的格式也类似于/etc/passwd文件,各字段用冒号(:)分隔:
组名:口令:组标识号:组内用户列表
1."组名"是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
2."口令"字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
3."组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组。
4."组内用户列表"是属于这个组的所有用户的列表/b],不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读