linux特殊权限位之setuid、setgid和sticky

2024-05-09 14:08

本文主要是介绍linux特殊权限位之setuid、setgid和sticky,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



 我们登陆到系统之后,创建一个普通文件或者目录的时候,会有一个默认的权限。普通文件是644,目录文件是755,想必大家都知道这个是由umask这个值决定的。我们可以直接执行umask命令查看,linux系统默认的umask值是0022。想改变创建文件默认的权限,我们直接修改umask就可以,但是一般的权限都是通过777-022得到的默认权限位。022前面的这个0是什么呢?第一个0就是特殊权限位,下边我们就来跟大家说一下setuid、setgid和sticky这个三个特殊权限位。

1.suid,set uid:在一个程序或命令上添加setuid以后(u+s),这样属主有了s权限,意味着任何用户在执行此程序时,其进程的属主不再是发起者本人,而是这个程序的属主。最典型的一个例子就是passwd这个命令;

 普通用户运执行passwd命令来修改自己的密码,其实最终更改的是/etc/passwd这个文件。

我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改。

1
2
[root@Vmware5 ~] # ls -l /etc/passwd
-rw-r--r--. 1 root root 981 Oct 25 01:00  /etc/passwd

 按照常规的逻辑思维,普通用户是修改不了/etc/passwd此文件的,但是在passwd这个命令上添加了setuid这个特殊权限位,普通账号临时变成root,就能间接修改自己账号的密码了。

1
2
[root@Vmware5 ~] # ls -l /usr/bin/passwd  (s就是suid位)
-rwsr-xr-x. 1 root root 30768 Feb 22  2012  /usr/bin/passwd

 设置setuid的方法:(其实前边提到过了参数是u+s)

1
2
3
4
5
chmod  u(+|-)s  /path/somefile
chmod  4664  /path/somefile
注意:
s:表示属主原来有执行权限
S:表示属主原来没有执行权限

实例演示:

添加一个名字为taokey的普通用户

1
[root@Vmware5 ~] # useradd taokey

把/etc/fsatb文件拷贝到/tmp目录下一份

1
2
[root@Vmware5 ~] # cp /etc/fstab /tmp/
[root@Vmware5 ~] # cd /tmp/

查看/tmp目录下fstab文件的属性

1
2
[root@Vmware5 tmp] # ll fstab
-rw-r--r--. 1 root root 899 Oct 25 00:16 fstab

把其他用户的读权限给去掉

1
2
3
[root@Vmware5 tmp] # chmod o-r fstab
[root@Vmware5 tmp] # ll fstab
-rw-r-----. 1 root root 899 Oct 25 00:16 fstab

切换到普通用户taokey

1
[root@Vmware5 tmp] # su - taokey

执行cat命令,看下是否可以查看fstab文件

1
2
[taokey@Vmware5 ~]$  cat  /tmp/fstab
cat /tmp/fstab : Permission denied

由于other去掉了r权限,所有提示cat被拒绝

为了保留原始环境,把cat命令拷贝到/tmp目录一份

1
2
3
4
5
6
7
8
[root@Vmware5 ~] # cp /bin/cat  /tmp/
[taokey@Vmware5 tmp]$  ls  -l fstab  cat
-rwxr-xr-x. 1 root root 45224 Oct 25 00:21  cat
-rw-r-----. 1 root root   899 Oct 25 00:16 fstab
[taokey@Vmware5 tmp]$ . /cat  fstab
. /cat : fstab: Permission denied
[taokey@Vmware5 tmp]$  exit
logout

特换到root用户,添加setuid权限

1
[root@Vmware5 tmp] # chmod u+s cat
1
添加完s权限位之后,再切换到普通用户taokey,测试是否可以成功执行 cat 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@Vmware5 tmp] # su - taokey
[taokey@Vmware5 ~]$  cd  /tmp/
[taokey@Vmware5 tmp]$ . /cat  fstab
#
# /etc/fstab
# Created by anaconda on Thu Oct 24 23:49:23 2013
#
# 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
#
UUID=b49ee2b3-75aa-4227-a9ff-5d0d990af0fd /                       ext4    defaults        1 1
UUID=3a69daa4-b393-4694-abbb-b856345b376d  /boot                    ext4    defaults        1 2
UUID=34f85ed8-5f68-4fdc-8aa0-e50d2f9f012e  /home                    ext4    defaults        1 2
UUID=95d97c70-9291-499b-ac16-a38508a85e4d swap                    swap    defaults        0 0
tmpfs                    /dev/shm                 tmpfs   defaults        0 0
devpts                   /dev/pts                 devpts  gid=5,mode=620  0 0
sysfs                    /sys                     sysfs   defaults        0 0
proc                     /proc                    proc    defaults        0 0

 切换到普通用户之后,可以成功执行cat命令,查看/tmp/fstab文件,就是因为tmp目录下cat这个命令上添加了s权限位。

1
2
[taokey@Vmware5 tmp]$ ll  cat
-rwsr-xr-x. 1 root root 45224 Oct 25 00:21  cat

注意:设置suid这个特殊权限很危险,不到万不得已,做好还是不要使用。


2.Sgid,Set id,属组有s权限,意思就是执行此程序时,此进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组。Set gid权限如果给文件设置,是让运行此文件的其它用户具有这个文件的属组特性;给目录设置Set gid权限,任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。

工作中经常会遇到这样一个问题?

