Linux

我怎樣才能放棄特權並仍然清理 /var/run 中的 pid 文件?

  • August 17, 2021

我有一個名為foo. 我的 init 腳本/etc/init.d/foo啟動foo守護程序並將其 pidfile 儲存在 中/var/run/foo.pid,這似乎是標準位置。因為/etc/init.d/foo必須以 root 身份執行,所以在/var/run.

foo守護程序實際上/usr/sbin/foo是打算由 init 腳本以 root 身份呼叫的程序,但隨後會立即將其權限授予非特權使用者foo。但是,我還希望該/usr/sbin/foo程序在由於嚴重錯誤而退出時刪除其 pidfile。但是由於它已經放棄了它的權限,它不再具有從/var/run目錄中刪除文件的能力。

我目前的方法是使用seteuid而不是setuid放棄我的權限,然後在退出之前立即重新提升權限,以便我可以從/var/run. 但是,我遇到了很多很多關於各種庫和外部程序的問題,當使用與 uid 不同的 euid 呼叫時,這些問題會變得混亂。

有沒有其他方法可以做到這一點?我想另一種選擇是將我的 pidfile 放在 root 和foo使用者都可寫的目錄中。但是我們所有的其他 pidfiles 都在 中/var/run,包括其他以非特權使用者身份執行的程序的 pidfiles,所以我也想把foo.pid文件放在那裡。

除了使用之外還有什麼方法可以做到這一點seteuid

不要把PID文件/var/run/foo.pid放進去,把它放進去/var/run/foo/foo.pid已經/var/run/foo歸使用者foo和組所有foo。這樣,您可以在退出之前刪除 pid 文件,而不必提高您的權限級別。

但是請注意,這是一種不好的安全做法,因為允許您的非特權應用程序對其文件進行破壞會打開一個安全漏洞:想像您的應用程序被劫持(畢竟如果不期望應用程序可以被攻擊了?)——現在,攻擊者更新了 pid 文件並把 sshd 的 pid 號放在那裡。現在,當系統範圍的腳本(以 root 身份執行)嘗試使用該 pid 文件停止您的應用程序時,它們將關閉 sshd。這只是一個例子,還有更多的方式來濫用你的系統。總而言之,應該在刪除權限之前創建pid 文件,並且應該由系統範圍的腳本執行 pid 文件的清理。——德米特里·D·赫列布尼科夫

一個更好的主意是切換到像 systemd 或 Upstart 這樣不需要 PID 文件來管理服務的初始化系統。

引用自:https://serverfault.com/questions/197716