linux系统中的特殊权限之SUID(Set UID)


***linux系统中的特殊权限之SUID(Set UID)***
***linux系统中的特殊权限之SGID(Set GID)***
***linux系统中的特殊权限之SBIT(Sticky BIT)***

前言

在进入正题之前,让我们来看一条简单的linux命令

[root@centos7u6 ~]# ls -l
total 8
-rw-------. 1 root root 1409 Mar 13 12:22 anaconda-ks.cfg
drwxr-xr-x. 2 root root  119 Mar 28 20:13 test

以上面的test目录为例,linux系统中的文件,有9位基本权限,即 rwxr-xr-x ,其中:

  • 左三位:定义属主(owner)的权限
  • 中三位:定义属组(group)的权限
  • 右三位:定义其他(other)的权限
    同时,每3位又分别代表着不同的权限,分别为:
  • r:readable, 读
  • w:writable, 写
  • x:excutable,执行
    有权限时分别用3个字母表示,这9个权限位,决定一个用户了访问文件时,对该文件具有哪些权限。
    但是除了这个9个权限位之外,linux系统中还有3个特殊权限位,即SUIDSGIDSBIT
    这里,我们先说说SUIDSGIDSBIT会放在后面的文章讲解。

SUID的作用

当一个用户运行一个程序时,如果这个程序拥有SUID权限,则当这个程序运行为进程时,进程的属主不再是其发起者,而是这个程序文件自己的属主
下面,为了更好的理解SUID的作用,我们用一个简单的示例来展示。

进程安全上下文

当一个用户发起一个进程去访问一个文件时,这个进程是以该用户的身份和权限对文件完成相关操作,这个过程基于一个简单的权限匹配模型:

  • 第一步,判断进程的属主与被访问文件的的属主是否相同,
    • 如果相同,则直接应用属主的权限去访问文件;
    • 如果不同,则进入第二步;
  • 第二步,判断进程的属主与被访问文件的属组是否相同,
    • 如果相同,则应用属主的权限去访问该文件;
    • 如果不同,则进入第三步;
  • 第三步,应用其他(other)的权限去访问该文件;

实例讲解

默认的情况(不使用SUID)

这里我们使用less命令来进行简单演示

  • #查看/bin/less命令的权限和属主属组
[root@centos7u6 ~]# ls -l /bin/less
-rwxr-xr-x. 1 root root 158240 Jul 31  2015 /bin/less
  • #安全起见,我先将/bin/less命令拷贝至/tmp/目录下,以便后期修改其SUID权限
[root@centos7u6 ~]# cp /bin/less  /tmp/
  • #这里注意,/tmp/less的权限同/bin/less一样,属主和属组都是root
[root@centos7u6 ~]# ls -l /tmp/less 
-rwxr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
  • #现在切换至tom用户,并使用less命令查看
    注意:这个地方,不要使用q退出less命令,以保证less进程存在
[root@centos7u6 ~]# su - tom
Last login: Fri Mar 29 23:32:38  on pts/1
[tom@centos7u6 ~]$ /tmp/less /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • #使用另一个终端,或者ssh登录到这台主机,并查看进程
[root@centos7u6 ~]# ps aux| grep less
tom       56820  0.0  0.1 110308  1008 pts/1    S+   00:04   0:00 /tmp/less /etc/fstab
root      57040  0.0  0.0 112708   976 pts/2    R+   00:09   0:00 grep --color=auto less

总结:从以上几步可以看到,默认情况下,虽然/tmp/less的属主属组均为root,但是tom作为其他用户有执行权限,所以tom在使用/tmp/less命令时,发起的进程的属主是tom,并不是root。这符合之前提到的进程的安全上下文。

使用SUID的情况

  • #现在,在刚才的默认情况的基础上,我们给予/tmp/less特殊权限SUID,
    注意:文件的属主的执行权限变成了小s,不再是基本权限中的x
[root@centos7u6 tmp]# chmod u+s /tmp/less 
[root@centos7u6 tmp]# ls -l /tmp/less 
-rwsr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
  • #继续以tom用户运行/tmp/less命令,并且不退出
[tom@centos7u6 ~]$ /tmp/less  /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • #再次用其他终端登录这个主机并用ps aux查看进程
[root@centos7u6 tmp]# ps aux |grep less
root      57587  0.0  0.1 110308  1008 pts/1    S+   00:20   0:00 /tmp/less /etc/fstab
root      57676  0.0  0.0 112708   976 pts/2    R+   00:22   0:00 grep --color=auto less

总结:可以看到,当/tmp/less拥有了SUID权限后,虽然以tom用户执行/tmp/less命令,但是/tmp/less的进程的属主仍为root。
其实,SUID在linux中有一个非常常用的命令,使用了SUID权限,这个命令就是passwd

[root@centos7u6 tmp]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

passwd命令拥有了这一特殊权限,使得除了root之外的用户去发起一个passwd命令的进程时,进程的属主为root,拥有root权限,这样就能够修改自己的密码了。不过,passwd是一个安全指数很高的命令,这保证了一个用户(除root外)无法去修改用户的密码。

SUID的语法

  • 第一种方法
    chmod u+|-s FILENAME
    设置权限:chmod u+s /tmp/ls
    取消:chmod u+s /tmp/ls
  • 第二种方法
    SUID/SGID/SBIT三个特殊权限又形成了一个8进制权限位,所以在基于8进制赋权时,可以在默认的3位8进制数字左侧再加1位8进制数字,来代表特殊权限。
    设置权限:chmod 4644 FILENAME
    取消:
SUIDSGIDSBIT八进制权限
0000
0011
0102
0113
1004
1015
1106
1117

判断文件是否有SUID权限

SUID的权限展示位,在属主的执行权限位上。

  • 如果有SUID
    • 属主原本有执行权限,则属主的执行权限位,显示为小s
    • 属主原本没有执行权限,则属主的执行权限位,显示为大写S
  • 如果没有SUID
    • 属主的执行权限位,仍然按其基本权限,显示为x或者-
[root@centos7u6 tmp]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

使用SUID的注意事项

  • 只有可执行的二进制程序才可以设置SUID
  • 被设置SUID的文件属主必须具备可执行(x) 权限
  • SUID的生命周期:当这个程序运行为进程时SUID有效,进程结束后,SUID权限也随之消失
  • 这个权限有风险,慎用

转载于:https://www.cnblogs.com/Demon-Loong/p/10629400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值