Linux的特殊权限sticky、sgid与数据安全

本文涉及的产品
数据安全中心,免费版
简介:

    Linux 系统中有一个特殊的目录 /tmp 称为临时目录,所有用户都可以在该目录里创建文件,那么就意味着 /tmp目录的权限是 rwxrwxrwx 那么,任何一个用户都可以删除该目录中任意一个文件,这是不允许的。Linux 使用特殊权限sticky: 沾滞位(冒险位),实现了不能删除属主不是自己(发起删除动作的用户)的文件。但是,由于普通用户的umask值为: 0002. 普通用户在 /tmp创建一个目录,并把自己的临时文件存放在该目录中就不安全了。Sticky 只能保证直属于 /tmp 目录中的文件的安全,并不能保证/tmp目录下的子目录的文件数据的安全。

wKioL1PKYG7BD6UlAABpuzco6sI791.jpg

1
2
[admin@Node1 ~]$  umask
0002

使用普通用户 system /tmp 目录下创建一个 mytest目录。

1
2
3
[system@Node1 tmp]$  mkdir  /tmp/mytest
[admin@Node1 tmp]$ ll -d mytest
drwxrwxr-x. 3 system system 4096 Jul  4 15:18 mytest

说明:

     由于,普通用户的umask 值为:0002,所以创建的目录权限表示为:rwxrwxr-x.

