
儘管斯特羅德希望轉向環境變數的「現代」解決方案,但他顯然感受到了來自損壞系統的更廣泛暴露所帶來的壓力。因此,截至撰寫本文時,他對該錯誤的最新評論是:“是的,我正在考慮放棄這一點。”因此Fedora 25很可能會看到一個更新,將登入shell還原到登入過程中; 「適當的修復」將等待稍後。
現在是 Fedora 28...我們在「正確修復」方面處於什麼位置?是否有一種前瞻性的方法讓使用者為其會話設定環境變數?
即可以在 Fedora 上工作的替代品~/.bash_profile
,希望在其他地方也可以工作。
答案1
對於 GNOME 3.24,Strode恢復的 gnome 會話透過執行登入 shell 載入環境變數。
在同一則評論中,他們包含了 gnome-session 的補丁,以將這些會話環境變數推送到 systemd 使用者服務。這些包括gnome-terminal
,所以它相當重要:)。
GDM 會話啟動器已經修補過的在 3.22 中,從 導入環境systemd --user
。因此systemd環境被匯入到會話中,然後由登入shell修改,結果也被複製回systemd --user
.
應該可以正常工作...除了在 Fedora 28 上進行測試之外,它不能正常工作,例如 PATH,因為 gdm 會話啟動器不允許 systemd 環境變數覆蓋預先存在的環境。我已在 GNOME 問題追蹤器上報告了該問題。
它是同意(login
適用於文字控制台)可以在啟動使用者 shell 之前接受一些補丁來載入環境配置,但到目前為止沒有任何變化實用程式Linux v2.32。
我甚至沒有費心去尋找 ssh 補丁:)。
systemd 環境已經可以在user.conf
.作為這項工作的一部分,systemd v233獲得一種格式,現在支援在現有或搜尋清單environment.d/
中新增額外的目錄。PATH
LD_LIBRARY_PATH
我認為為用戶登入設定環境變數的最佳位置是在 PAM 模組中 - 我們甚至已經這樣做了pam_env
。 邏輯是
要求登入、gdm、sshd(這永遠不會發生)等來做到這一點確實是一個糟糕的解決方案。
不幸的是,發行版之間的配置pam_env
令人煩惱地不一致......而且似乎有一個很好的理由。~/.pam_environment
特點被認為是安全的大“槍”。也可以看看CVE-2010-4708。
看看
pam_exec
例如。您可以想像系統管理員使用它來進行一些登入後配置或其他操作,但使用者可以透過設定 LD_PRELOAD 來獲得 root 權限。或者 pam_selinux 實際上直接使用 pam_getenv,因此用戶可能會搞砸它。但我的觀點並不是這些具體的例子,它只是為了說明以root 身份執行此操作存在風險,並且我們可以完全繞過這些風險,消除一整類潛在的安全錯誤,方法是稍後再執行此操作。作為一般規則,如果您不需要程式碼以 root 身分運行,則它不應該以 root 身分運行!當然,我仍然很困惑,因為從邏輯上講,稍後再做會更尷尬,但毫無疑問,以 root 身份執行此操作比以用戶身份執行此操作風險更大。pam_exec 手冊明確指出:“pam_exec 呼叫的命令需要知道用戶可以控制[原文如此]環境。”
關於。 pam_env,注意 fedora 將其置於 pam 堆疊頂部並預設為停用 ~/.pam_environment。
將其放在堆疊頂部是一個錯誤,並且違反了不要這樣做的明確警告:“由於 PAM 環境變數的設定可能會對其他模組產生副作用,因此該模組應該是堆疊上的最後一個。”
[...]考慮到這裡的混亂,這顯然是一把步槍
使用 shell 配置的整體想法似乎也適用於 Ubuntu Desktop 16.04 圖形登入。然而,有一點不同。 Fedora~/.bash_profile
預設創建,這(對於 bash)會~/.profile
被忽略。 Ubuntu 和其他基於 Debian 的發行版~/.profile
是預設創建的。 (即,當您建立新使用者時,會從 中提供這些檔案/etc/skel
)。
(我最近在 Ubuntu 上使用過這個。Ubuntu 似乎隨著時間的推移而發生了變化,為 GUI 會話運行登入 shell。例如,參見https://superuser.com/questions/183870/difference- Between-bashrc-and-bash-profile/183980#183980,https://askubuntu.com/questions/40287/etc-profile-not-being-sourced,“為什麼 gnome-terminal 不是登入 shell”, 和“shell 登入意味著什麼('bash -l')”)。