Linux中文件的SUID、SGID、Sticky权限说明

一、SUID  shell

    首先咱们要了解,在Linux中启动一个程序或者启动一个进程是须要有用户的,一个文件的存在是要有用户和组的,一个进程启动后,它的属主取决于进程的发起者,好比 我用root用户启动了一个 cat 进程,那么cat 进程的属主就是root,同理我用user1启动more进程,more进程对应的属主就是user1。其次,一个可执行文件或者一个程序是否能启动为进程,取决于它的发起者是否拥有可执行的权限。那么问题来了,普通用户对文件有可执行的权限,可是对其配置文件 或者做用于其余文件没有权限怎么办?好比普通用户要修改本身的密码,修改密码就要用到passwd这个命令对吧,可是passwd这个命令它会把密码写到/etc/shadow,可是/etc/shadow这个文件只有root用户可以写,那么普通用户怎么把本身的密码写到/etc/shadow里的呢?这时咱们就要说下SUID的做用了。SUID它主要做用是设置了suid的可执行二进制文件在启动为进程后,其进程的属主不在是启动二进制可执行文件的用户,而是二进制文件自己的属主,也就是说设置了SUID权限的可执行二进制文件在启动为进程后,其进程属主不在取决于发起者了,也就是说无论那个用户去启动它 ,其进程都是其可执行二进制文件的属主。好比咱们给/bin/cat 设置SUID后 无论那个用户均可以用cat查看root有查看权限,而普通用户没有查看权限的文件,也就说当其余用户执行cat这个二进制可执行文件时,系统会默认把权限识别成root用户,当普通用户用cat去查看一个本身没有查看权限的文件时,系统会认为是root在查看这个文件,全部当咱们给/bin/cat设置了SUID后,其余用户在用cat命令时 都会临时变成root用户。也就是由于这样 普通用户就能够才看本身自己没有查看权限的文件。安全

设置SUID的文件要求有以下几点:bash

  1. SUID只对可执行的二进制文件起做用,shell脚本设置后不生效。
  2. 若是设置了其suid后,其属主位的能够执行权限x会变成s(小写),若是是大写S 那么说设置的文件没有可执行权限,设置的SUID无效。
  3. SUID对目录设置无心义。

SUID设置方法:ui

      字母设置方式:chmod u+s file spa

      取消SUID:chmod u-s file  blog

      数字设置方式:chmod 4755 在普通三位数字权限位以前,4表明添加的SUID继承

      取消SUID:chmod 0755进程

作个小验证,就拿咱们上面说的给cat命令对应的可执行二进制文件设置SUIDrem

[user2@test project]$ whoami
user2
[user2@test project]$ ll /etc/shadow
---------- 1 root root 1043 Oct 23 13:41 /etc/shadow
[user2@test project]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

  提示:咱们能够看到在没有设置SUID的状况下 ,普通用户更不就不能对/etc/shadow 进行查看的it

给cat 设置SUID

[root@test project]# whoami
root
[root@test project]# which cat
/bin/cat
[root@test project]# ll /bin/cat
-rwxr-xr-x. 1 root root 47976 Nov 22  2013 /bin/cat
[root@test project]# chmod u+s /bin/cat
[root@test project]# ll /bin/cat
-rwsr-xr-x. 1 root root 47976 Nov 22  2013 /bin/cat

  提示:给文件设置suid必须是文件的属主,这里cat是root全部要用root去设置SUID,设置了suid后其文件对应的属主可执行为位上的x会变成s,若是是大写S表示文件没有可执行权限,设置SUID无效。

用普通用户去使用cat命令查看普通用户没有查看权限的文件

[user2@test project]$ whoami
user2
[user2@test project]$ ll /etc/shadow
---------- 1 root root 1043 Oct 23 13:41 /etc/shadow
[user2@test project]$ cat /etc/shadow
root:$6$ue2dy8rF$pW5rghiycQ1MFycSq0jjRfgb2wIXFm9Jl0h9hqNWfHOCX8NdHXW1HpN0Eb2q40Aw/kmQAUldxZsVQD504iv6c.:17685:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
halt:*:15980:0:99999:7:::
mail:*:15980:0:99999:7:::
uucp:*:15980:0:99999:7:::
operator:*:15980:0:99999:7:::
省略部份内容...

