Scheduling

授予使用者調度權限

  • September 20, 2018

我有一些使用sched_setscheduler的程式碼sched.h

sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);

但是,除非我使用sudo. 我寧願不以root特權執行應用程序。

我有沒有辦法在不授予完全 root 權限的情況下授予使用者或程序對此功能的訪問權限?

  • 編輯 -

derobert對使用功能給出了很好的回答。postinst中,我簡單地添加:

setcap cap_sys_nice+ep /path/to/myapp

這裡的問題是:

bin$ ./myapp
./myapp error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

該程序失去了$LD_LIBRARY_PATHrpath. 這似乎是預期的行為。有沒有解決的辦法?

在進行任何動態載入之前,我已經嘗試過setcap cap_setpcap+ep myapp使用prctl(PR_CAPBSET_DROP, CAP_SETPCAP);,但這似乎沒有幫助。

我有一個解決方案,雖然它有點奇怪並且在作業系統中暴露了一個漏洞。

期間postinst,我:

cp $(which chrt) bin/chrt
setcap cap_sys_nice+ep bin/chrt

然後在程式碼中,我啟動一個程序:

bin/chrt -o -p 70 getpid()

我們剛剛暴露的漏洞是任何使用此版本的人chrt都可以在沒有管理員權限的情況下進行操作。由於我正在執行這是一個非常受控的目標環境,因此我可以接受這個漏洞,但我不會推薦那些無法控制其目標環境的人。

更改您的調度程序和優先級應該只需要該CAP_SYS_NICE功能;請參閱sched(7) 的權限和資源限制。您可能還想查看 的手冊頁sched_setscheduler,其中提到了 sched(7)。

有幾種方法可以讓你的程序具備這種能力;最簡單的可能是setcap

# setcap cap_sys_nice=ep /usr/local/bin/your-program

這與 set-user-id 類似,但受到更多限制(因為它只提供一種功能)。當然,CAP_SYS_NICE 有效地授予程序掛起系統的權限(通過實時任務佔用所有 CPU 時間)。

其他方法包括使用以root 身份執行的包裝器(丟棄所有其他權限)或使案例如RealtimeKit/PolicyKit 的提升。

(有關功能的更多資訊,我建議從capabilities(7)開始)。

引用自:https://unix.stackexchange.com/questions/455084