setuid 是檔案權限其中一種特性, 檔案加入 setuid 權限後, 其他用戶可以用檔案持有者身份執行檔案。而 setgid 跟 setuid 類以, 是其他用戶可以用檔案所屬群組的身份執行。
如果 setuid 使用不當, 會有很嚴重的安全問題, 所以使用前要小心。雖然有安全的問題, 但很多情況都要借助 setuid 解決, Linux 最常見的例子有 passwd 及 sudo, 一個普通帳號執行 passwd 修改自己的密碼時, 其實是用 root 身份修改系統內的密碼檔; 而執行 sudo 時同樣需要用 root 權限。
要查看檔案是否有 setuid 及 setgid 權限, 可以用 ls 及 stat 指令便可以, 在權限欄位看到小寫 “s” 代表有 setuid 權限, 大寫 “S” 代表 setgid 權限, 例如:
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
在上面的 passwd 執行檔, 看到權限是 “-rwsr-xr-x”, 前面那個 “s” 代表檔案加入了 setuid 權限。
要自行加入 setuid 權限, 跟設定其他檔案權限一樣使使 chmod 指令, 例如要為 myscript.sh 加入 setuid 權限, 語法是這樣:
要移除 setuid 權限, 用 “u-s” 便可以:
設定 setgid 權限, 語法跟上面差不多, 只是將 “u” 改成 “g” 即可, 加入 setgid 權限:
移除 setgid 權限:
除了用以上方法外, 如果將權限設定改成用數字的方法, 是在權限數值前加上 4 及 2, 例如加入 setuid 權限到 myscript.sh, 並設定權限為 777, 數值改成 4777 即可, 例如:
加入 setgid 權限:
要用數值的方法移除 setuid 及 setgid 權限, 只要將 “4” 或 “2” 改成 “0”:
由於 setuid 及 setgid 使用不當會有安全性問題, 有時需要找出所有 setuid 及 setgid 檔案, 這個動作可以用 find 指令實現, 以下例子會在 /home/userhome 目錄找出所有加入了 setuid 及 setgid 的檔案:
只找出 setuid 檔案:
只找出 setgid 檔案: