SetUID Set
SetUID 的特性
属性
- 只能针对二进制程序
- 命令执行者需要对该程序有x权限
作用
- 命令执行者在执行该程序的过程中临时获得该程序所属用户的身份
SetUID 应用场景DEMO
那么这个有SetUID这个有什么用呢,举个栗子,linux可以用它来比较安全的修改自己的密码
修改密码用到的passwd命令使用的是/usr/bin/passwd这个二进制文件。那么我们来瞅一眼这个文件的权限是什么样子的吧
ll /usr/bin/passwd
passwd权限
可以看到所属用户为root,对于其他用户有rx权限,值得注意的是所属用户的权限为rws,这个就是指的是SetUID权限,同时注意s的位置,因为SetUID是针对用户的所以放在用户权限这里。
Linux如何利用SetUID来安全修改密码呢?
首先需要知道Linux密码记录在/etc/shadow中,这个文件没有任何权限,是普通用户无权访问,既然无权访问那普通用户如何修改密码呢?
ll /etc/shadow
因为/usr/bin/passwd对于其他用户有执行权限。所以任何用户都可以执行passwd命令。由于有SetUID属性,当passwd在执行时会获得root用户权限。root用户才不会管这些花里胡哨的权限设定,他想改就改:)~
修改密码步骤如下
- 当在执行passwd命令时,临时获得root用户权限。提示用户输入之前的密码
- passwd程序使用root用户去/etc/shadow 下验证密码。由于获得的root权限可以访问/etc/passwd 来比较判断一下老密码是否正确
- 如果验证通过,那么让用户输入新的密码同时以root身份把该用户新的密码信息更新到/etc/passwd中。
- 如果验证失败,则不会修改密码
通过这种方式就实现了安全修改密码的问题:
用户看不到别人的密码 ,因为没有对密码文件/etc/shadow 的访问权限,但是当passwd验证通过之后,可以获得root用户权限,通过passwd的指令以root的身份更新自己的密码。
添加SUID
- 通过数字修改
chmod 4755 filename
最前面的一个最前面的一个4代表SUID
- 通过字母修改
chmod u+s filename
注意对于没有执行权限的文件加上SUID,是无效的
test
比如我给权限为644 的test文件加上s 属性因为没有任何的执行权限,这个SUID无效,系统以大写的S显示这个无效的SUID
去掉SUID
去掉比较简单也是两种方法
- 直接数字不要前面的4
chmod 755 filename
-使用字母方式
chmod u-s filename
TIPS:实际上SUID是比较危险的,不能乱设。比如说root把vim这个指令设置的SUID,那么任何用户在执行vim时都是root用户,那不是可以打开/etc/shadow来修改密码了吗。