SUID, SGID, Sticky特殊权限
安全上下文
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
1、可执行文件上SUID权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义
suid会在所属用户权限本应是x的地方显示s;
设置suid权限,只需在文件当前数字权限前面加4
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
权限设定:
chmod u+s FILE...
chmod u-s FILE...
案例说明:普通用户执行passwd命令修改自己的密码。
首先查看passwd命令的绝对路径:
[root@localhost ~]# which passwd
/usr/bin/passwd
查看passwd命令权限,发现passwd的拥有者是root,且拥有者权限里面本应是x的那一列显示的是s,这说明这个命令具有SUID权限。
同时发现普通用户没有w权限,所以按理来说普通用户是不能执行这个命令的,因为这个命令修改了密码肯定是要写文件的。
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
进一步分析,实际上passwd这个命令会操作/etc/shadow这个文件,因为密码都是放在这里,查看密码文件权限:发现权限是000!
注意:root用户对所有文件都是有rw权限的,对所有目录都是有rwx权限的,这意味着普通用户确实不能独读或写这个文件。
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1205 Nov 3 10:54 /etc/shadow
不过因为passwd命令具有SUID权限,所以普通用户执行这个命令时,当系统生成对应的进程后,这个进程就拥有了/usr/bin/passwd文件拥有者root的权限。
[root@localhost ~]# su - wangshibo
Last login: Thu Nov 3 10:53:38 CST 2016 on pts/0
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[wangshibo@localhost ~]$
如果将/usr/bin/passwd文件的suid权限收回,则普通用户就不能修改自己的密码了。
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@localhost ~]# chmod 755 /usr/bin/passwd # 或者chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@localhost ~]# su - wangshibo
Last login: Thu Nov 3 11:03:34 CST 2016 on pts/0
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
New password:
Retype new password:
passwd: Authentication token manipulation error
[wangshibo@localhost ~]$
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
在上面要输入密码的时候,按ctrl+z挂起。然后接着输入pstree -u命令,如下,发现passwd的权限确实是root,而不是wangshibo!
[wangshibo@localhost ~]$ pstree -u
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon(dbus)───{dbus-daemon}
├─dnsmasq(nobody)───dnsmasq(root)
├─epmd(epmd)
├─gssproxy───5*[{gssproxy}]
├─ipmievd
├─irqbalance
├─ksmtuned───sleep
├─lvmetad
├─master─┬─pickup(postfix)
│ └─qmgr(postfix)
├─polkitd(polkitd)───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───su───bash(wangshibo)
│ └─sshd───bash───su───bash(wangshibo)─┬─passwd(root)
│ └─pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─wpa_supplicant
2、目录和可执行文件上的SGID权限
默认情况下,用户创建文件时,其属组为此用户所属的主组
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录
针对文件的话,sgid只对二进制程序有用;程序执行着要有x权限;执行者在执行过程中会获得改程序用户组的权限(相当于临时加入了程序的用户组)
sgid会在所属用户组权限本应是x的地方显示s;
sgid针对目录的话:用户对此目录有rx权限可以进入目录,用户进入此目录后,有效用户组会变成该目录的用户组;若用户在此目录有w权限,则用户创建的文件用户组与该目录用户组相同。
权限设定:
chmod g+s DIR...
chmod g-s DIR...
chmod g+s FILE...
chmod g-s FILE...
SGID: group,占据属组的执行权限位
s:group拥有x权限
S:group没有x权限
针对文件案例说明:普通用户使用locate命令(yum install mlocate,之后就会有locate命令)
[root@localhost src]# which locate
/usr/bin/locate
[root@localhost src]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
发现/usr/bin/locate文件中用户组权限中应该出现x的位置显示的s,表示这个locate命令具有sgid权限,而普通用户只有x权限而没有rw权限。
locate这个命令,实际上会去访问/var/lib/mlocate/mlocate.db这个文件。如下可知:
这个mlocate.db文件对于普通用户没有任何权限,所以理论上普通用户执行locate命令是不行的。
不过因为locate命令有sgid权限,所以运行locate生成进程时,这个进程会得到locate命令的用户组权限,相当于wangshibo这个用户被临时加入了用户组slocate。
于是就对mlocate.db这个文件有了r权限,可以访问了!
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 4238642 Nov 3 11:51 /var/lib/mlocate/mlocate.db
针对目录案例说明:
如果一个团队想要在linux某个目录(比如/home/project)下协同工作来做一个项目,那么每个团队成员都得对这个project目录下的所有文件具有rwx权限。
实现方法:
1)创建一个用户组(比如work),再创建几个账号(比如wangshibo、guohuihui),将创建的账号加入到那个创建的用户组内。
2)把/home/project目录权限设为770,把这个目录的用户组改为work用户组
3)将/home/project目录设置sgid权限。
4)这样就可以实现,/home/project目录下,work组内任意一个用户创建文件,文件所属组都会是这个目录的用户组(即work)。
5)这样的话,所有work组内的用户在/home/project目录下创建的文件,其他同组用户都有权限操作。
[root@localhost home]# groupadd work
[root@localhost home]# gpasswd -a guohuihui work
Adding user guohuihui to group work
[root@localhost home]# usermod -G work wangshibo
[root@localhost home]# id guohuihui
uid=1002(guohuihui) gid=1002(guohuihui) groups=1002(guohuihui),1003(work)
[root@localhost home]# id wangshibo
uid=1001(wangshibo) gid=1001(wangshibo) groups=1001(wangshibo),1003(work)
[root@localhost home]# mkdir project
[root@localhost home]# ll -d project
drwxr-xr-x. 2 root root 6 Nov 3 12:03 project
[root@localhost home]# chmod 770 project
[root@localhost home]# ll -d project
drwxrwx---. 2 root root 6 Nov 3 12:03 project
[root@localhost home]# chgrp work project/
[root@localhost home]# ll -d project/
drwxrwx---. 2 root work 6 Nov 3 12:03 project/
[root@localhost home]# chmod g+s /home/project
[root@localhost home]# ll -d project/
drwxrws---. 2 root work 18 Nov 3 13:07 project/
接着来看下效果:现在在wangshibo账号下操作
[root@localhost ~]# su - wangshibo
[wangshibo@localhost ~]$ ll -d /home/project/
drwxrws---. 2 root work 6 Nov 3 13:10 /home/project/
[wangshibo@localhost ~]$ cd /home/project/
[wangshibo@localhost project]$ echo "123" > wangshibo.txt
[wangshibo@localhost project]$ ll wangshibo.txt #发现创建的文件的权限的所有者是work
-rw-rw-r--. 1 wangshibo work 4 Nov 3 13:11 wangshibo.txt
然后登陆guohuihui账号验证下,发现可以正常操作上面的wangshibo.txt文件。
[root@localhost ~]# su - guohuihui
[guohuihui@localhost ~]$ cd /home/project/
[guohuihui@localhost project]$ ll wangshibo.txt
-rw-rw-r--. 1 wangshibo work 4 Nov 3 13:11 wangshibo.txt
[guohuihui@localhost project]$ echo "guohuihui123123" > wangshibo.txt
[guohuihui@localhost project]$ cat wangshibo.txt
guohuihui123123
[guohuihui@localhost project]$ touch guohuihui.txt
[guohuihui@localhost project]$ ll
-rw-rw-r--. 1 guohuihui work 0 Nov 3 13:12 guohuihui.txt
-rw-rw-r--. 1 wangshibo work 16 Nov 3 13:12 wangshibo.txt
3、Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
权限设定:
chmod o +t DIR...
chmod o -t DIR...
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
例如:
ls -ld /tmp
drwxrwxrwt 12 root root 4096 Nov 215:44 /tmp