二、SGID

    SGID属性同SUID同样,只是SUID做用于属主,而SGID做用于属组,SGID做用在二进制程序上时,执行权限的程序时此用户将继承此程序的所属组权限,做用于目录上时,此文件夹下全部用户新建文件都自动继承此目录的用户组。一样在设置SGID的文件后,其组权限位上的可执行权限x会变成s,若是变成了S 说明其组权限位上没有可执行权限,设置SGID无效。

不设置SGID普通用户查看无权限查看的文件(仍是以上面cat的例子)

[root@test project]# ll
total 4
----r----- 1 root root 16 Oct 23 16:13 a.root
[root@test project]# ll /bin/cat
-rwxr-xr-x. 1 root root 47976 Nov 22  2013 /bin/cat
[root@test project]# whoami
root
[root@test project]# cat a.root 
iamroot
iamroot
[root@test project]# su - user1
[user1@test ~]$ whoami
user1
[user1@test ~]$ cd /tmp/project/
[user1@test project]$ ll
total 4
----r----- 1 root root 16 Oct 23 16:13 a.root
[user1@test project]$ cat a.root 
cat: a.root: Permission denied
[user1@test project]$ 

设置SGID后普通用户才看本身没有查看权限的文件

[user1@test project]$ su -
Password: 
[root@test ~]# whoami
root
[root@test ~]# ll /bin/cat
-rwxr-xr-x. 1 root root 47976 Nov 22  2013 /bin/cat
[root@test ~]# chmod g+s /bin/cat
[root@test ~]# ll /bin/cat
-rwxr-sr-x. 1 root root 47976 Nov 22  2013 /bin/cat
[root@test ~]# su - user1
[user1@test ~]$ cd /tmp/project/
[user1@test project]$ ll
total 4
----r----- 1 root root 16 Oct 23 16:13 a.root
[user1@test project]$ whoami
user1
[user1@test project]$ cat a.root 
iamroot
iamroot

  提示:设置SGID的方式和SUID的方式同样 只是SUID做用于user位,SGID做用于group。因此chmod g+s file 或者chmod g-s 数字表示法是 chmod 2755 file 在普通三位数字权限位以前,2表明添加的SGID

SGID做用于目录上时,此文件夹下全部用户新建文件都自动继承此目录的用户组

在不设置SGID的目录下建立文件,文件的属主和属组 默认是该用户。

[user1@test project]$ ll -d 
drwxrwxr-x 2 root test 4096 Oct 23 19:53 .
[user1@test project]$ mkdir test
[user1@test project]$ touch user1
[user1@test project]$ ll
total 8
----r----- 1 root  root    16 Oct 23 16:13 a.root
drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test
-rw-rw-r-- 1 user1 user1    0 Oct 23 19:54 user1

  提示:能够看出在没有设置SGID的状况下,在其目录下建立文件或目录时,文件和目录默认属组是其建立者,它不继承其父目录的属组。

给目录设置SGID,而后在其目录下建立文件和目录,其文件和目录继承父目录属组权限

[user1@test project]$ ll -d .
drwxrwxr-x 3 root test 4096 Oct 23 19:54 .
[user1@test project]$ su - root
Password: 
[root@test ~]# whoami
root
[root@test ~]# cd /tmp/project/
[root@test project]# ll -d
drwxrwxr-x 3 root test 4096 Oct 23 19:54 .
[root@test project]# chmod g+s /tmp/project/
[root@test project]# ll /tmp/project/ -d
drwxrwsr-x 3 root test 4096 Oct 23 19:54 /tmp/project/
[root@test project]# mkdir test1
[root@test project]# touch user11
[root@test project]# ll
total 12
----r----- 1 root  root    16 Oct 23 16:13 a.root
drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test
drwxr-sr-x 2 root  test  4096 Oct 23 19:59 test1
-rw-rw-r-- 1 user1 user1    0 Oct 23 19:54 user1
-rw-r--r-- 1 root  test     0 Oct 23 19:59 user11
[root@test project]# 

  提示:从上面的示例能够得出,在咱们设置SGID后,其组权限位上的执行权限x变成了s(小写),他和SUID同样,若是其组权限位上的可执行权限位变成了大写的S ,表示其目录组权限位上原来是没有执行权限,固然咱们设置的SGID也是无效的。其次就是咱们给目录设置了SGID后,在其目录下建立文件或目录都会继承其父目录的组权限,也就是说我父目录设置了SGID,其组权限对应的是test,那么其余用户在其目录下建立文件都属于test这个组里的,同时拥有test组权限。

