Linux 特殊权限位setuid setgid

思考:为什么普通用户可以修改密码?

setuid u+s

[root@desktop0 ~]# ls -l /etc/shadow

----------. 1 root root 1148 Apr  9 17:07 /etc/shadow

可以看到shadow这个文件只有root用户才可以操作,为什么普通用户可以改密码,并且将密码保存在shadow文件里面?

密码是先写到/etc/passwd之后转换到/etc/shadow里面。

[root@desktop0 ~]# ls -l /etc/passwd

-rw-r--r--. 1 root root 2005 Jul 11  2014 /etc/passwd

可以看到就算是/etc/passwd文件普通用户也没有写的权限,那么普通用户是怎么修改的密码呢?

 

就从passwd和shadow文件权限可以看出普通用户是没有办法修改密码的,那么普通用户是怎么修改密码的?这个原因就是passwd这个命令

[root@desktop0 ~]# which passwd

扫描二维码关注公众号,回复: 2876585 查看本文章

/usr/bin/passwd

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

-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd

可以看到passwd这个命令有一个特殊的权限,这个特殊的权限就是s,一般普通的权限就是xwr,这个特殊的s权限一般称为setuid权限。

 

setuid的定义:当一个可执行程序具有了setuid权限,当用户执行这个程序的时候(可执行程序可以理解为命令),将以这个程序的所有者的身份执行。

比如passwd这个命令具有了setuid权限,即s位,户执行这个命令的时候就会以这个命令的所有者去执行。在linux里面,所有的命令的所有者默认所有者都是root,换句话说,当一个命令具有s位的时候,普通用户去执行这条命令时候,将以这个命令的所有者root身份去执行。

普通用户使用passwd在修改密码的时候,是以root身份去修改密码,是root在执行修改密码的动作,这样可以将修改的密码写到文件里面。改完密码之后又从root身份变为普通用户。

 

下面是一个示例来演示setuid即s位的作用:

[root@desktop0 ~]# which touch

/usr/bin/touch

[root@desktop0 ~]# ls -l /usr/bin/touch  --系统里面创建文件的命令权限是755

-rwxr-xr-x. 1 root root 62432 Jan 25  2014 /usr/bin/touch

 

 

[root@desktop0 ~]# su - student  --切换到普通用户,之后使用touch来创建文件,观察权限

Last login: Mon Apr  9 17:07:20 CST 2018 on pts/1

[student@desktop0 ~]$ touch test

[student@desktop0 ~]$ ls -l test

-rw-rw-r--. 1 student student 0 Apr  9 18:00 test

可以看到student创建的test文件所有者是student,

之后将touch命令授予setuid的权限。授予setuid有两种方法:

(1)使用chmod u+s进行授予

(2)使用数字方式授予,在linux里面默认权限是755,setuid权限位是数字4,这样就可以在缺省的权限前面加上4,即4755。

[root@desktop0 ~]# umask  查看缺省权限命令,022这三位对应了所有者,所属组,其他人。 后面三位777-022=755

0022

这里多出来的第一位0,这个第一位是一组特殊的权限,包括三个,其中一个就是setuid。

它对应的数字标识就是4。

[root@desktop0 ~]# chmod  u+s /usr/bin/touch  

[root@desktop0 ~]# ls -l /usr/bin/touch

-rwsr-xr-x. 1 root root 62432 Jan 25  2014 /usr/bin/touch --可以看到权限位上面多了一个s位

[root@desktop0 ~]# su - student  --再切换到普通用户student创建一个文件

'Last login: Mon Apr  9 18:00:31 CST 2018 on pts/2

[student@desktop0 ~]$ touch mytest

[student@desktop0 ~]$ ls -l mytest --可以看到这个文件的所有者变为了root,当授予s位之后,普通用户创建文件的时候是以root身份去执行的。

-rw-rw-r--. 1 root student 0 Apr  9 18:14 mytest

 

 

通过上面的实验可以看到特殊权限位的第一位的setuid权限即s权限赋予了一个命令或者程序,当普通用户去执行的时候是以所有者位root的身份去执行。

 

注意使用chmod u+s的时候,对象必须是可执行程序,比如一个命令,不能是一个目录。

如果一个对象不是可执行程序设置为setuid是没有任何意义的。

 

 

如果要收回s权限,那么就使用chmod u-s 可执行程序。或者使用chmod 755,即不加上第一位4。

 

 

setgid g+s

这里还有一个setgid的权限,对应的数字是2。概念和setuid是一样的。当一个程序具有setgid的时候,当一个用户执行这个程序的时候会以这个程序所属组的身份去执行。

授予的命令是chmod g+s。或者chmod 2755。

 

如果要同时授予setuid和setgid的权限就可以使用chmod 6755。下面的实验和上面的一样

