linux中suid和sgid详解
SUID:
SUID是Set UID的简称,翻译过来是设置用户ID,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限
例如:查看/usr/bin/passwd二进制文件的权限,如图:

上图中的用户权限组中的可执行权限(x)被s替换,此时passwd这个程序具备suid权限,无论哪个用户都有权限执行passwd,在执行passwd的时候,会临时获得文件所有者的权限,这就是为什么每个用户都可以调用passwd命令来修改自己的密码
使用SUID需要满足以下几个条件:
- SUID只对二进制文件有效
- 调用者对该文件有执行权
- 在执行过程中,调用者会暂时获得该文件的所有者权限
- 该权限只在程序执行的过程中有效
由于SUID只对二进制文件有效,因此我们可以根据需要将要设置的二进制文件赋予SUID权限,此时其他用户即具备了执行此文件的权限
赋予SUID权限的命令如下:
chmod u+s /usr/bin/passwd
例如:普通用户无法执行打开和关闭防火墙的命令,此时我们给予systemctl文件赋予SUID权限,然后在普通用户下执行,如图:

在普通用户下执行开启防火墙命令,如图:

SGID:
SGID即Set GID的缩写,它出现在文件所属组权限的执行位上面,它对普通二进制文件和目录都有效, 当它作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。当SGID作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
注意:通常情况下SGID只用来设置目录权限
例如:修改/tmp目录的文件夹权限为SGID,然后通过普通用户在该目录下创建文件,如图:


从上面可以看出,在普通用户下创建文件abcd,可以看出文件的属组继承的当前/tmp的属组,为root,如果不设置SGID,那么abcd文件的属主和属组都为admin_app
注意:SUID和SGID都是高危操作,使用要慎重


