
我正在嘗試創建一個啟動進程的服務。
我希望進程的啟動能夠以 root 身分執行一些命令,然後以特權較低的非人類使用者身分執行進程的其餘部分。
例如:我知道apache
使用者需要一些 root 權限才能使用連接埠進行一些 Web 伺服器配置並啟動各種伺服器進程,但它不會始終以 root 身分運行。我找不到任何執行與此類似的操作的程式碼,並且想知道是否還有其他可以使用的範例。
本質上我的問題是,如何授予非 root 使用者臨時 root 權限來運行特定的 root 進程?
或者我是否以錯誤的方式思考這個問題:我是否不授予使用者 root 權限,而是讓 root 使用者執行需要 root 的進程?
答案1
有很多選項,取決於您作為根用戶所做的事情。然而,對於自動化服務(「如 apache」),您通常以 root 身分啟動,然後降級為受限使用者。
Debian 風格的配置(包括 Ubuntu 和 Mint)將在 /etc/default/ 中有一個文件我的服務名稱設定切換到哪個使用者。其他 Linux 發行版有不同的位置來儲存設置,但技術最終是相同的。
如果您自己編寫服務程序,您將使用setuid()。一旦呼叫了 setuid,該程序就無法返回具有 root 權限。您將需要按名稱尋找用戶並且為使用者設定群組。
簡化我很久以前寫的一些程式碼:
int lockToUser(const char * user) {
# Look up the username in /etc/passwd
struct passwd * pwd = getpwnam(user);
if (!pwd) {
# Failed... Could not find user, see errno
return 0;
}
# setuid sets the user
# setgid sets the main group similar to the group in /etc/passwd
# Sets the other groups which will grant additional permissions.
# similar to the groups in /etc/groups
if (initgroups(user, pwd->pw_gid) || setgid(pwd->pw_gid) || setuid(pwd->pw_uid)) {
# Failed... Could not lock down to user, see errno
return 0;
}
return 1;
}