[root@desktop0 ~]# ls -l /usr/bin/touch

-rwxr-xr-x. 1 root root 62432 Jan 25  2014 /usr/bin/touch

[root@desktop0 ~]# chmod g+s  /usr/bin/touch

[root@desktop0 ~]# ls -l /usr/bin/touch

-rwxr-sr-x. 1 root root 62432 Jan 25  2014 /usr/bin/touch

[root@desktop0 ~]# su - student

Last login: Mon Apr  9 18:14:15 CST 2018 on pts/2

[student@desktop0 ~]$ touch newtest

[student@desktop0 ~]$ ls -l newtest --可以看到所属组是root,因为touch命令被授予的setgid的权限。

-rw-rw-r--. 1 student root 0 Apr  9 18:32 newtest

 

 

很多命令不适合授予setuid的权限,比如vim/vi这些命令,如果设置为setuid权限就相当于给黑客留留一个后门,如果vi授予了setuid权限,那么随便切换到一个普通用户下面,那么就可以使用vi编辑/etc/passwd,将普通用户的uid改为0,这样普通用户登入就是以1root身份登入,所以不要随便将一个命令授予setuid权限。

 

 

在linux那些命令被授予了setuid权限呢?

[root@desktop0 ~]# find / -perm -4000 -o -perm -2000  -- -o代表了或者

find: ?.proc/4649/task/4649/fd/6?. No such file or directory

find: ?.proc/4649/task/4649/fdinfo/6?. No such file or directory

find: ?.proc/4649/fd/6?. No such file or directory

find: ?.proc/4649/fdinfo/6?. No such file or directory

/run/log/journal

/run/log/journal/946cb0e817ea4adb916183df8c4fc817

/usr/bin/wall

/usr/bin/write

/usr/bin/mount

/usr/bin/chage

[root@desktop0 ~]# ls -l  /usr/bin/mount

-rwsr-xr-x. 1 root root 44232 Mar 28  2014 /usr/bin/mount

 

 

o+t 

上面介绍了权限位第一位的两个特殊权限,还剩下一个特殊权限,这个权限是粘着位,这一位的权限是1。

[root@desktop0 ~]# mkdir -p /test

[root@desktop0 ~]# chmod 777 /test --如果一个目录有写权限,那么就可以对目录里面文件进行删除和创建

[root@desktop0 ~]# touch /test/mytest

[root@desktop0 ~]# su - student

Last login: Mon Apr  9 18:32:40 CST 2018 on pts/2

[student@desktop0 ~]$ rm -rf /test/mytest

[student@desktop0 ~]$ ls /test

[student@desktop0 ~]$

上面可以看出,root创建的文件,在普通用户下可以删除。

有没有一个目录,每一个用户都可以在该目录下面创建文件,但是每一个用户不能删除其他用户创建的文件。答案是有的,这个目录就是/tmp目录。

[hellow@server0 test]$ ls -ld /tmp
drwxrwxrwt. 9 root root 4096 Apr 10 02:03 /tmp
[hellow@server0 test]$ touch /tmp/hellow.txt
[hellow@server0 test]$ su - test
Password: 
Last login: Tue Apr 10 02:03:15 CST 2018 on pts/0
[test@server0 ~]$ rm -rf /tmp/hellow.txt  --可以看到虽然tmp目录的其他人对目录具有rwx权限,但是test用户不能对hellow用户创建的文件进行删除,因为这里有一个粘着位t。
rm: cannot remove ?.tmp/hellow.txt?. Operation not permitted

 

总结:

特殊权限
u+s
[root@localhost tmp]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root test 27832 Jan 29 2014 /usr/bin/passwd
x:以用户自身的权限去执行的
s:是以文件所有者 形式去执行的(root
[root@localhost tmp]# ll /etc/passwd
-rw-r--r--. 1 root root 2333 Aug 4 22:42 /etc/passwd

t---粘滞位
o+t
仅文件所有者(和root)可以删除目录中的文件,没有权限去删除其他用户的文件
[root@localhost tmp]# ll -d /tmp
drwxrwxrwt. 10 root root 4096 Aug 4 23:57 /tmp

 

希望目录下创建文件、目录 继承父目录的组设置(RHCSA)

g+s
用符号表示: setuid = u + s; setgid = g + s sticky = o + t
用数值表示(第四位):setuid = 4; setgid = 2 sticky = 1
X760 

 

特殊权限

对文件的影响

对目录的影响

u+s

以拥有文件的用户身份,而不是以
运行文件的用户身份执行文件

无影响

g+s

以拥有文件的组身份执行文件

在目录中最新创建的文件将其组所有者设置为目录的组所有者

o+t

无影响

对目录具有写入权限的用户仅可以删除其所拥有的文件,而无法删除其他用户拥有的文件

 

 

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/81417255