用户能不能在一个目录中创建和删除文件,取决于该用户在该目录中有没有写(r)权限。我们也可以,这样理解:Linux的一个重要哲学思想之一是“一切皆文件”。目录也是文件中的一种。把目录看成一个文件。那么,用户往目录中创建文件,就相当于往该目录文件中添加数据行,删除该目录中的文件就相当于从目录文件中删除数据行。所以,用户要往该目录(目录文件)中创建文件或删除文件,得要有该目录的写权限才可以的。

     根据“权限匹配模型”只要发起创建文件(touch,vim或删除文件(rm)进程的用户的属组或附加组是system.那么该用户是可以删除或创建文件的。

下面来看看是不是跟分析的一样呢?

1、把用户:system 的基本组作为用户admin,hadoop 的附加组

这样用户:admin,hadoop就可以在mytest目录中创建文件了。

1
2
3
4
5
6
[root@Node1 tmp] # usermod -a -G systemadmin
[root@Node1 tmp] # usermod -a -G systemhadoop
[root@Node1 tmp] # id admin
uid=500(admin) gid=500(admin) groups =500(admin),501(system)
[root@Node1 tmp] # id hadoop
uid=4029(hadoop) gid=4029(hadoop) groups =4029(hadoop),501(system)

2、分别以admin  hadoop用户身份在/tmp/mytest目录中创建文件

1
2
[root@Node1 tmp] # su  – hadoop  -c  'touch/tmp/mytest/hadoop.txt'
[root@Node1 tmp] # su  - admin  –c  'touch /tmp/mytest/admin.txt'

3、查看是否能创建文件呢?

1
2
3
4
[root@Node1 tmp] # ll mytest
total 4
-rw-rw-r--. 1 admin  admin    0 Jul 17 16:51 admin.txt
-rw-rw-r--. 1 hadoop hadoop    0 Jul 17 16:51 hadoop.txt

分析:

    从【ls mytest】显示的结果,知道用户:admin,hadoop创建文件成功了。

4、再以 admin用户的身份删除属主为hadoop的文件和以hadoop用户的身份删除属主为admin的文件

删除前

1
2
3
4
5
[root@Node1 ~] # ll /tmp/mytest
total 4
-rw-rw-r--. 1 admin  admin    0 Jul 17 16:51 admin.txt
-rw-rw-r--. 1 hadoop hadoop    0 Jul 17 16:51 hadoop.txt
drwx------. 2 root   root  4096 Jul  4 15:18 skel

执行删除操作

1
2
[root@Node1 ~] # su - admin -c 'rm -r/tmp/mytest/hadoop.txt' 
[root@Node1 ~] # su - hadoop -c 'rm -r/tmp/mytest/admin.txt'

删除后的

1
2
3
[root@Node1 ~] # ll /tmp/mytest
total 4
drwx------. 2 root root 4096 Jul  4 15:18 skel

分析:

   从上述 ll /tmp/mytest】结果,得知。发起删除进程的用户 adminhadoop和被删除的文件所在目录的属组匹配的。它就可以删除

 

那么,看看管理员在 /tmp/mytest目录中创建的文件,普通用户是否可以删除呢?

以管理员的身份创建文件root.txt

1
2
3
4
5
[root@Node1 ~] # touch /tmp/mytest/root.txt
[root@Node1 ~] # ll /tmp/mytest
total 4
-rw-r--r--. 1 root root    0 Jul 19 15:50 root.txt
drwx------. 2 root root 4096 Jul  4 15:18 skel

以普通用户 admin 发起rm 进程去删除管理员创建的文件 root.txt

1
[root@Node1 ~] # su - admin -c 'rm -f/tmp/mytest/root.txt'

查看是否已经把文件删除掉

1
2
3
[root@Node1 ~] # ll /tmp/mytest
total 4
drwx------. 2 root root 4096 Jul  4 15:18 skel

分析:

    从【ll/tmp/mytest】显示的结果,知道。普通用户已经把属主是管理员(root)的且admin用户没有写(r)权限的root.txt文件删除了。再也再次证明:能否删除目录中的文件是取决于,发起删除进程的用户是否具有被删除文件所在的目录的写权限的。

 

从上面的实验结果得知:在/tmp/mytest 中创建的文件是没有任何安全性可言的。

普通用户的 umask = 0002。像上面的例子,admin用户的附加组为 systemhadoop用户的附加组也是systemSystem用户(它是属于system) /tmp创建的目录。该目录中的数据是非常不安全的。

如果,想要,发起删除进程的用户不能删除属主不是自己的文件,那就得给该目录添加特殊控制位 sticky(沾滞位)。添加方法如下:

1
增加 sticky 之前
1
2
[root@Node1 ~] # ll -d /tmp/mytest
drwxrwxr-x. 3 system system 4096 Jul 1916:01  /tmp/mytest

使用【chmod】命令添加 sticky 

1
[root@Node1 ~] # chmod o+t /tmp/mytest

添加 sticky 之后,目录的其它的权限就最后一位就变成了“t

1
2
[root@Node1 ~] # ll -d /tmp/mytest
drwxrwxr-t. 3 system system 4096 Jul 1916:01  /tmp/mytest

测试一下是否能够删除属主不是自己的文件呢?

/tmp/mytest目录中原有的文件

1
2
3
4
[root@Node1 ~] # ll /tmp/mytest
total 4
-rw-rw-r--. 1 hadoop hadoop    0 Jul 19 16:45 hadoop.txt
-rw-r--r--. 1 root   root     0 Jul 19 16:01 root.txt

 admin 用户身份发起rm进程删除属主为hadooproot用户的文件

1
2
3
4
[root@Node1 ~] # su - admin -c 'rm -f/tmp/mytest/hadoop.txt'
rm : cannot remove ` /tmp/mytest/hadoop .txt':Operation not permitted
[root@Node1 ~] # su - admin -c 'rm -f/tmp/mytest/root.txt'
rm : cannot remove ` /tmp/mytest/root .txt':Operation not permitted

    从结果:可以看得出不能删除属主不是自己的文件。使用sticky(沾滞位)保证了安全。

还是因为,普通用户的 umask = 0002, 那么用户创建的文件的权限是: rw-rw-r—

用户 adminhadoop的附加组为 system.所以,system 用户(属于system)/tmp

目录或在上面例子中的/tmp/mytest中创建的文件,用户 adminhadoop都可以修改的。

例子:

1
[root@Node1 ~] # su - system -c 'touch/tmp/system.txt'

admin用户的身份往属主为systemsystem.txt写数据

1
2
3
[admin@Node1 ~]$  echo  "I admin" >>  /tmp/system .txt
[admin@Node1 ~]$  cat  /tmp/system .txt
I admin

    加了,sticky 位显然不能删除属主不是自己的文件,但是还能修改属主不是自己的文件。这是由于我们创建文件时,文件的权限是根据“umask”的值来定的。所以不想让别的用户修改自己的文件,就把文件的属组和其它的写权限位去掉。

 

    由于用户adminhadoop的附加组为用户system的直接组systm.所以这两个用户都可以修改属主为system的文件。但是属主为admin的文件,用户hadoopsystem是无法修改的。

同样属主为hadoop用户的文件其它两个用户也是无法修改的。用户创建文件的时候,属主和属组就是创建用户的用户名和组名,和所在的目录没有关系。所以只有通过管理员去修改,属主为adminhadoop的文件的属组为system.这样就可以实现彼此间修改属主不是自己的文件了。那么可不可以通过某种方式,当用户一创建文件,该文件的属组就是文件所在目录的属组呢?这要通过“sgid”特殊权限来实现。

下面来看看是如何实现的:

1
2
3
4
5
6
7
8
9
10
11
12
[root@Node1 ~] # id system
uid=501(system) gid=501(system) groups =501(system)
[root@Node1 ~] # id admin
uid=500(admin) gid=500(admin) groups =500(admin),501(system)
[root@Node1 ~] # id hadoop
uid=4029(hadoop) gid=4029(hadoop) groups =4029(hadoop),501(system)
  
[root@Node1 ~] # ll /tmp/mytest
total 4
-rw-rw-r--. 1 admin  admin    0 Jul 19 17:15 admin.txt
-rw-rw-r--. 1 hadoop hadoop    0 Jul 19 16:45 hadoop.txt
-rw-rw-r--. 1 system system    0 Jul 19 16:52 system.txt

修改属主为hadoop的文件hadoop.txt,修改失败。

1
2
[admin@Node1 ~]$  echo  "I admin" /tmp/mytest/hadoop .txt
- bash /tmp/mytest/hadoop .txt: Permissiondenied

/tmp/mytest添加特殊权限 guid 后,看看是否能够彼此修改属主不是自己的文件?

添加特殊权限sgid 之前

1
2
[root@Node1 ~] # ll -d /tmp/mytest
drwxrwxr-t. 3 system system 4096 Jul 1917:15  /tmp/mytest

添加特殊权限 sgid

1
[root@Node1 ~] # chmod g+s /tmp/mytest

添加特殊权限 sgid 后,属组的第三位表示为“s

1
2
[root@Node1 ~] # ll -d /tmp/mytest
drwxrwsr-t. 3 system system 4096 Jul 1917:15  /tmp/mytest

看看添加 ugid之后创建文件,文件的属组有什么变化?

分别以不同的用户身份创建文件

1
2
3
[root@Node1 ~] # su - system -c 'touch/tmp/mytest/system.txt'
[root@Node1 ~] # su - admin -c 'touch/tmp/mytest/admin.txt'
[root@Node1 ~] # su - hadoop -c 'touch/tmp/mytest/hadoop.txt'

查看创建文件的结果,三个用户创建的文件的属组已经不再是创建文件用户的组名了,

而是文件所在目录的属组了。这样他们就可以彼此属主不是自己的文件了。

1
2
3
4
5
[root@Node1 ~] # ll /tmp/mytest
total 4
-rw-rw-r--. 1  admin   system   0 Jul 19 17:50 admin.txt
-rw-rw-r--. 1  hadoop  system    0 Jul 19 17:50 hadoop.txt
-rw-rw-r--. 1  system  system    0 Jul 19 17:50 system.txt

   根据“权限匹配模型”用户adminhadoop的附加为system.而文件的属组又是system.

且有读写权限。所以它们一定可以彼此修改属主不是自己的文件的,但不能删除属主不是自己的文件由于有 sticky 位。





     本文转自成长的小虫 51CTO博客,原文链接: http://blog.51cto.com/9528du/1440295 ,如需转载请自行联系原作者


相关文章
|
2月前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
|
25天前
|
Linux 数据安全/隐私保护
linux特殊权限!!
本文介绍了Linux系统中的特殊权限,包括suid、sgid和sbit。suid使普通用户在执行特定命令时获得root权限;sgid使用户在创建文件时继承目录的用户组权限;sbit确保用户只能删除自己在共享目录中创建的文件。此外,文章还讲解了chattr和lsattr命令,用于更改和查看文件的扩展属性,以及umask的概念和计算方法,帮助理解文件和目录的默认权限。
36 1
linux特殊权限!!
|
2月前
|
Linux 应用服务中间件 nginx
Linux下权限设置之suid、sgid、sticky
Linux下权限设置之suid、sgid、sticky
|
2月前
|
Linux 数据安全/隐私保护 Windows
Linux_权限理解(详细PLUS
Linux_权限理解(详细PLUS
|
2月前
|
网络协议 Linux 网络安全
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作
|
2月前
|
Linux Go 数据安全/隐私保护
Linux入门2——初识Linux权限
Linux入门2——初识Linux权限
28 0
|
7月前
|
Linux Windows
Linux权限命令详解(二)
Linux权限命令详解(二)
|
7月前
|
安全 Linux 开发工具
Linux权限命令详解(一)
Linux权限命令详解(一)
|
7月前
|
Linux 数据安全/隐私保护
Linux 权限常用命令
【2月更文挑战第8天】
107 2
Linux 权限常用命令
|
安全 Shell Linux
【Linux】Linux权限,shell命令以及运行原理(下)
之前我们一直敲得命令和口口声声说的shell到底是什么呢?命令行提示符和输入的指令并且可以执行都是通过命令行解释器来实现的,那么命令行解释器就是我们常说的shell,具体我们看下面!
110 0