在上篇博客中叙述linux系统中文件的基本属性,见http://vinsent.blog.51cto.com/13116656/1951574,这篇给大家带来linux系统文件的特殊权限,包括SUID、SGID、Sticky(粘滞位)。


一、安全上下文

安全上下文指的是一类定义某个进程允许做什么的许可和权限的集合。安全上下文的概念范围很广范,权限、特权、访问令牌、完整性等级等等都包含在其中。这里只简要说说linux系统对文件的安全控制:

(1)进程有属主和属组,文件有属主和属组
      (2)任何一个可执行程序文件能不能启动为进程;取决于发起者对程序文件是否有执行权限

(3)启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属得组

(4)进程访问文件时的权限 ,取决于进程的发起者

    进程的发起者,同文件的属主:则使用文件属性权限

    进程的发起者,属于文件的属组;则使用文件属组权限

    使用的文件"其他"权限


二、文件的特殊权限

1、SUID

SUID的权限其实的相关性非常大,对普通文件和目录几乎没有什么用。SUID主要作用在二进制可执行文件上,且作用在文件的属主位,表现为小 S ,例如我们所熟悉的可执行程序 passwd:

[root@centos7 ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd #我们发现在属主位有s存在,这就代表具有SUID权限

SUID-特点

  • SUID权限仅对二进制程序有效

  • 执行者对于该程序需要具有 x 可执行权限

  • 本权限仅在执行该程序的过程中有效

  • 执行者具有该程序的所有者的权限

浅析:当其他用户在执行二进制可执行程序时,一旦该程序加了SUID权限,那么在执行该程序时将继承原二进制可执行程序属主的权限,上例中可执行程序/usr/bin/passwd的属主和属组均是root,如果没有SUID权限,那么普通用户在执行pswwd命令时将无法修改无法修改自己的账户密码,但实际生活中,每个普通用登录后都可以使用passwd并修改自己的密码,这就是因为有SUID权限在,普通用户暂时使用了root的权限。

整个SUID的权限会生效是由于具有该权限的程序被触发,二我们知道一个程序被触发会变成进程,所以,执行者可以具有程序所有者的权限就是在该程序变成进程的那个时候,进程的概念在后续的篇章中会详细说明。这就是为何执行了passwd后就具有root的权限,用户在触发passwd后,会取得一个新的得进程与PID。该PID产生是通过SUID给予该PID特殊的权限设置,例如我们使用vincent登录系统并且执行passwd后,查看进程树来理解一下!

[vincent@vincent ~]$
[vincent@vincent ~]$passwd  
Changing password for user vincent.
Changing password for vincent.
(current) UNIX password:     # 使用ctrl+z+enter,可以让passwd后台执行

[1]+  Stopped                 passwd
[vincent@vincent ~]$pstree -u   #查看进程树
init─┬─NetworkManager─┬─dhclient
     │                └─{NetworkManager}
...................# 省略中间部分
     ├─sshd─┬─sshd───bash
     │      └─sshd───bash───su───bash(vincent)─┬─passwd(root)
     │                                         └─pstree        |
     ├─trashapplet                                     #我们发现passwd的执行者是root           
     ├─udevd───2*[udevd]
     ├─udisks-daemon─┬─udisks-daemon
     │               └─{udisks-daemon}
     ├─wnck-applet
     └─wpa_supplicant
[vincent@vincent ~]$

从上面的结果可以发现,执行pstree的权限是vincent这个一般用户的权限,而passwd的权限是root的权限,而且的的确确,passwd是由vincent这个普通用户所在bash衍生出来的,但权限不一样罢了,这样浅析你对对SUID权限应该有所领悟了。---------------------------------------------------------------------------------------------2、SGID

和SUID相比,SGID不止能作用在二进制可执行程序上,还能作用在目录上。和SUID不同的是:SUID作用位是文件的属主位,而SGID作用在文件的属组上,也表现为s。用户对文件是否能删除,取决于该用户对文件所在的目录是否有写权限;默认情况下,用户创建文件时,文件的属组是用户属组的基本组

[root@vincent ~]#mkdir vincent   # 创建vincent目录
[root@vincent ~]#ll -d vincent/
drwxr-xr-x. 2 root root 4096 Jul 31 10:16 vincent/ # 目录基本权限文755,没有SGID权限
[root@vincent ~]#chmod 2755 vincent/   # 给vincent目录加上SGID权限
[root@vincent ~]#ll -d vincent/
drwxr-sr-x. 2 root root 4096 Jul 31 10:16 vincent/  # 权限添加成功,表现为s
[root@vincent ~]#

SGID-特点

  • 作用在二进制文件上,继承二进制程序所属组的权限

  • 作用在目录上,目录内新建文件的所属组自动继承目录所属组

# .*.-----------SGID作用在目录上------------.*.#

[root@vincent app]#mkdir vincent   # 创建vincent目录
[root@vincent app]#chmod 2757 vincent/ # 赋予SGID权限,并给其他人赋予rwx权限
[root@vincent app]#useradd t1    # 创建两个用户t1,t2 用于后续试验
[root@vincent app]#useradd t2
[root@vincent app]#groupmems -a t1 -g root # 添加用户t1,t2的附加组为vincent目录所在的组
[root@vincent app]#groupmems -a t2 -g root
[root@vincent app]#su t1         # 切换到t1用户
[t1@vincent app]$cd vincent/     # 进入到vincent目录下
[t1@vincent vincent]$ls          # 查看目录内容,保证这是个空文件夹,防止干扰
[t1@vincent vincent]$touch t1.{1,2} # 创建两个文件
[t1@vincent vincent]$exit        # 退出登录
exit
[root@vincent app]#su t2         # 切换到t2 用户
[t2@vincent app]$cd vincent/
[t2@vincent vincent]$touch t2.{1,2}
[t2@vincent vincent]$ll          # 查看目录下的文件
total 0
-rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.1    # t1用户的两个文件属主是t1 ,属组是root继承自父文件夹
-rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.2
-rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.1    # t2用户的两个文件,继承了其父目录的组
-rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.2
[t2@vincent vincent]$\rm -rf t1.1    # t2用户试着删除t1的文件,因为定义了别名所以使用的\调用原始命令
[t2@vincent vincent]$ll        # 查看文件下的目录发现,真的删掉了t1用户的文件,
total 0
-rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.2
-rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.1
-rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.2
[t2@vincent vincent]$

说明:给目录赋予了SGID权限,那么同组用户能够对改组内不同用户创建的文件进行读写删除操作,不过这依赖于目录属组的权限。


# .*.-----------SGID作用在二进制文件上------------.*.#

[root@centos7 ~]# ll /bin/cat   #查看/bin/cat的文件,其属主属组都是root并且无SGID权限
-rwxr-xr-x. 1 root root 54048 Jul 23 22:14 /bin/cat
[root@centos7 ~]# su - test3    # 切换到用户test3
Last login: Mon Jul 24 02:13:27 HKT 2017 on pts/1
[test3@centos7 ~]$ cat /tmp/1.txt #使用cat来查看文件,发现权限受限
cat: /tmp/1.txt: Permission denied
[test3@centos7 ~]$ ll /tmp/1.txt 
-rwxrwx---. 1 root root 15 Jul 24 01:57 /tmp/1.txt 
[test3@centos7 ~]$ exit    # 退出
logout
[root@centos7 ~]# chmod 2755 /bin/cat # 给二进制文件/bin/cat附加SGID权限
[root@centos7 ~]# su - test3
Last login: Mon Jul 24 02:14:36 HKT 2017 on pts/2
[test3@centos7 ~]$ cat /tmp/1.txt  # 发现能查看了
shishihishihih        # 1.txt文件的内容为shishihishihih

说明:给二进制附加SGID权限,如果没有SUID存在,其他用户在使用该二进制可执行程序时将继承其组的权限,上例中,cat程序就是如此,继承了其组root的权限,所以普通用户能够使用。如果上例还不能让你明白,那么你用普通用户查看/etc/shadow文件,发现不能查看(这是密码文件,普通用户当然不让你看),但当你给cat命令加上SGID权限之后,你会发现普通用户竟然能查看了,这就是在执行程序时使用了cat所在组(root)的权限,root用户几乎不受权限的控制。---------------------------------------------------------------------------------------------3、Sticky(粘滞位)

我们都知道如果一个目录的权限是777那么所有用户都能对该目录下的文件进行查看,删除等操作,那么这样就存在一个隐患,张三用户一生气将李四用户写的程序文件全删除了,这样子李四几个月的辛苦就白费了。基于这种考量,linux系统中加入了Sticky这种权限。

Sticky-特点

  • 只对目录有效

  • 对于一个多人可写的目录,如果设置了sticky位。则每个用户仅能删除自己的文件,不能删除别人的文件除了root(root人家可是天神)

[root@vincent ~]#cd /app  # 进入到/app目录
[root@vincent app]#chmod 777 vincent/  #设置vincent目录的权限为777,便于后续试验环境,生产中不建议给777权限
[root@vincent app]#touch vincent/1  # root用户创建2个文件1,2
[root@vincent app]#touch vincent/2
[root@vincent app]#su t1        #切换到t1用户并创建2个文件3,4
[t1@vincent app]$touch vincent/3
[t1@vincent app]$touch vincent/4
[t1@vincent app]$exit
exit
[root@vincent app]#su t2    # 切换到t2用户并创建两个文件5,6
[t2@vincent app]$touch vincent/5
[t2@vincent app]$touch vincent/6
[t2@vincent app]$ll vincent/ # 查看vincent下的文件,有6个文件
total 0
-rw-r--r--. 1 root root 0 Jul 31 12:46 1
-rw-r--r--. 1 root root 0 Jul 31 12:46 2
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:46 3
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:47 4
-rw-rw-r--. 1 t2   t2   0 Jul 31 12:47 5
-rw-rw-r--. 1 t2   t2   0 Jul 31 12:47 6
[t2@vincent app]$\rm -rf 1    # 让t2用户删除root创建的文件1,发现尽然没报错,估计是删了
[t2@vincent app]$exit
exit
[root@vincent app]#su t1
[t1@vincent app]$cd vincent/
[t1@vincent vincent]$\rm -rf 5 #切换到t1用户,并删除t2用户创建的文件5,也没报错
[t1@vincent vincent]$ll  # 查看vincent目录下的文件,果然1,5都被删除了,太可怕了,普通用户能删root创建的文件
total 0
-rw-r--r--. 1 root root 0 Jul 31 12:46 2
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:46 3
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:47 4
-rw-rw-r--. 1 t2   t2   0 Jul 31 12:47 6
[t1@vincent vincent]$

通过上例我们发现只要目录的其他人有读写执行权限,那么其他用户都能对该目录下的文件执行删除操作。这太可怕了,一个匿名用户尽然能随意删除别人的文件。那么我们给vincent目录加上Sticky位,再来看看还能如此"横行"么?

[root@vincent app]#
[root@vincent app]#chmod o+t vincent/  # 给vincent目录加上Sticky权限,表现为t
[root@vincent app]#ll -d vincent/
drwxrwxrwt. 2 root root 4096 Jul 31 12:49 vincent/
[root@vincent app]#ll vincent/  # 查看vincent目录下还有那些文件
-rw-r--r--. 1 root root 8 Jul 31 12:46 2
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:46 3
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:47 4
-rw-rw-r--. 1 t2   t2   0 Jul 31 12:47 6
[root@vincent app]#su t1     #    且换到t1用户
[t1@vincent app]$cd vincent/
[t1@vincent vincent]$\rm -rf 2  # 试着删除root用户创建的文件
rm: cannot remove `2': Operation not permitted  # 提示错误:操作受限
[t1@vincent vincent]$exit
exit
[root@vincent app]#su t2    # 切换到t2用户
[t2@vincent app]$\rm -rf 6 # 删除自己创建的文件6 ,结果不报错,说明删掉了
[t2@vincent app]$ ll vincent/  # 再次查看文件,发现文件6被删除了
-rw-r--r--. 1 root root 8 Jul 31 12:46 2
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:46 3
-rw-rw-r--. 1 t1   t1   0 Jul 31 12:47 4
[t2@vincent vincent]$cat 2  # 试着查看root创建的文件2,发现可以,这是因为2的其他者位有r权限
wwwwwww
[t2@vincent vincent]$echo eeee >> 2 # 试着给文件2追加信息,发现操作受限,因为2的其他者位没有w权限
bash: 2: Permission denied
[t2@vincent vincent]$

说明:通过上面的实例我们发现,当一个文件被赋予Sticky权限时,不同的用户只能对该目录下自己的文件其有权限,不能删除其他用户创建的文件;至于是否能对其他用户的文件进行读写,这要看创建的文件对其他人是否有读写权限,注意通常写操作需要配合执行权限来工作。

关于linux系统中文件的权限,基本读写执行权限在加上特殊权限SUID、SGID、Sticky也给大家聊了,还有一个扩展权限ACL(访问控制列表),过两天将带给大家,敬请期待!


j_0030.gifj_0030.gif谢谢您的阅读!!若有疑问可留言j_0030.gifj_0030.gif