限制使用者更改 xscreensaver 設定

限制使用者更改 xscreensaver 設定

我想知道人們想出的任何解決方案來限制使用者更改 xscreensaver 的系統範圍配置。我的部分工作是管理系統,這些系統要求桌面在大約 10 分鐘內鎖定,並且只能使用密碼解鎖。我想使用一個螢幕保護程序,並且考慮到 xscreensaver 非常安全且具有成熟的程式碼庫,這是一個合乎邏輯的選擇。

我在 /etc/X11/app-defaults/XScreenSaver* 中創建了適當的設置,但問題是用戶仍然可以透過執行 xscreensaver-demo 或編輯 ~/.xscreensaver 來更改他們的個人偏好。

我知道有一種有點駭客的方法可以做到這一點,從 /usr/bin/xscreensaver-demo 中刪除可執行權限,並將 ~/.xscreensaver 的所有權更改為 root。

如果這是執行此操作的唯一實用方法,那麼我將如何在使用者首次登入時建立具有 root 所有權的 ~/.xscreensaver(在 redhat 和 debian/ubuntu 中)?

答案1

如果您的使用者的主目錄位於本機磁碟上,或者它們託管在您具有 sudo/root 權限的 Linux NFS 伺服器上,那麼您可以將每個 ~/.xscreensaver 檔案設定為「不可變」。

sudo chattr +i /home/username/.xscreensaver

這將防止用戶對其進行修改以及刪除/移動/重命名。

參考:http://sattia.blogspot.com/2015/01/how-to-make-file-immutable-on-linux.html

答案2

看起來這確實不可能。我最終稍微修改了 xscreensaver 的原始程式碼以強制執行某些設定。我嘗試使用侵入性最小的方法來完成此任務,並對原始程式碼進行最小程度的修改。這仍然允許用戶配置螢幕保護程式的許多部分,但不能配置有關螢幕鎖定和逾時的部分。

在原始碼樹中找到該文件驅動程式/首選項.c並在那裡尋找功能寫入初始化文件。在該函數中找到這些行:

if (!pr || !*pr)          ;
CHECK("timeout")          type = pref_time, t = p->timeout;
CHECK("cycle")            type = pref_time, t = p->cycle;
CHECK("lock")             type = pref_bool, b = p->lock_p;
CHECK("lockTimeout")      type = pref_time, t = p->lock_timeout;
(..)
CHECK("mode")             type = pref_str,
                          s = (p->mode == ONE_HACK ? "one" :
                               p->mode == BLANK_ONLY ? "blank" :
                               p->mode == DONT_BLANK ? "off" :
                               p->mode == RANDOM_HACKS_SAME
                               ? "random-same"
                               : "random");

並更改為類似下面的來源範例。這樣做的目的是防止這些設定保存到使用者主目錄中的 .xscreensaver 檔案中。然後,只要將系統範圍的預設設定設為您喜歡的任何內容,xscreensaver 就會繼續使用這些設定來取代 .xscreensaver 檔案中的配置。

if (!pr || !*pr)          ;
CHECK("timeout")          continue; /* don't save */
CHECK("cycle")            continue; /* don't save */
CHECK("lock")             continue; /* don't save */
CHECK("lockTimeout")      continue; /* don't save */
(..)
CHECK("mode")             type = pref_str,
                          s = (p->mode == ONE_HACK ? "one" :
                               p->mode == BLANK_ONLY ? "blank" :
                               p->mode == DONT_BLANK ? "blank" : /* prevents xscreensaver from being disabled, will force to blank */
                               p->mode == RANDOM_HACKS_SAME
                               ? "random-same"
                               : "random");

找到名為的函數載入初始化文件並更改行:

else if (s && !strcasecmp (s, "off"))         p->mode = DONT_BLANK;

到:

else if (s && !strcasecmp (s, "off"))         p->mode = BLANK_ONLY;

現在找到一個恰當命名的函數停止瘋狂它將某些首選項值設定回正常值,例如逾時 > 15 秒將被強制設定為 15 秒。這是一個好地方,可以確保當使用者手動編輯 .xscreensaver 檔案而不是使用 xscreensaver-demo 時,xscreensaver 不會使用這些值,而是使用我們的「正常」值。

功能中停止瘋狂添加類似的內容,如果需要,可以使用您自己的值。請注意,時間值為秒*1000。如果用戶將模式設為“關閉”,我們已經將其強制返回到上面的空白。

if (p->timeout > 600000) p->timeout = 600000;
if (p->lock_timeout > 0) p->lock_timeout = 0;
if (! p->lock_p) p->lock_p = True;

關於在初始登入時創建具有 root 所有權的 .xscreensaver,我認為這實際上是不可能或不建議的。您可以在 /etc/profile.d 中建立腳本,該腳本將在使用者登入時建立一個空的 .xscreensaver。但上述的改變使得這一點變得不必要。

相關內容