本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用.linux
为何要使用特殊权限?vim
好比系统中假若有超过四类人然而每一类人都须要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.centos
特殊权限能够扩展系统基础权限的功能,使得linux权限更增强大灵活.安全
在理解特殊权限以前,须要先具有几个关于安全上下文的认知:app
前提:进程有属主和属组;文件有属主和属组;编辑器
(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限;测试
(2) 启动为进程以后,其进程的属主为发起者;进程的属组为发起者所属的组;ui
(3) 进程访问文件时的权限,取决于进程的发起者:centos7
(a) 进程的发起者,同文件的属主:则应用文件属主权限;spa
(b) 进程的发起者,属于文件的属组;则应用文件属组权限;
(c) 应用文件“其它”权限;
chmod u+s FILE...
chmod u-s FILE...
chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无心义)
在普通三位数字权限位以前,用4表明添加的SUID位
chmod 0xxx .... 能够删除文件的SUID(没法删除目录的SUID)
# ll f1 -rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1
文件属主的x权限,用s代替.表示被设置了SUID
若是属主位没有x权限,会显示为大写S,表示有故障(权限无效)
passwd命令是linux系统中用来修改密码的命令.系统中全部用户均可以使用.
而passwd命令改密码的行为是经过修改/etc/shadow文件来实现.
看一下/etc/shadow的文件权限:
# ll /etc/shadow ----------. 1 root root 1771 Nov 16 17:06 /etc/shadow
可见/etc/shadow对普通用户没有任何权限.
因此普通用户默认没法使用文本编辑器打开或者编辑这个文件.
那为何经过passwd这个命令就能够编辑呢?
用ls命令查看passwd命令的源文件信息:
# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd
咱们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.
因而普通用户运行passwd命令,系统建立的passwd进程的属主由默认为"程序发起者"变为了passwd的属主
而passwd的属主是root,因此普通用户实际上是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭.
给命令vim添加SUID,可让普通用户本身把本身变为超级用户.
看一下vim的原权限
#ll /usr/bin/vim -rwxr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim
给vim加个SUID
# chmod u+s /usr/bin/vim
权限变为
-rwsr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim
如今用普通用户登陆
# su quintin
尝试使用vim编辑系统帐户文件/etc/passwd
$ vim /etc/passwd
找到本身的用户名一行
修改第三列本身的uid为0
root的uid不用改.
而后保存,提示只读文件,使用w!强制保存,成功!
咱们知道普通用户quintin对vim是有执行权限的,而对/etc/passwd则没有编辑权限.
一般状况下quintin启动vim后,系统会建立一个以当前用户quintin为属主属组的vim进程,
此时vim进程的属主属组为quintin:quintin,因为不管是属主仍是属组都不具备对/etc/passwd的编辑权限,
因此这个vim进程无权编辑/etc/passwd.
而给/usr/bin/vim设置了SUID以后,quintin或任何用户启动vim程序时,
系统建立的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root,
因此此时vim进程的属主属组为root:quintin. 系统检查发现正好匹配了/etc/passwd的属主,因而放行vim进程.
其余文本编辑器同理.
退出vim并从新登录quintin账户
这时发现命令提示符已彻底变为root,并且系统认为我就是root
由于linux只经过uid判断超级管理员,而quintin账户把本身的uid变成了超级管理员同样的0,
因此从新登录以后,quintin具备了root的身份.
测试:
找一个属主属组都为root且other位无w的文件
# ll /app/f11 -rw-r--r--. 1 root root 0 Nov 17 20:18 f11
改个名字
# mv f11 f1
成功.
chmod g+s DIR/FILE...
chmod g-s DIR/FILE...
chmod 2755 DIR/FILE 添加SGID到目录或文件
在普通数字权限位前,用2表明添加SGID位
chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)
chmod 755 DIR/FILE 同上
# ll /app/f1 -rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1
文件属组的x权限,用s代替.表示被设置了SGID
若是属组位没有x权限,会显示为大写S,表示有故障(权限无效)
执行sgid权限的程序时,此用户将继承此程序的所属组权限
此文件夹下全部用户新建文件都自动继承此目录的用户组.
普通账户quintin在/tmp中建立一个目录叫quintindir,添加SGID.权限777
$ chmod 2777 quintindir/ $ ll -d quintindir/ drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/
切换到普通用户user1,在quintindir目录中建立一个文件和一个目录
$ touch user1file $ mkdir user1dir $ ll -rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir
结果显示,user1在quintindir目录下建立的文件和目录都自动继承了quintindir的属组
并且新目录的权限也继承了SGID.
因此设定了SGID的目录中的全部新建文件和目录都会自动属于quintin组.
chmod o+t DIR...
chmod o-t DIR...
chmod +t DIR...
chmod 1755 DIR
在普通数字权限位前,用1表明添加Sticky位
# ll -d tmp drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp
文件other位的x权限,用t代替.表示被设置了Sticky
若是other位没有x权限,会显示为大写T,表示有故障(权限无效)
我但愿在系统中建立一个不少用户能够共同使用的目录,可是要求用户之间不能互相删除改变对方的文件.
root用户先建立一个777权限目录/app/tmp
普通用户quintin和wang分别在其中建立几个文件和目录
这时候有个问题,就是目录中的任何用户均可以随意删除其余人的文件.
因此root要给/tmp这个文件夹设定一个Sticky位.
# chmod 1777 tmp # ll -d tmp drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp
设定完毕可见目录tmp的other权限中的x位已经显示为t.说明已设定成功.
切换到quintin用户,进入/app/tmp目录
尝试删除或更名用户wang的文件或目录
更名文件
[quintin@centos7 /app/tmp]$ mv wangf1 aaa mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted
更名目录
[quintin@centos7 /app/tmp]$ mv wangd1 bbb mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted
移动文件
[quintin@centos7 /app/tmp]$ mv wangf1 qdir1/ mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted
删除文件
[quintin@centos7 /app/tmp]$ rm -f wangf1 rm: cannot remove ‘wangf1’: Operation not permitted
删除目录
[quintin@centos7 /app/tmp]$ rm -f wangf1 rm: cannot remove ‘wangf1’: Operation not permitted
以上全部操做均提示Operation not permitted,表明Sticky权限已发挥做用.
普通用户在设定了Sticky位的目录下建立的子目录不会继承这个Sticky权限,因此要注意设定好本身目录的权限.
此用户将继承此程序的全部者权限
此用户将继承此程序的所属组权限.
此文件夹下全部用户新建文件都自动继承此目录的用户组.
设定后,目录中的用户只能删除、移动或更名本身的文件或目录
|
二进制文件 |
目录 |
SUID |
此用户将继承此程序的全部者权限 |
无心义 |
SGID |
此用户将继承此程序的所属组权限 |
此目录下全部用户新建文件都自动继承此目录的用户组 |
Sticky |
无心义 |
目录中每一个用户仅能删除、移动或更名本身的文件或目录 |
chmod u+s ... 添加SUID
chmod g+s ... 添加SGID
chmod +s ...同时添加SUID和SGID
chmod -s ...同时删除SUID和SGID
chmod o+t ...添加Sticky
chmod +t ...同上
chmod 0755 FILE
chmod 755 FILE
对于文件,会删除掉原有的其余超级权限.
对于目录,添加SUID或SGID时,Sticky会被删除.
SUID: user, 占据属主的执行权限位;
s: 属主拥有x权限
S:属主没有x权限
SGID: group, 占据group的执行权限位;
s: group拥有x权限
S:group没有x权限
Sticky: other, 占据ohter的执行权限位;
t: other拥有x权限
T:other没有x权限