建立需要 root 和其他使用者的啟動進程

建立需要 root 和其他使用者的啟動進程

我正在嘗試創建一個啟動進程的服務。

我希望進程的啟動能夠以 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;
}

相關內容