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 ,如需转载请自行联系原作者


相关文章
|
27天前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
38 2
|
1月前
|
运维 监控 安全
Linux_权限理解(详细PLUS)
【10月更文挑战第3天】本文介绍了Linux系统中的权限管理基础,包括文件系统对象与权限关联、权限的继承性、字符与数字表示法的解读,以及用户、组与权限的动态交互。详细解析了`chmod`命令的高级用法和权限修改的风险,探讨了SUID、SGID和Sticky Bit等特殊权限的作用机制,并提出了基于角色的权限分配和定期权限审计的最佳实践。
54 11
|
24天前
|
Linux 应用服务中间件 nginx
Linux下权限设置之suid、sgid、sticky
Linux下权限设置之suid、sgid、sticky
|
24天前
|
Linux 数据安全/隐私保护 Windows
Linux_权限理解(详细PLUS
Linux_权限理解(详细PLUS
|
25天前
|
网络协议 Linux 网络安全
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作
|
25天前
|
Linux Go 数据安全/隐私保护
Linux入门2——初识Linux权限
Linux入门2——初识Linux权限
24 0
|
8天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
84 5
|
8天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
35 4
|
5天前
|
运维 监控 网络协议
|
6天前
|
监控 Linux Shell