首页 > 系统相关 >Linux特殊权限 SUID、SGID、Sticky

Linux特殊权限 SUID、SGID、Sticky

时间:2022-12-20 11:22:17浏览次数:73  
标签:文件 SUID chmod Sticky Linux 权限 root 目录

转载自:https://www.jianshu.com/p/5c1db5821a14

在理解特殊权限之前,需要先具备几个关于安全上下文的认知:
前提:进程有属主和属组;文件有属主和属组;

  1. 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限;
  2. 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;
  3. 进程访问文件时的权限,取决于进程的发起者:
    • 进程的发起者,同文件的属主:则应用文件属主权限;
    • 进程的发起者,属于文件的属组;则应用文件属组权限;
    • 应用文件“其它”权限;

SUID

SUID相关说明:

  • 启动为进程之后,其进程的属主为原程序文件的属主;
  • 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
  • 执行suid权限的程序时,此用户将继承此程序的所有者权限;
  • 在普通三位数字权限位之前,用4代表添加的SUID位
  • 文件属主的x权限,用s代替.表示被设置了SUID
  • 如果属主位没有x权限,会显示为大写S,表示有故障(权限无效)
  • chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)

SUID权限设定方法:

字母表示法:

chmod u+s FILE...
chmod u-s FILE...

数字表示法:

chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义)

在普通三位数字权限位之前,用4代表添加的SUID位

chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)  

文件权限表示:

# ls -l f1
-rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1
#文件属主的x权限,用s代替.表示被设置了SUID
#如果属主位没有x权限,会显示为大写S,表示有故障(权限无效) 

SUID工作原理:

环境前提:
linux中有一个二进制程序cat,属主属组均为root
linux中有一个系统文件/etc/shadow,属主属组均为root
我们创建一个普通用户叫user1
user1具有对cat的执行权限
user1 不具有对/etc/shadow的任何权限

默认情况下
user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.

给cat设置SUID之后
user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许访问.
举例说明:
passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.
而passwd命令改密码的行为是通过修改/etc/shadow文件来实现.

看一下/etc/shadow的文件权限:

# ls -l /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的原权限

#ls -l /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 
#成功.

SGID

SGID相关说明:

作用在二进制程序上时:
执行sgid权限的程序时,此用户将继承此程序的所属组权限

作用于目录上时:
此文件夹下所有用户新建文件都自动继承此目录的用户组.

权限设定方法:

字母表示法

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 同上 

文件权限表示:

# ls -l /app/f1
-rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1 

文件属组的x权限,用s代替.表示被设置了SGID

如果属组位没有x权限,会显示为大写S,表示有故障(权限无效)

SGID实例:

作用在二进制程序上时,原理同SUID,只是由user位变为group位.
作用于目录上时演示:
普通帐户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组.

Sticky粘滞位

Sticky相关说明:

对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;只能作用在目录上.普通文件设置无意义,且会被linux内核忽略,用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限

权限设定方法:

字母表示法:

chmod o+t DIR...
chmod o-t DIR...
chmod +t DIR...

数字表示法:

chmod 1755 DIR

在普通数字权限位前,用1代表添加Sticky位

文件权限表示:

 # ls -l -d tmp
drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp 
文件other位的x权限,用t代替.表示被设置了Sticky
如果other位没有x权限,会显示为大写T,表示有故障(权限无效) 

Sticky实例:

目的:
我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件.

实现:
root用户先创建一个777权限目录/app/tmp
普通用户quintin和wang分别在其中创建几个文件和目录
这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件.
所以root要给/tmp这个文件夹设定一个Sticky位.

# chmod 1777 tmp
# ls -l -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:作用于目录
设定后,目录中的用户只能删除、移动或改名自己的文件或目录

SUID、SGID、Sticky比较

二进制文件 目录
SUID 此用户将继承此程序的所有者权限 无意义
SGID 此用户将继承此程序的所属组权限 此目录下所有用户新建文件都自动继承此目录的用户组
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

数字权限法只能删除目录的Sticky.不能删除目录的SUID和SGID.数字权限法每次只能设置一种超级权限.添加权限时:对于文件,会删除掉原有的其他超级权限.对于目录,添加SUID或SGID时,Sticky会被删除.
所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.

几个权限位映射参考:

SUID:
user, 占据属主的执行权限位;
s: 属主拥有x权限
S:属主没有x权限

SGID:
group, 占据group的执行权限位;
s: group拥有x权限
S:group没有x权限

Sticky:
other, 占据ohter的执行权限位;
t: other拥有x权限
T:other没有x权限

标签:文件,SUID,chmod,Sticky,Linux,权限,root,目录
From: https://www.cnblogs.com/bushilushan/p/16993805.html

相关文章

  • linux下安装pymssql
    各版本的下载地址:​​https://pypi.python.org/pypi/pymssql/​​Windows可以下载installer文件,直接是编译好的,可以直接安装Linux下需要安装几个基础类库:Cython:pipinstall......
  • Perf -- Linux下的系统性能调优工具
    Perf简介Perf是用来进行软件性能分析的工具。通过它,应用程序可以利用PMU,tracepoint和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题(pert......
  • linux 配置yum源
    1. 切换到yum源配置目录cd/etc/yum.repos.d/2.备份所有配置文件mkdirbackmv*./back3.新建一个xxx.repo文件touchCentos-Base.repo4.编辑文件内......
  • 让Linux任务在后台可靠运行的几种方法
     我们经常会碰到这样的问题,用telnet/ssh登录了远程的Linux服务器,运行了一些耗时较长的任务,结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终......
  • linux 中如何查找在过去一段时间内修改过的文件
     001、查找在过去五分钟内修改过的文件find./-mmin-5 002、查找在过去10分钟内修改过的文件find./-mmin-10 003、查找在过去一天内修改过的文件......
  • linux 中记录程序运行的时间
     001、[root@pc1test1]#start=$(date+%s)##记录程序的开始时间[root@pc1test1]#echo$start1671529118[root@pc1test1]#end=$(date+%s)##......
  • linux系统更改主机名和用户名
    Linux权限系列--修改主机名、用户名的方法(有示例)https://blog.csdn.net/feiying0canglang/article/details/126449423  ......
  • SELinux初探
    SELinux初探自己总结出来的SELinux部分,仅供参考。SELinux是一个内核模块。SELinux的运行模式主体:SELinux主要管理的就是进程,你可以将【主体】跟进程划上等号。目标:主......
  • Linux中rpm安装软件包
    1.RPM包命名规则:httpd-2.2.15-53.el6.centos.x86_64.rpm httpd软件包名 2.2.15软件版本 53软件发布次数 el6.centos适合的Linux平台 x86_64适合的硬......
  • Linux文件描述符数的查看与配置
    前戏生产环境因系统文件打开数太小导致服务挂掉了系统最大打开文件描述符数查看cat/proc/sys/fs/file-max设置临时配置echo100000000000000>/proc/sys/fs/file-max永久......