linux系统中文件的特殊权限

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


一、安全上下文

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

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

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

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

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

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

使用的文件"其他"权限



二、文件的特殊权限

1、SUID

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

[[email protected] ~]# 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后,查看进程树来理解一下!

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

[1]+  Stopped                 passwd
[[email protected] ~]$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
[[email protected] ~]$

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

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

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

SGID-特点

  • 作用在二进制文件上,继承二进制程序所属组的权限
  • 作用在目录上,目录内新建文件的所属组自动继承目录所属组
# .*.-----------SGID作用在目录上------------.*.#

[[email protected] app]#mkdir vincent   # 创建vincent目录
[[email protected] app]#chmod 2757 vincent/ # 赋予SGID权限,并给其他人赋予rwx权限
[[email protected] app]#useradd t1    # 创建两个用户t1,t2 用于后续试验
[[email protected] app]#useradd t2
[[email protected] app]#groupmems -a t1 -g root # 添加用户t1,t2的附加组为vincent目录所在的组
[[email protected] app]#groupmems -a t2 -g root
[[email protected] app]#su t1         # 切换到t1用户
[[email protected] app]$cd vincent/     # 进入到vincent目录下
[[email protected] vincent]$ls          # 查看目录内容,保证这是个空文件夹,防止干扰
[[email protected] vincent]$touch t1.{1,2} # 创建两个文件
[[email protected] vincent]$exit        # 退出登录
exit
[[email protected] app]#su t2         # 切换到t2 用户
[[email protected] app]$cd vincent/
[[email protected] vincent]$touch t2.{1,2}
[[email protected] 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
[[email protected] vincent]$\rm -rf t1.1    # t2用户试着删除t1的文件,因为定义了别名所以使用的\调用原始命令
[[email protected] 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
[[email protected] vincent]$

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

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

[[email protected] ~]# ll /bin/cat   #查看/bin/cat的文件,其属主属组都是root并且无SGID权限
-rwxr-xr-x. 1 root root 54048 Jul 23 22:14 /bin/cat
[[email protected] ~]# su - test3    # 切换到用户test3
Last login: Mon Jul 24 02:13:27 HKT 2017 on pts/1
[[email protected] ~]$ cat /tmp/1.txt #使用cat来查看文件,发现权限受限
cat: /tmp/1.txt: Permission denied
[[email protected] ~]$ ll /tmp/1.txt 
-rwxrwx---. 1 root root 15 Jul 24 01:57 /tmp/1.txt 
[[email protected] ~]$ exit    # 退出
logout
[[email protected] ~]# chmod 2755 /bin/cat # 给二进制文件/bin/cat附加SGID权限
[[email protected] ~]# su - test3
Last login: Mon Jul 24 02:14:36 HKT 2017 on pts/2
[[email protected] ~]$ 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人家可是天神)
[[email protected] ~]#cd /app  # 进入到/app目录
[[email protected] app]#chmod 777 vincent/  #设置vincent目录的权限为777,便于后续试验环境,生产中不建议给777权限
[[email protected] app]#touch vincent/1  # root用户创建2个文件1,2
[[email protected] app]#touch vincent/2
[[email protected] app]#su t1        #切换到t1用户并创建2个文件3,4
[[email protected] app]$touch vincent/3
[[email protected] app]$touch vincent/4
[[email protected] app]$exit
exit
[[email protected] app]#su t2    # 切换到t2用户并创建两个文件5,6
[[email protected] app]$touch vincent/5
[[email protected] app]$touch vincent/6
[[email protected] 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
[[email protected] app]$\rm -rf 1    # 让t2用户删除root创建的文件1,发现尽然没报错,估计是删了
[[email protected] app]$exit
exit
[[email protected] app]#su t1
[[email protected] app]$cd vincent/
[[email protected] vincent]$\rm -rf 5 #切换到t1用户,并删除t2用户创建的文件5,也没报错
[[email protected] 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
[[email protected] vincent]$

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

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

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

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



谢谢您的阅读!!若有疑问可留言

时间: 2024-12-24 04:25:19

linux系统中文件的特殊权限的相关文章

Linux系统中文件的ACL权限

管理员的工作中,相当重要的一环就是"管理账号".因为整个系统都是你在管理,并且所有一般用户的账号申请必须要经过你的协助.在前两篇博客中,我们分别介绍文件的基础权限和特殊权限,也一直在强调权限的重用性,但是传统的权限仅有三种身份(ower.group.others)搭配读.写.执行(r.w.x)三种权限,并不能单纯针对某一个用户或某一个组来设置特定的权限需求,这时我没就不得不使用ACL(访问控制列表)了. 一.什么是 ACL ACL是 Access Control List 的缩写,主要

在Linux系统中文件(资源)和用户的管理

一个可执行二进制程序,被加载到内存,被内核调度到CPU上运行,这时候,就表现了一个进程.也可以说进程是程序的一个实例,是程序的动态表现. 在 Linux 系统中进程(process)是有属主的,也就是该进程以哪个用户的身份运行的.大家都知道,程序有输入和输出,也称这为程序IO.如果我们程序数据输入是磁盘.如,Web 服务器,接收用户的请求之后,把网页数据从磁盘中读入加工之后再把数据响应给用户.如果,发起Web 服务进程的用户没有读取该用户请求网页文件的权限.则无法响应用户的请求了.所以,文件(资

Linux系统中文件定位与查找

Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令--find和locate,以及压缩打包的命令--compress, gzip,bzip2,xz等.有问题或建议可发至邮箱[email protected] locate locate命令是通过查询Linux系统上预先构建的文件索引数据库,准确说来,这个数据库默认的位置是/var/lib/mlocate/mlocate.db,这个数据库一般由系统定时周期性更新,当然也可以通过update

linux系统中文件的权限

查看文件权限的语句: 在终端输入:ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些:-rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是类型 中间那三个 rw- 代表的是所有者(user) 然后那三个 rw- 代表的是组群(group) 最后那三个 r-- 代表的是其他人(other) 然后我再解释一下后面那9位数: r 表示文件可以被读(read) w 表示文件可以被写(write) x 表示文件可以被执行(如果它是程序的话) -

在linux 系统中利用 facl 实现目录下创建文件继承父目录的权限的所属组

在linux 系统中,可以通过setfacl 来实现目录下创建文件或子目录,并继承父目录的权限. 下面以 root 用普通用户 user1 .在目录/mnt下 [[email protected] mnt]# setfacl -m u:user1:rwx share        //为目录添加ower = user1 ,并赋予rwx 的权根. [[email protected] mnt]# setfacl -d -m  u:user1:rwx share    //为目录添加默认的acl权限

Linux系统中的文件和目录权限

Linux下的文件或目录权限详解 1.1 权限介绍 1.linux下的文件或目录权限是由9个权限来控制的,每三位为一组,即文件属主(owner=主人=用户)的r.w.x:用户组(group=同组的=家人)的r.w.x:其他的人(other=外人=不在同一组)的r.w.x: 2.权限分组说明 3.r=read=4=cat;    w=write=2=echo   x=exexute=1    '-'=没有权限: 特殊权限:t .T.s.S.x.X.+等: 4.哪个用户创建的文件它的用户或者主人就是

Linux系统中修改/etc/profile文件的方法

在Linux系统中etc/profile文件一般是不能更改的,想要更改etc/profile文件就要用一些特殊的技巧进行Linux文件修改.本文就来介绍一下Linux系统中修改/etc/profile文件的方法: etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑) $sudo gedit /etc/profile 或者 $sudo -s $gedit /etc/profile 这样打开profile

老男孩教育每日一题-2017年5月2日-Linux系统中,不小心把chmod命令的权限弄没了,怎么解决?

老男孩教育每日一题-2017年5月2日-Linux系统中,chmod命令没有执行权限(x权限)或者chmod命令文件的权限为000,怎么解决? 解决方法有两种: 方法一: [[email protected] bin]# cp cp /oldboy/chmod.new (此时复制cp命令文件命名叫chmod.new,此时chmod.new文件有就x的权限,但chmod.new不具备有chmod命令的共功能) [[email protected] bin]# cd /oldboy/ [[email

在linux系统中,如何使用【find】命令精确查找文件?

[find]是文件查找工具,它会遍历指定目录下所有文件的,所以使用该命令,查找文件的速度比较慢.但是它能够文件类根据型.文件的各做为条查件,找显示符合条件的文件目录. 一.既然,[find]是根据文件的特点来查看文种属性件的.那么先了解,文件有啥特点. 1.文件特点有很多,它们是分类的.find 命令如何表示文件特点的类别的: [find]命令是如何标识文件特点的类别的:              文件名称                   -name              文件类型