我正在運行的程序需要root權限,因此與sudo
一起運行,但它也需要知道用戶正在運行它。 getuid
和geteuid
都返回root
。我如何獲得實際的用戶名(或uid)?如果程序使用sudo運行,我如何獲得用戶真正的uid?
謝謝!
我正在運行的程序需要root權限,因此與sudo
一起運行,但它也需要知道用戶正在運行它。 getuid
和geteuid
都返回root
。我如何獲得實際的用戶名(或uid)?如果程序使用sudo運行,我如何獲得用戶真正的uid?
謝謝!
sudo
提供一些環境變量,以幫助您正是這種情況:
SUDO_UID Set to the user ID of the user who invoked
sudo
SUDO_USER Set to the login of the user who invoked sudo
steveayre指出在評論中,用戶可以在某些情況下設置這些環境變量;該sudo(8)
手冊頁包括部分:
The sudoers policy subjects variables
passed on the command line to the same restrictions as normal
environment variables with one important exception. If the
setenv option is set in sudoers, the command to be run has the
SETENV tag set or the command matched is ALL, the user may set
variables that would otherwise be forbidden. See sudoers(5)
for more information.
所以一定不要授予ALL
命令給用戶時,你需要依靠此功能。
審計系統提供的特定於Linux的audit_getloginuid()
功能可能有幫助;由於pam_loginuid(8)
僅針對「主要」守護進程(sshd
,login
,gdm
等)進行安裝,因此執行sudo(8)
時,審計uid將保持不變。
這將需要一點點配置;添加:
session required pam_loginuid.so
到/etc/pam.d/sshd
文件 - 無論和其他服務,你讓你的用戶使用。
確保pam_loginuid.so
沒有加載到/etc/pam.d/sudo
配置文件中。
你有兩個不錯的選擇......
更新:
The setuid bit是在文件模式下訪問權限標誌,使得程序以可執行文件所有者的能力運行。這就是sudo(1)能夠以root身份運行的東西... sudo程序本身具有此模式。
$ ls -l /usr/bin/sudo
-r-s--x--x 1 root wheel 272384 Jun 22 2009 /usr/bin/sudo*
製作節目setuid root的一個可能:
$ chown root a.out
$ chmod +s a.out
不用說,setuid root的程序應該濃墨重彩。如果您只需要訪問受保護的目錄或文件,則可以將setuid設置爲權限較低的用戶。
'setuid-on-execution'你能解釋一下嗎? – chacham15 2012-04-22 23:32:23
好的,請參閱更新... – DigitalRoss 2012-04-23 00:39:52
我真的很討厭使用環境變量,有沒有另一種方式? (我討厭使用它們的主要原因是因爲它們不可靠:從安全POV或兼容性POV) – chacham15 2012-04-22 22:48:02
環境變量應該是安全可信的 - 您必須完全信任'sudo'才能以此方式使用它。任何針對'sudo'的攻擊都允許信任度較低的用戶使用修改後的環境變量執行程序,這將會引起全球數十個安全團隊的關注,以解決該缺陷(或者在無法修復的情況下移除該功能)。至於兼容性,這比我剛想到的其他選項更具可移植性 - 分開回答自己的意見。這可能比編寫你自己的setuid-root程序更安全。 – sarnold 2012-04-22 23:02:51
我所指的安全問題來自系統上運行的其他程序或者可以修改環境變量的插件代碼。但是看到另一個解決方案如何工作,我可能最終會在程序啓動時自行緩存變量(所以希望在此之前沒有人會修改它)。 – chacham15 2012-04-22 23:12:59