概述

除了我们前面介绍的rwx权限外,Linux中还有另外三种特殊权限:SUID,SGID,SBIT

  权限    执行条件 执行示例
SUID

s出现在文件所有者的x权限上。

1. SUID只能用于二进制可执行文件,对目录无效

2. 执行者若具有该文件的x权限,则将具有文件所有者的权限

3. 权限只在文件执行时有效,执行完毕不再拥有所有者权限

chmod u+s test #为test文件加上suid权限

chmod 4777 test #为test文件加上suid权限

SGID

s出现在文件所属群组的x权限上。

SGID和SUID不同,可以用于目录

1. 使用者若有此目录的x,w权限,则可进入和修改此目录

2. 使用者在此目录下的群组将变成该目录的群组,

新建的文件,群组是此目录的群组。

SGID对于文件来说

1. SGID只对二进制可执行文件有效

2. 执行者若具有该文件的x权限,则将具有文件所属群组的权限

3. 权限只在文件执行时有效,执行完毕不再拥有所属群组权限

chmod g+s test #为test文件加上sgid权限

chmod 2777 test #为test文件加上sgid权限

SBIT

t出现在文件其他用户的x权限上。

1. 和SUID,SGID不同的是,只能用于目录

2. 使用者在该目录下,仅自己与root才有权力删除新建的目录或文件

chmod o+t test #为test文件加上sbit权限

chmod 1777 test #为test文件加上sbit权限

使用SUID特殊权限

在 Linux 系统中我们已经学习过 r(读)、w(写)、 x(执行)这三种文件普通权限,但是我们在査询系统文件权限时会发现出现了一些其他权限字母,比如:

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. root root Jun /usr/bin/passwd

可以看见在属主本来应该写 x(执行)权限的位置出现了一个小写 s,我们把这种权限称作 SetUID 权限,也叫作SUID 的特殊权限。

我们知道,在 Linux 系统中,每个普通用户都可以更改自己的密码,这是合理的设置。问题是,普通用户的信息保存在 /etc/passwd 文件中,用户的密码实际保存在 /etc/shadow 文件中,也就是说,普通用户在更改自己的密码时修改了 /etc/shadow 文件中的加密密码,但是,看下面的代码:

[root@localhost ~]# ll /etc/passwd
-rw-r--r--. root root Nov : /etc/passwd
[root@localhost ~]# ll /etc/shadow
----------. root root Nov : /etc/shadow

/etc/passwd 文件的权限是 644,意味着只有超级用户 root 可以读/写,普通用户只有只读权限。

/etc/shadow 文件的权限是 000,也就是没有任何权限。意味着只有超级用户可以读取文件内容,并且可以强制修改文件内容;而普通用户没有任何针对 /etc/shadow 文件的权限。

换句话说,普通用户对这两个文件其实都是没有写权限的,那为什么普通用户可以修改自己的权限呢?

其实,普通用户可以修改自己的密码的秘密不在于 /etc/passwd 和 /etc/shadow 这两个文件,而在于 passwd 命令。我们再来看看 passwd 命令的权限:

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. root root Jun /usr/bin/passwd

passwd 命令拥有特殊权限 SetUID,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户在执行这个文件时将以文件所有者的身份来执行。passwd 命令拥有 SetUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),也就是说,当普通用户使用 passwd 命令更改自己的密码的时候,实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入 /etc/shadow 文件,所以普通用户也可以修改 /etc/shadow 文件,命令执行完成后,该身份也随之消失。

举个例子,有一个用户 zhangsan,他可以修改自己的权限,因为 passwd 命令拥有 SetUID 权限;但是他不能査看 /etc/shadow 文件的内容,因为査看文件的命令(如 cat)没有 SetUID 权限。命令如下:

[root@localhost ~]# su - zhangsan
[lamp@localhost ~]$ passwd
更改用户zhangsan的密码。
为zhangsan更改STRESS密码。
(当前)UNIX密码:
新的密码:
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新
[zhangsan@localhost ~]$ cat /etc/shadow
cat:/etc/shadow:权限不够

说明:passwd 是系统命令,可以执行,所以可以赋予 SetUID 权限。