运维和开发同属于技术部,用户同属于一个组,文件在一个目录中,运维人员和开发人员可以相互之间访问自己的文件,要是一个一个修改属组就有点麻烦,这时候用sgid就会很方便的解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
例子:
[root@Vmware5 tmp] # usermod -a -G mygrp xen
[root@Vmware5 tmp] # usermod -a -G mygrp kvm
[root@Vmware5 tmp] # mkdir /tmp/test
[root@Vmware5 tmp] # ls -ld /tmp/test/
drwxr-xr-x. 2 root root 4096 Oct 25 00:48  /tmp/test/
[root@Vmware5 tmp] # chmod g+w /tmp/test
[root@Vmware5 tmp] # ls -ld /tmp/test/
drwxrwxr-x. 2 root root 4096 Oct 25 00:48  /tmp/test/
[root@Vmware5 tmp] # chown :mygrp /tmp/test
[root@Vmware5 tmp] # ls -ld /tmp/test
drwxrwxr-x. 2 root mygrp 4096 Oct 25 00:48  /tmp/test
[root@Vmware5 ~] # su - xen
[xen@Vmware5 ~]$  cd  /tmp/test
[xen@Vmware5  test ]$  touch  a.xen
[xen@Vmware5  test ]$  ls  -l
total 0
-rw-rw-r--. 1 xen xen 0 Oct 25 00:50 a.xen
[root@Vmware5 ~] # su - kvm
[kvm@Vmware5 ~]$  cd  /tmp/test
[kvm@Vmware5  test ]$  touch  a.kvm
[kvm@Vmware5  test ]$  ls  -l
total 0
-rw-rw-r--. 1 kvm kvm 0 Oct 25 00:51 a.kvm
-rw-rw-r--. 1 xen xen 0 Oct 25 00:50 a.xen

kvm用户想往xen创建的文件a.xen中写东西,但是被拒绝了。

1
2
[kvm@Vmware5  test ]$  echo  "hello"  >>a.xen
- bash : a.xen: Permission denied

咱们在用root,给/tmp/test文件添加一个sgid权限位,然后再测试下。

1
2
3
[root@Vmware5 ~] # chmod g+s /tmp/test
[root@Vmware5 ~] # ls -ld /tmp/test
drwxrwsr-x. 2 root mygrp 4096 Oct 25 00:51  /tmp/test

切换到xen普通用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@Vmware5 ~] # su - xen
[xen@Vmware5  test ]$  touch  b.xen
[xen@Vmware5  test ]$ ll b.xen
-rw-rw-r--. 1 xen mygrp 0 Oct 25 01:01 b.xen
[root@Vmware5 ~] # su - kvm
[kvm@Vmware5 ~]$  echo  "hello"  >>b.xen
[kvm@Vmware5 ~]$  cat  b.xen
hello
[kvm@Vmware5 ~]$  touch  b.kvm
[root@Vmware5 ~] # su - xen
[xen@Vmware5 ~]$  cd  /tmp/test/
[xen@Vmware5  test ]$  echo  "My name is taoyake."  >>b.kvm
[xen@Vmware5  test ]$  cat  b.kvm
My name is taoyake.

可以成功写进去,这个就是因为在/tmp/test文件设置了sgid权限位

但是这个不但可以能成功写进去,还可以删除文件,我们只能自己删除自己的文件,不想让其他用户删除我们的文件,这时候怎么办呢?

1
2
3
4
5
6
7
例如:
[xen@Vmware5  test ]$  rm  b.kvm
[xen@Vmware5  test ]$ ll
total 0
-rw-rw-r--. 1 kvm kvm   0 Oct 25 00:51 a.kvm
-rw-rw-r--. 1 xen xen   0 Oct 25 00:50 a.xen
-rw-rw-r--. 1 xen mygrp 0 Oct 25 01:01 b.xen


3.这时候就用到了粘滞位,t,sticky,附加other的权限上,表现为t。

chmod o+|-t /path/somefile

1
2
3
4
5
6
7
8
9
10
11
12
实例操作:
[root@Vmware5 ~] # ls -ld /tmp/test
drwxrwsr-t. 2 root mygrp 4096 Oct 25 01:10  /tmp/test
[xen@Vmware5  test ]$  ls
a.kvm  a.xen  b.xen  c.kvm
[xen@Vmware5  test ]$  echo  "beyond"  >>c.kvm
[xen@Vmware5  test ]$  cat  c.kvm
beyond
[xen@Vmware5  test ]$  echo  "" >c.kvm
[xen@Vmware5  test ]$  cat  c.kvm
[xen@Vmware5  test ]$  rm  -rf c.kvm
rm : cannot remove `c.kvm': Operation not permitted

可以添加和任意修改其他用户的文件,就是不能删除其他用户的文件,自己可以删除自己创建的文件。

1
2
3
4
5
6
7
8
9
10
11
[kvm@Vmware5  test ]$  touch  c.kvm
[kvm@Vmware5  test ]$  ls
a.kvm  a.xen  b.xen  c.kvm
[kvm@Vmware5  test ]$  rm  c.kvm
[kvm@Vmware5  test ]$  ls
a.kvm  a.xen  b.xen
[xen@Vmware5  test ]$ ll
total 0
-rw-rw-r--. 1 kvm kvm   0 Oct 25 00:51 a.kvm
-rw-rw-r--. 1 xen xen   0 Oct 25 00:50 a.xen
-rw-rw-r--. 1 xen mygrp 0 Oct 25 01:01 b.xen

表示方法: 
将三个特殊位的用八进制数值表示,放于 u/g/o 位之前。其中 suid :4 sgid:2 sticky:1.

这篇关于linux特殊权限位之setuid、setgid和sticky的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973605

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4