/etc/passwd、/etc/shadow、/etc/group详解
Linux系统中每个用户的信息,包括用户名、密码以及所属组等都会被存储在/etc/passwd文件中。
类似的,/ect/group 文件存放用户组的所有信息。
一、 /etc/passwd
我们可以通过more /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
andy:x:1000:1000:andy:/home/andy:/bin/bash
文件内容比较规律,一行代表一个用户,每行有7个字段,字段之间用 冒号 : 分隔,字段含义从左往右依次是:
用户名、用户密码(x)、UID(用户的ID,唯一表示),GID(用户的初始组ID),一些说明(没用),用户的家目录,登录之后的shell
=》LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
1.用户名是登录时使用的名字,区分大小写,在同一个Linux操作系统中不允许重复,但是操作系统并不以它作为唯一标识字段,而是UID。
2.用户密码:你可能会发现用户密码都是同样的x。这是因为Linux出于系统安全考虑,为用户提供了MD5和Shadow安全密码服务(安装时可选,默认都有,建议有),把真正的密码(密文形式)放在了/etc/shadow文件里。因此,需要注意的是这三个文件对应的权限最好设置成:
/etc/passwd 644 /etc/group 644 /etc/shadow 000
如果/etc/shadow这个文件的权限发生了改变,则需要注意是否是恶意攻击。
3.UID是用户的唯一标识,系统是通过 UID 来识别不同的用户和分配用户权限的。你可能会有疑问,我明明只有一个root和一个普通(andy)用户,为什么这里有这么多个用户。其实只有UID>500的用户才是普通用户ID,UID<499的都是系统用户(也称为伪用户),是用来运行系统服务的,可以理解成是不能登录的,但是也不能删除的。
0是超级用户 UID。如果用户 UID 为 0,则代表这个账号是管理员账号。那么在 Linux 中如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
1~499:系统用户(伪用户)UID。这些 UID 是系统保留给系统用户的 UID,也就是说 UID 是 1~499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中,1~99 是系统保留的账号,系统自动创建;100~499 是预留给用户创建账号的。
500~65535:普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。
注意,其中很多的系统用户是攻击者入侵的常用入口,一定要熟悉他们,并注意密码域是否不为空。
adm拥有账号文件,起始目录/var/adm通常包括日志文件
bin拥有用户命令的可执行文件
daemon用来执行系统守护进程
games用来玩游戏
halt用来执行halt命令
lp拥有打印机后台打印文件
mail拥有与邮件相关的进程和文件
news拥有与usenet相关的进程和文件
nobody被NFS(网络文件系统)使用
shutdown执行shutdown命令
sync执行sync命令
uucp拥有uucp工具和文件
4.GID(Group ID):用户的初始组ID
所谓初始组,指用户一登录就立刻拥有这个用户组的相关权限。每个用户的初始组只能有一个,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。举例来说,我们手工创建用户 lamp,在创建用户 lamp 的同时就会自动创建一个 lamp 组作为 lamp 用户的初始组。
所谓附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组要把用户再加入其他的用户组外,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。比如,刚刚的 lamp 用户除属于初始组 lamp 外,我又把它加入了 users 组,那么 lamp 用户同时属于 lamp 组、users 组,其中 lamp 是初始组,users 是附加组。当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组。
5.一些说明的内容,可以省略,没什么影像。
6.用户的家目录,即登录后进入的~目录路径。root用户是/root,普通用户一般是/home/username
7.登录之后用的shell(可以理解成用户登录之后的所有权限或者不能登录)
比如:
/bin/bash 就代表这个用户可以登录,且登录后使用/bin/bash
/sbin/nologin就是禁止该用户登录。(如果我想要让某个具有 /sbin/nologin 的用户知道,他们不能登陆主机时,可以新建 /etc/nologin.txt 这个文件,在文件内面写上不能登陆的原因,当用户登录时,屏幕上就会出现这个文件里面的内容) 注:一般情况下我们要禁止ftp等用户登录。
/usr/bin/passwd则是该用户可以登录,但是登录之后只能使用passwd命令修改自身的密码,不能用其他的命令,如ls。
注意:工作中不建议直接修改/etc/passwd文件,而推荐使用相关的修改命令。
二、/etc/shadow
/etc/shadow虽然是/etc/passwd的影子文件,用来存储用户的真正密码数据,但是/etc/shadow并不是由/etc/passwd生成的,而是互相补充的关系。
root用户可以通过more /etc/shadow查看影子文件内容:
root:$6$rfOvmKlnnRFX/cB5$Jccj9ZeTrFJoTsz6oI.u6nnRKIeyxkRllD87WezlIYd.zP9tJGs1URLLtdVWbabeNO4u60oz59bvooycrQ3Aq.::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::
games:*:17110:0:99999:7:::
ftp:*:17110:0:99999:7:::
nobody:*:17110:0:99999:7:::
systemd-network:!!:18096::::::
dbus:!!:18096::::::
polkitd:!!:18096::::::
postfix:!!:18096::::::
sshd:!!:18096::::::
andy:$6$7ujSunxrBHuEijDv$uAMuLBmSDv9wd0hSTIbw5FjFal07A5yuDkXqGyMb78rER4mD8oCN1f4S58.Cmo26/MmRkxQgbpKOYObAB.MWG.:18096:0:99999:7:::
文件内容依然规律,一行对应一个用户,比较明显的区别是第二个字段不再是x而是一串密文。
9个字段从左往右依次是=》用户名:加密口令:上一次修改的时间(从1970年1月1日起的天数):两次修改口令间隔的最小天数:两次修改口令间隔的的最大天数:提前多少天警告用户口令将国企:口令过期之后多少天禁用用户:用户过期日期(从1970年1月1日起的天数):保留字段(目前为空)
1.用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;
2.密码(已被加密),这个字段是非空的;
3.上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;
4.两次修改口令间隔最少的天数;如果这个字段的值为空,帐号永久可用;
5.两次修改口令间隔最多的天数;如果这个字段的值为空,帐号永久可用;
6.提前多少天警告用户口令将过期;如果这个字段的值为空,帐号永久可用;
7.在口令过期之后多少天禁用此用户;如果这个字段的值为空,帐号永久可用;
8.用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;
9.保留字段,目前为空,以备将来发展之用;
三、/etc/group
/etc/group 文件是用户组的配置文件,通过more /etc/group命令查看文件内容
root:x:0:
bin:x:1:
...
...
andy:x:1000:andy
cgred:x:996:
docker:x:995:
文件中一行表示一个组,4个字段从左往右依次为:用户组(Group)、用户组口令、GID、该用户组所包含的用户=》group_name:passwd:GID:user_list
1.用户组名
2.用户组密码,和/etc/passwd一样是用x代替,真正的密码数据存放在/etc/gshadow中
3.GID 组的唯一标识,和/etc/passwd中的GID关联起来
4.用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
到此,已经梳理了/etc/passwd、/etc/shadow、/etc/group,它们之间的关系可以这样理解,先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow 文件中提取和这个用户相匹配的密码。