当zhangsan用户执行passwd命令时:

zhangsan用户对 passwd 命令拥有 x(执行)权限。

zhangsan用户在执行 passwd 命令的过程中,会暂时切换为 root 身份,所以可以修改 /etc/shadow 文件。

命令结束,zhangsan 用户切换回自己的身份。

cat 命令没有 SetUID 权限,所以就使用 zhangsan用户身份去访问 /etc/shadow 文件,当然没有相应权限了。

如果把 /usr/bin/passwd 命令的 SetUID 权限取消,普通用户是不是就不能修改自己的密码:

[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwxr-xr-x. root root 2289656 Jun 10  2014/usr/bin/passwd
[root@localhost ~]# su -zhangsan
[zhangsan@localhost ~]$ passwd
更改用户zhangsan的密码。
为zhangsan更改STRESS密码。
(当前)UNIX密码:
新的密码:
重新输入新的密码:
passwd:鉴定令牌操作错误

最后提示passwd:鉴定令牌操作错误,所以最后密码没有生效

刚刚把系统命令本身拥有的 SetUID 权限取消,这样会导致命令本身可以执行的功能失效。但是如果给默认没有 SetUID 权限的系统命令赋予了 SetUID 权限的话系统就会出现重大安全隐患,这种操作一定不要随意执行,例如 给vim添加SetUID权限

[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x root root 2289656 Jun 10  2014 /usr/bin/vim

当 vim 命令拥有了 SetUID 权限后,任何普通用户在使用 vim 命令时,都会暂时获得 root 的身份和权限,很多普通用户本身不能査看和修改的文件马上就可以査看了,包括 /etc/passwdf 和 /etc/shadow 这两个重要的用户信息文件,这样我就可以轻易地把自己的 UID 改为 0,升级为超级用户了。如果我修改了系统重要的启动文件,比如 /etc/inittab 或 /etc/fstab,就可以轻易地导致系统瘫痪。

其实任何只有管理员可以执行的命令,如果被赋予了 SetUID 权限,那么普通用户都可以执行它进行相应的操作。大家可以想象普通用户可以随时重启服务器、随时关闭看得不顺眼的服务。所以,SetUID 权限不能随便设置,同时要防止黑客的恶意修改

使用SGID特殊权限

当 s 标志在属主的 x 位置时是 SetUID, s 标志在属组的 x 位置时是 SetGID,简称为SGID。比如:

[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. root slocate Jun /usr/bin/locate

和 passwd 命令类似,普通用户在执行 locate 命令的时候,会获取 locate 属组的组身份。locate 命令是在系统中按照文件名査找符合条件的文件的,不过它不是直接搜索系统的,而是搜索 /var/lib/mlocate/mlocate.db 这个数据库的。我们来看看这个数据库的权限。

[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. root slocate Nov : /var/lib/mlocate/mlocate.db

大家会发现,属主权限是 r、w,属组权限是 r,其他人的权限是 0。

说明:

当zhangsan用户执行locate命令时:

1. /usr/bin/locate 是可执行二进制程序,可以被赋予 SetGID 权限。

2. 执行用户 zhangsan 对 locate 命令拥有执行权限。

3. 执行 locate 命令时,组身份会升级为 slocate 组,而 slocate 组对 /var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令査询 mlocate.db 数据库。

4. 命令结束,zhangsan 用户的组身份返回为 zhangsan 组。

使用SBIT特殊权限

当 t 标志在其他人的 x 位置时是 Stick BIT(粘着位),简称为SBIT。比如:

[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 19 root root 4096 Nov 17 16:10 /tmp

默认系统中 /temp/ 目录拥有 SBIT 权限。在其他人的 x 权限位,被 t 符号占用了,代表 /tmp/ 目录拥有 SBIT 权限。我们使用 zhangsan 用户在 /tmp/ 目录中建立测试文件 ftest,然后使用 lisi用户尝试删除。如果没有 SBIT 权限,而 /tmp/ 目录的权限是 777,那么 lisi用户应该可以删除 ftest 文件。

但是/tmp目录拥有了 SBIT 权限,lisi 用户不能删除其他用户建立的文件:

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# su -zhangsan
[zhangsan@localhost ~]$ cd /tmp/
[zhangsan@localhost tmp]$ touch ftest
[zhangsan@localhost tmp]$ll ftest
-rw-rw-r-- zhangsan zhangsan 11月20 : ftest
[zhangsan@localhost tmp]$ su - lisi
密码:
输入lisi用户的密码
[lisi @localhost ~]$ cd /tmp/
[lisi @localhost tmp]$ rm -rf ftest
rm:无法删除"ftest":不允许的操作

虽然/tmp/目录的权限是777,但是拥有SBIT权限,所以 lisi 用户不能删除其他用户建立的文件

Linux权限管理 文件特殊权限的更多相关文章

  1. Linux用户和权限——管理文件权限的命令

    Linux用户和权限——管理文件权限的命令 摘要:本文主要学习了Linux中修改文件权限的命令. chown命令 chown命令,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件( ...

  2. Linux系列教程(十六)——Linux权限管理之ACL权限

    通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...

  3. 【Linux】 Linux权限管理与特殊权限

    Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在 ...

  4. Linux权限管理之ACL权限

    注:转载自:https://www.cnblogs.com/ysocean/p/7801329.html 目录 1.什么是 ACL 权限? 2.查看分区 ACL 权限是否开启:dump2fs ①.查看 ...

  5. linux 用户管理,用户权限管理,用户组管理

    linux 用户管理,用户权限管理,用户组管理 一:ls -l 命令 解释 第个d表示是目录,如果是文件是-,如果是连接是l 第2到4个 rwx 表示创建者的操作权限 r 读,w 写,x 执行 第5到 ...

  6. Linux "ls -l"文件列表权限详解

    ls Linux "ls -l"文件列表权限详解 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- root adm -- : apache2 ...

  7. Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)

    Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...

  8. 5 个在 Linux 中管理文件类型和系统时间的有用命令

    对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...

  9. 【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】

    一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...

随机推荐

  1. FreeMarker调用Java静态方法以及静态变量的方法

    这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...

  2. PHP 几种 序列化/反序列化的方法

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...

  3. easyui最简单的左右布局实现,及tab的右键菜单实现

    发现最近有些人问用JQuery easyui要怎么实现左右结构的布局.就是点击左边的菜单在右边的tab中打开.其实easyui要实现这种布局很简单,只需要简单的几行代码就ok了. 特意做了一个小小的d ...

  4. 第一百七十一节,jQuery,高级事件,模拟操作,命名空间,事件委托,on、off 和 one

    jQuery,高级事件,模拟操作,命名空间,事件委托,on.off 和 one 学习要点: 1.模拟操作 2.命名空间 3.事件委托 4.on.off 和 one jQuery 不但封装了大量常用的事 ...

  5. (转)初步认识拓展UnityEditor编辑器定制

    初步认识拓展UnityEditor编辑器定制 热度 9529 2015-9-4 18:50 |个人分类:Unity3d| 编辑器, 拓展 我相信无数初学者看别人游戏都经常看到他们的Inspector中 ...

  6. go语言递归创建目录

    import ( "fmt" "os" ) func main() { //创建C:/temp/log文件夹 // err := os.MkdirAll(&qu ...

  7. 机器学习之猫狗大战,解决image RGB values must be in the 0..1 range.

    猫狗大战是比较经典的机器学习案例,前几天体验了一番,来记录一下 1.图片准备 首先是准备训练的图片 链接:https://pan.baidu.com/s/1ht1HIuw 密码:aw9s 2.开始训练 ...

  8. 用js判断页面是否加载完成

    这可以通过用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == “complete”判断是否加载完成. 可以采用2个div ...

  9. 表变量、临时表(with as ,create table)

    1.declare @t table(CountryRegionCode nvarchar(3))insert into @t(CountryRegionCode)  (select CountryR ...

  10. String、StringBuffer与StringBuilder的区别。

    无论是做Java或是Android,都避免不了遇到这个问题,其实开发过程中一般情况下是不会纠结,这个问题是面试必选经典题,今天有时间,就总结一下. String.StringBuffer.String ...