授予使用者調度權限
我有一些使用
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_PATH
從rpath
. 這似乎是預期的行為。有沒有解決的辦法?在進行任何動態載入之前,我已經嘗試過
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)開始)。