3.Sticky

前面咱们说了SUID和SGID,接下来咱们再说下Sticky,这个权限的主要做用是在一个公共目录,每一个用户均可以建立文件,删除本身的文件,可是不能删除别人的文件。这个权限只能用于目录,当某个目录拥有其Sticky权限 ,则其目录下的文件和目录只有root和其拥有者删除,其余用户不能删除,也就是说用户只能删除其本身自己属主的文件,不能删除其余属主的文件。若是一个目录设置了其sticky权限,则其目录其余用户组的执行权限x会变成t(小写),它和SUID、SGID同样若是对应位是位上的可执行x变成了大写T ,那么表示其目录其余用户位上没有可执行权限,固然设置的Sticky就无效。固然设置方法和SUID、SGID同样 都是用chmod命令来设置,只是Sticky做用于目录的其余用户位,字母设置方法 chmod o+t dir ,取消 chmod o-t dir 数字设置方法:chmod 1755(1表示Sticky) 固然取消就把其数字改写成0.

不设置Sticky,删除目录里文件

[root@test ~]# su - user1
[user1@test ~]$ whoami
user1
[user1@test ~]$ cd /tmp/project/
[user1@test project]$ ll -d
drwxrwsr-x 4 root test 4096 Oct 23 19:59 .
[user1@test project]$ ll
total 12
----r----- 1 root  root    16 Oct 23 16:13 a.root
drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test
drwxr-sr-x 2 root  test  4096 Oct 23 19:59 test1
-rw-rw-r-- 1 user1 user1    0 Oct 23 19:54 user1
-rw-r--r-- 1 root  test     0 Oct 23 19:59 user11
[user1@test project]$ rm -fr *
[user1@test project]$ ll
total 0
[user1@test project]$ 

  提示:能够看出咱们普通用户是能够随意删除去不是本用户属主的文件,这样会致使一个问题,就是在一个公共的目录下,每一个用户的文件不安全,由于每一个人均可以去删除。

设置Sticky,删除其下的目录和文件

[user1@test project]$ mkdir test
[user1@test project]$ touch user1
[user1@test project]$ su -
Password: 
[root@test ~]# cd /tmp/project/
[root@test project]# mkdir root1
[root@test project]# touch root12
[root@test project]# ll
total 8
drwxr-sr-x 2 root  test 4096 Oct 23 20:27 root1
-rw-r--r-- 1 root  test    0 Oct 23 20:27 root12
drwxrwsr-x 2 user1 test 4096 Oct 23 20:26 test
-rw-rw-r-- 1 user1 test    0 Oct 23 20:26 user1
[root@test project]# ll -d
drwxrwsr-x 4 root test 4096 Oct 23 20:27 .
[root@test project]# chmod o+t .
[root@test project]# ll -d
drwxrwsr-t 4 root test 4096 Oct 23 20:27 .
[root@test project]# su - user1
[user1@test ~]$ cd /tmp/project/
[user1@test project]$ ll
total 8
drwxr-sr-x 2 root  test 4096 Oct 23 20:27 root1
-rw-r--r-- 1 root  test    0 Oct 23 20:27 root12
drwxrwsr-x 2 user1 test 4096 Oct 23 20:26 test
-rw-rw-r-- 1 user1 test    0 Oct 23 20:26 user1
[user1@test project]$ rm -fr root*
rm: cannot remove `root1': Operation not permitted
rm: cannot remove `root12': Operation not permitted
[user1@test project]$       

  提示:能够看出当咱们给公共目录设置了Sticky属性后,其普通用户是不能删除其属主不是本身自己的文件。Sticky属性只针对目录,对其文件不生效。

经过以上的示例得出几点:

    一、在给文件或目录设置特殊权限时,其文件对应位上必须拥有可执行权限,不然设置特殊全无效。若是对应位上没有可执行权限,设置了特殊权限会在对应位上显示大写的字母,表示其特殊权限无效。

    二、SUID只能做用于可执行的二进制文件,对目录无效。SGID可做用于可执行二进制文件和目录,Sticky只能做用于目录,对文件无效。

    三、都是用chmod 进行受权。对于SUID和SGID都是+-s ,对于Sticky是+-t ,其中SUDI对应user位,SGID对应group位,Sticky对应other位,数字表示法,4表示SUID,2表示SGID,1表示Sticky。

相关文章
相关标签/搜索