Linux

限制使用者更改 xscreensaver 設置

  • March 11, 2015

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

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

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

如果這是唯一可行的方法,我將如何在使用者初始登錄時(在 redhat 和 debian/ubuntu 中)創建具有 root 所有權的 ~/.xscreensaver?

看起來這是不可能的。我確實最終稍微修改了 xscreensaver 的源以強制某些設置。我嘗試使用侵入性最小的方式來實現這一點,而對原始碼的修改最少。這仍然允許使用者配置螢幕保護程序的許多部分,而不是關於螢幕鎖定和超時的部分​​。

在原始碼樹中找到文件driver/prefs.c並在其中查找函式write_init_file。在該函式中找到這些行:

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");

找到名為load_init_file的函式並更改行:

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

到:

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

現在找到恰當命名的函式stop_the_insanity,它將一些偏好值設置回正常值,例如超時 > 15 秒將被強制為 15 秒。這是確保當使用者手動編輯 .xscreensaver 文件而不是使用 xscreensaver-demo 時,xscreensaver 不會使用這些值的好地方,而是使用我們的“正常”值。

在函式stop_the_insanity 中添加類似這樣的內容,如果需要,可以使用您自己的值。請注意,時間的值為秒*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。但是上面提到的改變使得這沒有必要。

如果您的使用者的主目錄位於本地磁碟上,或者它們託管在您擁有 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

引用自:https://serverfault.com/questions/672882