linux特殊权限详解,Linux 特殊权限详解

1.什么是特殊权限?

我们知道权限有r,w,x。其实除了这三个,还有特殊权限。比如:

[root@localhost ~]# ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd

可以发现权限位,有个s。特殊权限有如下3种:

SUID

SGID

STICKY

2.关于suid

我们知道linux有一个进程安全模型的概念,比如Tom执行passwd来进行修改密码:

第一,注意到passwd的权限为:

[hadoop@localhost ~]$ ls -l `which passwd`

-rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd

第二,注意到Tom不是root用户,也不属于root组。

我们先不考虑什么特殊权限s。很显然,此时Tom只能以other(r-x)来运行passwd。Tom可以发起一个进程,这个进程是passwd,想修改自己的密码。

第三,用户Tom执行完passwd修改密码,其实就是保存至/etc/shadow中,下面我们看看/etc/shadow文件的权限情况。

[hadoop@localhost ~]$ ls -l /etc/shadow

-r-------- 1 root root 2713 Jun 13 16:34 /etc/shadow

[hadoop@localhost ~]$

那个属于Tom的修改密码的进程应该要去修改/etc/shadow文件,但是根据上面的/etc/shadow的权限,除了root用户外,谁都不可以修改的!也就是说,根据进程安全模型,普通用户根本无法修改密码!但事实上,是可以修改的。原因就在于那个特殊权限s。

也就是说,suid表示运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者。也就是说普通用户去执行passwd修改密码,其实是发起了一个进程,这个进程的属主是root用户,那么很显然就可以修改shadow这个影子文件了。

3.关于sgid

根据suid的理解,可知sgid表示运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者的基本组。可以举例分析:

第一:root用户创建了一个项目目录

[root@localhost /]#

[root@localhost /]# ls -ld /project/cma

drwxrwxr-x 2 root develop 4096 Jun 14 22:14 /project/cma

第二:项目组成员java01,java02,...均属于develop组(他们的附加组),也就是说他们对/project/cma具有rwx权限。

[java02@localhost cma]$ ls -l

total 8

-rw-rw-r-- 1 java01 java01 0 Jun 14 22:24 01.java

-rw-rw-r-- 1 java02 java02 0 Jun 14 22:25 02.java

上面看到他们可以在/project/cma中创建文件,根据以前的理论:【谁创建的文件,文件的属主就是谁,属组就是他的基本组】,上面的没有问题。但是,我们希望这些项目组成员之间可以相互编辑其他人的文件,该如何做呢?

第三:由于项目组成员java02,并不属于java01的私有组,显然java02只对01.java具有r--权限,不可以编辑。此时我们可以使用sgid,来改变默认的这种行为~

[root@localhost cma]# pwd

/project/cma

[root@localhost cma]# chmod -R g+s /project/cma

[root@localhost cma]# ls -ld

drwxrwsr-x 2 root develop 4096 Jun 14 22:25 .

[root@localhost cma]#

注意了,出现了特殊权限位s,但是有时候可能会显示S。【如果是s说明这个权限位上以前是具有x权限的】

第四:利用sgid后,以后我们的项目组成员便可以在此目录下编辑其他成员的文件了。

[java02@localhost cma]$ ls -l

total 16

-rw-rwSr-- 1 java01 java01  0 Jun 14 22:24 01.java

-rw-rw-r-- 1 java01 develop 0 Jun 14 22:33 01.txt

-rw-rwSr-- 1 java02 java02  0 Jun 14 22:25 02.java

-rw-rw-r-- 1 java02 develop 0 Jun 14 22:33 02.txt

[java02@localhost cma]$

也就是说利用sgid可以帮我们达到这样的目的:

在目录下创建的文件的属组不在是用户的基本组,而是目录的属组。

4.关于sticky

此时此刻,我们的项目组成员已经可以相互编辑/project/cma下面的文件了,但是有个要求:我们希望用户只能删除自己的文件,而不可以删除别人的文件。这就要使用sticky了。

[root@localhost cma]# chmod -R o+t /project/cma

[java01@localhost cma]$ id

uid=5016(java01) gid=5016(java01) groups=5016(java01),5018(develop) context=root:system_r:unconfined_t:SystemLow-SystemHigh

[java01@localhost cma]$ rm 02.txt

rm: cannot remove `02.txt': Operation not permitted

5.串联

还记得umask吗,umask其实就是一个XYZW,四位数,其中X表示的就是suid/sgid/striky。

chmod xyzw file,其实同理。

000 nothing

001 only striky

010 only sgid

100 only suid

......

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 权限管理是 Linux 操作系统中非常重要的一部分,它控制着用户对文件和目录的访问权限。在 Linux 中,每个文件和目录都有三种基本权限:读取(r)、写入(w)和执行(x)。这些权限可以分别应用于文件所有者、文件所属组和其他用户,以控制不同用户对文件和目录的访问和使用。 文件权限的表示方法 Linux 中,文件权限是用一串数字来表示的,每个数字代表一种权限。其中,第一位表示文件所有者的权限,第二位表示文件所属组的权限,第三位表示其他用户的权限。每个数字的含义如下: - 0:没有权限 - 1:执行权限 - 2:写入权限 - 3:写入和执行权限 - 4:读取权限 - 5:读取和执行权限 - 6:读取和写入权限 - 7:读取、写入和执行权限 例如,文件权限为“rw-r--r--”,表示文件所有者具有读取和写入权限,文件所属组和其他用户只有读取权限。 文件权限的修改方法 在 Linux 中,可以使用 chmod 命令来修改文件权限。chmod 命令的基本语法如下: ``` chmod [选项] 模式 文件名 ``` 其中,选项包括: - -c:只在文件权限确实发生了改变的情况下,输出修改信息。 - -f:不显示错误信息。 - -v:显示每个文件的修改信息。 模式是一种用数字表示的文件权限,可以使用以下方法进行计算: - r=4,w=2,x=1 - 所有者权限的值 = rwx 的数字值 - 组权限的值 = rwx 的数字值 - 其他用户权限的值 = rwx 的数字值 例如,要将文件的所有者设置为可读写,组用户设置为只读,其他用户设置为只执行,可以使用以下命令: ``` chmod 754 filename ``` 其中,7 表示所有者具有读、写和执行权限;5 表示组用户具有读和执行权限;4 表示其他用户具有只读权限。 除了 chmod 命令,Linux 还提供了一些其他工具来管理权限,如 chown 和 chgrp 命令用于更改文件的所有者和所属组,setuid 和 setgid 位可以设置进程的权限等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值