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



Leave a Reply