限制用户更改 xscreensaver 设置

限制用户更改 xscreensaver 设置

我想知道人们想出了什么解决方案来限制用户更改 xscreensaver 的系统范围配置。我的部分工作是管理要求桌面在大约 10 分钟内锁定并且只能使用密码解锁的系统。我想使用一个屏幕保护程序,考虑到 xscreensaver 非常安全并且具有成熟的代码库,这是一个合乎逻辑的选择。

我在 /etc/X11/app-defaults/XScreenSaver* 中创建了适当的设置,但问题是用户仍然可以通过运行 xscreensaver-demo 或编辑 ~/.xscreensaver 来更改他们的个人偏好。

我知道有一种方法可以做到这一点,即从 /usr/bin/xscreensaver-demo 中删除可执行权限,并将 ~/.xscreensaver 的所有权更改为 root。

如果这是唯一可行的方法,那么我该如何在用户首次登录时(在 redhat 和 debian/ubuntu 中)创建具有 root 所有权的 ~/.xscreensaver?

答案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 的源代码以强制执行某些设置。我尝试使用侵入性最小的方法来实现这一点,对源代码的修改最少。这仍然允许用户配置屏幕保护程序的许多部分,只是不能配置与屏幕锁定和超时相关的部分。

在源树中找到文件驱动程序/prefs.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。但上述更改使这变得没有必要。

相关内容