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


Linux 系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先, 他必须要在计算机前面利用 tty1~tty6 的终端机提供的 login 接口,并输入账号与密码后才能够登入。 如果是透过网络的话,那至少使用者就得要学习 ssh 这个功能了 (服务器篇再来谈)。 那么你输入账 号密码后,系统帮你处理了什么呢?
用户在登录linux的时候,login登录进程会去/etc/passwd文件查找和正在登录用户匹配的用户信息,包括UID、GID、用户家目录、登录shell等;
然后将用户输入的口令密码和/etc/shadow文件中记录的用户口令密码进行比较,如果密码匹配正确,就会开启登录shell进程,将登录shell提供给用户。
上面就是简单的登录过程描述,涉及到两个重要的系统账号文件,一个是记录用户账号信息的/etc/passwd文件, 一个则是记录用户账号密码信息的/etc/shadow文件!
在Linux系统中,默认情况下,系统上包括超级用户root在内的所有用户账号信息都记录在/etc/passwd文件中。 每个账号的口令密码记录在/etc/shadow文件中。所有的用户组信息都纪录在/etc/group文件内! 下面即将要介绍的账号管理命令,包括用户和用户组的添加、修改、删除,其实就是通过修改这三个文件而实现的。 这三个文件都是系统的重要文件,不能随便修改和删除。 文件中的每个字段都有对应的修改命令,所以不要随便用vim等文本编辑器编辑这些文件,而是应该用对应的命令进行编辑。

1./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
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:105:111::/run/uuidd:/usr/sbin/nologin
cups-pk-helper:x:106:112:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
avahi-autoipd:x:109:114:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
usbmux:x:110:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
systemd-coredump:x:111:117:systemd core dump processing,,,:/run/systemd:/usr/sbin/nologin
lightdm:x:112:118:Light Display Manager:/var/lib/lightdm:/bin/false
dnsmasq:x:113:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
saned:x:114:121::/var/lib/saned:/usr/sbin/nologin
nm-openvpn:x:115:122:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
avahi:x:116:123:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
colord:x:117:124:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
speech-dispatcher:x:118:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
pulse:x:119:125:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
hplip:x:120:7:HPLIP system user,,,:/var/run/hplip:/bin/false
geoclue:x:121:127::/var/lib/geoclue:/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系统(如SVR4)都使用了shadow技术,把真正加密后的用户口令字存放到/etc/shadow文件中, 而/etc/passwd文件中的口令字段只存放一个特殊的字符,例如“x”或者“*”。
3.用户ID号UID 虽然在登录Linux的时候,输入的是用户账号名,但是其实在Linux内部是使用ID来标识一个用户的.至于账号只是为了让人们容易记忆而已。 UID是一个整数,在系统内部用来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户, 但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。
通常用户ID号的取值范围是0~65535。超级用户root的ID号为0,1~999由系统保留,作为管理账号,普通用户的标识号从1000开始。在Linux系统中,这个界限是500。
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
什么是linux命令
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。 有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
系统中有一类用户称为伪用户(pseudo users)。
这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。
常见的伪用户如下所示:
伪 用 户 含 义
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:::
sync:*:18106:0:99999:7:::
games:*:18106:0:99999:7:::
man:*:18106:0:99999:7:::
lp:*:18106:0:99999:7:::
mail:*:18106:0:99999:7:::
news:*:18106:0:99999:7:::
uucp:*:18106:0:99999:7:::
proxy:*:18106:0:99999:7:::
www-data:*:18106:0:99999:7:::
backup:*:18106:0:99999:7:::
list:*:18106:0:99999:7:::
irc:*:18106:0:99999:7:::
gnats:*:18106:0:99999:7:::
nobody:*:18106:0:99999:7:::
systemd-network:*:18106:0:99999:7:::
systemd-resolve:*:18106:0:99999:7:::
syslog:*:18106:0:99999:7:::
messagebus:*:18106:0:99999:7:::
_apt:*:18106:0:99999:7:::
uuidd:*:18106:0:99999:7:::
cups-pk-helper:*:18106:0:99999:7:::
kernoops:*:18106:0:99999:7:::
rtkit:*:18106:0:99999:7:::
avahi-autoipd:*:18106:0:99999:7:::
usbmux:*:18106:0:99999:7:::
systemd-coredump:*:18106:0:99999:7:::
lightdm:*:18106:0:99999:7:::
dnsmasq:*:18106:0:99999:7:::
saned:*:18106:0:99999:7:::
nm-openvpn:*:18106:0:99999:7:::
avahi:*:18106:0:99999:7:::
colord:*:18106:0:99999:7:::
speech-dispatcher:!:18106:0:99999:7:::
pulse:*:18106:0:99999:7:::
hplip:*:18106:0:99999:7:::
geoclue:*: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:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:peter
floppy:x:25:
tape:x:26:
sudo:x:27:peter
audio:x:29:pulse
dip:x:30:peter
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:peter
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
systemd-journal:x:101:
systemd-network:x:102:
systemd-resolve:x:103:
input:x:104:
crontab:x:105:
syslog:x:106:
messagebus:x:107:
netdev:x:108:
mlocate:x:109:
ssl-cert:x:110:
uuidd:x:111:
lpadmin:x:112:peter
rtkit:x:113:
avahi-autoipd:x:114:
ssh:x:115:
bluetooth:x:116:
systemd-coredump:x:117:
lightdm:x:118:
nopasswdlogin:x:119:
scanner:x:120:saned
saned:x:121:
nm-openvpn:x:122:
avahi:x:123:
colord:x:124:
pulse:x:125:
pulse-access:x:126:
geoclue:x:127:
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次阅读