Linux中文件的SUID、SGID、Sticky权限说明
1、SUID
首先我们要了解,在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的文件要求有如下几点:
- SUID只对可执行的二进制文件起作用,shell脚本设置后不生效。
- 如果设置了其suid后,其属主位的可以执行权限x会变成s(小写),如果是大写S 那么说设置的文件没有可执行权限,设置的SUID无效。
- SUID对目录设置无意义。
SUID设置方法:
字母设置方式:chmod u+s file
取消SUID:chmod u-s file
数字设置方式:chmod 4755 在普通三位数字权限位之前,用4代表添加的SUID位
取消SUID:chmod 0755
做个小验证,就拿我们上面说的给cat命令对应的可执行二进制文件设置SUID
[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 进行查看的
给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:::
省略部分内容...
2、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属性只针对目录,对其文件不生效。
通过以上的示例得出几点:
1、在给文件或目录设置特殊权限时,其文件对应位上必须拥有可执行权限,否则设置特殊全无效。如果对应位上没有可执行权限,设置了特殊权限会在对应位上显示大写的字母,表示其特殊权限无效。
2、SUID只能作用于可执行的二进制文件,对目录无效。SGID可作用于可执行二进制文件和目录,Sticky只能作用于目录,对文件无效。
3、都是用chmod 进行授权。对于SUID和SGID都是+-s ,对于Sticky是+-t ,其中SUDI对应user位,SGID对应group位,Sticky对应other位,数字表示法,4表示SUID,2表示SGID,1表示Sticky。
Linux中文件的SUID、SGID、Sticky权限说明的更多相关文章
- 彻底了解 suid, sgid ,sticky权限
sticky: 粘性的, 如 : sticky tape: 粘胶带 /tmp, /var/tmp: 位 sticky: 表示: 第一, 任何用户都可以在该目录下创建文件(编辑自己的文件),第二, 但是 ...
- linux基础2-cd、mkdir、touch、umask、chattr、lsattr、SUID/SGID/Sticky Bit
一 cd : . 代表当前目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表[目前用户身份]所在的自家目录 与cd效果相同 ~account 代表 account 这个用户的自家家目录 二m ...
- [转]Linux中文件权限目录权限的意义及权限对文件目录的意义
转自:http://www.jb51.net/article/77458.htm linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括 ...
- SUID,SGID,Sticky Bit详解(转)
SUID属性 passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码.但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入, ...
- SUID ,SGID ,Sticky
SUID passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s FILE chmod u-s FILE 如果FILE本身原来就有执行权限, ...
- LSOF查看linux中文件打开情况
如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...
- linux中文件IO
一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...
- linux中文件颜色,蓝色,白色等各自代表的含义
linux中文件颜色,蓝色,白色等各自代表的含义 绿色文件---------- 可执行文件,可执行的程序 红色文件-----------压缩文件或者包文件 蓝色文件----------目录 白色文件- ...
- linux中文件压缩介绍
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/1c62bb7f-f ...
随机推荐
- Vue-CLI 项目中相关操作
0830总结 Vue-CLI 项目中相关操作 一.前台路由的基本工作流程 目录结构 |vue-proj | |src | | |components | | | |Nav.vue | | |views ...
- 三种常见字符编码:ASCII、Unicode和UTF-8
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...
- Mobius 反演与杜教筛
积性函数 积性函数 指对于所有互质的整数 aaa 和 bbb 有性质 f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b) 的数论函数. 特别地,若所有的整数 aaa ...
- 约瑟夫环问题详解(java版)
1 什么是约瑟夫环问题? 约瑟夫,是一个古犹太人,曾经在一次罗马叛乱中担任将军,后来战败,他和朋友及另外39个人躲在一口井里,但还是被发现了.罗马人表示只要投降就不死,约瑟夫想投降,可是其他人坚决不同 ...
- Python开发【第四篇】语句与函数
语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...
- WPF实现放大镜
这是一个之前遗留的问题.wpf里面有很多很多的东西,我以前用的真的只是其中很小的一个角落都不到. 需求背景:图片来源于相机拍摄,由于对像素要求,拍出来的图像素比较高,原图尺寸为30722048,以目前 ...
- Windows下Python虚拟环境的配置
一.了解Python虚拟环境 所谓虚拟环境可以理解为不同的不连通的本地设备,打个比方就是在一台电脑上能做到多台电脑能做的事情. 例如:现在我们有两个项目需要不同的配置,记为A项目需要库a------- ...
- 3、Struts2的API访问和数据封装
一.API的访问 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的.在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Sessio ...
- 玩转 RTC时钟库 DS1302
1.前言 最近博主在弄8266编程的时候,偶然发现两个全新时钟模块压仓货: DS1302 DS3231 为了避免资源浪费以及重复编写代码,博主还是抱着尝试的心态去寻找能够同时兼容 DS ...
- Spring(五)Spring缓存机制与Redis的结合
一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了 ...