/etc/group,/etc/gshadow释疑
你知道/etc/group的第二项是什么意思吗?这项中!和x分别代表什么意思呢?
之前我还真的没有注意到这个问题。于是先man group了一把,给出了的说明是
password the (encrypted) group password. If this field is empty, no password is needed.
从这个说明来看,应该是设置group的密码(之前我还不知道组也有密码一说)。但是现在这个说明太过于简单,比如没有提及到一些特别字符,比如!和x,而这些字符在/etc/passwd文件的第二项是有不同含义的。
google了一下,有找出了一个/etc/gshadow文件,到这里,我的猜测便认为/etc/group的方式和/etc/passwd的方式一致。第二项表示密码,如果是空的,表示没有密码,如果是x,表示该密码设置在对应的/etc/gshadow里。如果是!,应该表示禁止这个组。
于是我把我的理解告诉了welling,不过我说我没有时间来证明这点。
现在有时间,我又google了一下,找了一篇比较全面的文章,是北南南北兄的“用户(User)和用户组(Group)配置文件详解” ,他给出了这样的一个解释:
引用
root:x:0:root,linuxsir
注:用户组root,x是密码段,表示没有设置密码,GID是0,root用户组下包括root、linuxsir以及GID为0的其它用户(可以通过/etc/passwd查看);;
beinan:x:500:linuxsir 注:用户组beinan,x是密码段,表示没有设置密码,GID是500,beinan用户组下包括linuxsir用户及GID为500的用户(可以通过/etc/passwd查看);
linuxsir:x:502:linuxsir 注:用户组linuxsir,x是密码段,表示没有设置密码,GID是502,linuxsir用户组下包用户linuxsir及GID为502的用户(可以通过/etc/passwd查看);
helloer:x:503: 注:用户组helloer,x是密码段,表示没有设置密码,GID是503,helloer用户组下包括GID为503的用户,可以通过/etc/passwd查看;
这就和我前面的猜想有点不对了。为了搞清楚到底是怎么样的,还是用事实来证明比较好。
验证步骤如下:
1)用root帐号登录系统,先创建两个测试组group1,group2,然后创建两个不同的测试用户user1,user2,其中user1分别属于组group1,group2,而user2属于group2.
[root@dxs ~]# groupadd -g 1001 group1
[root@dxs ~]# groupadd -g 1002 group2
[root@dxs ~]# useradd -u 5001 -g 1001 -G 1001,1002 user1
[root@dxs ~]# useradd -u 5002 -g 1002 -G 1002 user2
[root@dxs ~]# tail -n 2 /etc/passwd
user1:x:5001:1001::/home/user1:/bin/bash
user2:x:5002:1002::/home/user2:/bin/bash
[root@dxs ~]# tail -n 2 /etc/group
group1:x:1001:user1
group2:x:1002:user1,user2
2)测试不同的/etc/group第二项设置而产生的不同结果。
首先,我们看看在默认值情况下,切换用户会发生什么情况:
[user1@dxs ~]$ touch first-user1-file
[user1@dxs ~]$ mkdir first-user1-dir
[user1@dxs ~]$ ls -lh
总用量 4.0K
drwxr-xr-x 2 user1 group1 4.0K 3月 12 20:04 first-user1-dir
-rwxr–r– 1 user1 group1 0 3月 12 20:04 first-user1-file
[user1@dxs ~]$ newgrp group2
[user1@dxs ~]$ touch second-user1-file
[user1@dxs ~]$ mkdir second-user1-dir
[user1@dxs ~]$ ls -ldh se*
drwxr-xr-x 2 user1 group2 4.0K 3月 12 20:10 second-user1-dir
-rw-r–r– 1 user1 group2 0 3月 12 20:09 second-user1-file
从这个结果来看,切换用户组后,并没有要求输入密码,同时通过创建文件和目录,可以知道的确已经切换帐号了。这里不要输入密码的原因应该是user1因为已经同时属于group1,group2两个组了,因此这仅仅是内部的一次切换,不要输入密码。
下面我们重点来看看user2
[root@dxs ~]# su – user2
[user2@dxs ~]$ id
uid=5002(user2) gid=1002(group2) groups=1002(group2)
[user2@dxs ~]$ touch first-user2-file
[user2@dxs ~]$ mkdir first-user2-dir
[user2@dxs ~]$ ls -ldh fi*
drwxr-xr-x 2 user2 group2 4.0K 3月 12 20:13 first-user2-dir
-rw-r–r– 1 user2 group2 0 3月 12 20:13 first-user2-file
[user2@dxs ~]$ newgrp group1
Password:
newgrp: Permission denied
这里要求输入密码,但是我们并没有设置group1的密码,所以无论输入什么都会告知权限不允许,而此时的/etc/group中对应的项是字母x,我们认为密码是在/etc/gshadow里,而又根据/etc/passwd的惯例,第一次创建帐号后,密码是锁定的,也就是无论你输入什么样的密码都不正确,所以这里的group1应该和也/etc/passwd同样的策略。那么,如果我们把这个位置设置为空,是否意味着可以不要输入密码呢?我们试试
[root@dxs ~]# tail -n 2 /etc/group
group1::1001:user1
group2:x:1002:user1,user2
[user2@dxs ~]$ newgrp group1
Password:
newgrp: Permission denied
还是需要你输入密码。直接敲回车也没有用。
再改成!,试试
[user2@dxs ~]$ newgrp group1
Password:
newgrp: Permission denied
还是不行。
这这点来看,无论这项如何设置,切换的时候都是需要密码的,那我我们就从/etc/gshadow上面着手看看。/etc/gshadow的第二项默认是!,我们分别改成x以及空字符看看效果(/etc/group的第二项保留为空)
[root@dxs ~]# grep ‘group1′ /etc/gshadow
group1:::user1
[user2@dxs ~]$ newgrp group1
newgrp: Permission denied
[root@dxs ~]# grep ‘group1′ /etc/gshadow
group1:x::user1
[user2@dxs ~]$ newgrp group1
Password:
newgrp: Permission denied
从这个实验来看似乎为空的时候直接就禁止了,没有给你输入密码的机会,而如果是x,则和!没有区别。
那我们试试有密码的情况是如何的:
[root@dxs ~]# gpasswd group1
Changing the password for group group1
New Password:(here input password abc123)
Re-enter new password:(same to above)
[root@dxs ~]# grep ‘group1′ /etc/gshadow
group1:XMjSjdI/JIo5E::user1
很明显已经设置了组group1的密码。我们再切换试试
[root@dxs ~]# su – user2
[user2@dxs ~]$ id
uid=5002(user2) gid=1002(group2) groups=1002(group2)
[user2@dxs ~]$ newgrp group1
Password:
[user2@dxs ~]$ pwd
/home/user2
[user2@dxs ~]$ mkdir second-user2-dir
[user2@dxs ~]$ touch second-user2-file
[user2@dxs ~]$ ls -ldh *
drwxr-xr-x 2 user2 group2 4.0K 3月 12 20:13 first-user2-dir
-rw-r–r– 1 user2 group2 0 3月 12 20:13 first-user2-file
drwxr-xr-x 2 user2 group1 4.0K 3月 12 20:30 second-user2-dir
-rw-r–r– 1 user2 group1 0 3月 12 20:30 second-user2-file
[user2@dxs ~]$ id
uid=5002(user2) gid=1001(group1) groups=1002(group2)
这这个结果来看,我们通过输入正确的密码切换了组,通过创建文件和目录可以印证这点。id命令更能清除的看到这点,user2的gid由之前的1002(group2)变成了1001(group1)。
从这里总结来看是这样的
1)/etc/group文件的第二项表示密码,密码默认设置在/etc/gshadow文件文件。该项不存在特殊字符。
2)/etc/gshadow的第二项保存对应组的密码,切换时需要提供该密码。当该项为空时,直接禁止组切换,如果是!,x这样的字符,提供密码输入机会,但是无法切换,实际上他认为组的密码的密文是!或者x,因此!,x在这里也不是特殊字符了。
在要结束测试的时候,在google发现有一个帖子这样描述unix下的/etc/group文件中的第二项:
引用
Password Not used. Group administrators are provided instead of group passwords. See the /etc/security/group file for more information.
于是到linux下对应的目录看了看,group文件是没有,但是group.conf文件确有。默认里面只有注释。
这个文件属于pam包的,那也就意味着他与插入式认证有关。找到一段相关说明,大家可以看看:
引用
这个模块根据用户名和发起服务请求的终端,提供组分类功能。
这个模块不对用户进行验证,而是为用户赋予组成员关系。这种组成员关系是根据用户请求的服务划分的,在/etc/security/group.conf文件中以文本的方式设置。
* 示例和建议
想要这个模块正常工作,需要准确设置/etc/security/group.conf文件。其格式如下:
services; ttys; users; times; groups
前四项和pam_time配置文件:/etc/security/pam_time.conf或者time.conf中的相同。groups是一些以逗号或者空格分开的文本字符串,表示一些组名。如果用户的应用程序满足前四项,则用户就被加入到第五项定义的组中。
这个模块能否起作用取决于用户对文件系统的访问权限。这一点是指,一旦用户成为一个组的成员,这个用户就可能利用获得的权限试图建立一个 setgid程序。而以后,如果这个用户不再属于这个组,他就可以通过这个程序非法回到这个组中。由于这个原因,用户具有写权限的文件系统需要非常严格的限制,如果文件系统在mount时,被设置为nosuid,那用户就无法建立和执行这样的程序。因此,使用这个模块时,用户具有写权限的所有文件系统都需要使用nosuid参数mount。
pam_group的作用和/etc/group文件是并行的,如果用户被加入的这个模块定义的任何组中,同时也被加入到/etc/group文件中;反之亦然。
ok,group的问题先告一段落,再遇到问题,在研究。感谢welling向我提出的这个问题,又让我对/etc/group多了解了一层。
没有评论▼