思考:为什么普通用户可以修改密码?
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
/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 |
无影响 |
对目录具有写入权限的用户仅可以删除其所拥有的文件,而无法删除其他用户拥有的文件 |