Linux 技术手札

Linux 设定 setuid 及 setgid 权限

setuid 是档案权限其中一种特性, 档案加入 setuid 权限后, 其他用户可以用档案持有者身份执行档案。而 setgid 跟 setuid 类以, 是其他用户可以用档案所属群组的身份执行。

如果 setuid 使用不当, 会有很严重的安全问题, 所以使用前要小心。虽然有安全的问题, 但很多情况都要借助 setuid 解决, Linux 最常见的例子有 passwd 及 sudo, 一个普通帐号执行 passwd 修改自己的密码时, 其实是用 root 身份修改系统内的密码档; 而执行 sudo 时同样需要用 root 权限。

要查看档案是否有 setuid 及 setgid 权限, 可以用 ls 及 stat 指令便可以, 在权限字段看到小写 “s” 代表有 setuid 权限, 大写 “S” 代表 setgid 权限, 例如:

$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

在上面的 passwd 执行档, 看到权限是 “-rwsr-xr-x”, 前面那个 “s” 代表档案加入了 setuid 权限。

要自行加入 setuid 权限, 跟设定其他档案权限一样使使 chmod 指令, 例如要为 myscript.sh 加入 setuid 权限, 语法是这样:

$ chmod u+s myscript.sh

要移除 setuid 权限, 用 “u-s” 便可以:

$ chmod u-s myscript.sh

设定 setgid 权限, 语法跟上面差不多, 只是将 “u” 改成 “g” 即可, 加入 setgid 权限:

$ chmod g+s myscript.sh

移除 setgid 权限:

$ chmod g-s myscript.sh

除了用以上方法外, 如果将权限设定改成用数字的方法, 是在权限数值前加上 4 及 2, 例如加入 setuid 权限到 myscript.sh, 并设定权限为 777, 数值改成 4777 即可, 例如:

$ chmod 4777 myscript.sh

加入 setgid 权限:

$ chmod 2777 myscript.sh

要用数值的方法移除 setuid 及 setgid 权限, 只要将 “4” 或 “2” 改成 “0”:

$ chmod 0777 myscript.sh

由于 setuid 及 setgid 使用不当会有安全性问题, 有时需要找出所有 setuid 及 setgid 档案, 这个动作可以用 find 指令实现, 以下例子会在 /home/userhome 目录找出所有加入了 setuid 及 setgid 的档案:

$ find /home/userhome -type f -perm /6000 -exec stat -c “%A %a %n” {} \;

只找出 setuid 档案:

find / -type f -perm /4000

只找出 setgid 档案:

find / -type f -perm /2000
Exit mobile version