Ограничить возможность пользователя изменять настройки xscreensaver

Ограничить возможность пользователя изменять настройки xscreensaver

Я хотел бы узнать, какие решения люди придумали, чтобы ограничить пользователя от изменения общесистемной конфигурации xscreensaver. Часть моей работы заключается в управлении системами, в которых есть требование, чтобы рабочий стол блокировался примерно через 10 минут и мог быть разблокирован только с помощью пароля. Я хочу использовать одну заставку, и учитывая, что xscreensaver очень безопасен и имеет зрелую кодовую базу, это логичный выбор.

Я создал соответствующие настройки в /etc/X11/app-defaults/XScreenSaver*, однако проблема в том, что пользователь все равно может изменить свои личные предпочтения, запустив xscreensaver-demo или отредактировав ~/.xscreensaver.

Я понимаю, что есть немного хакерский способ сделать это, удалив права на исполнение из /usr/bin/xscreensaver-demo и изменив владельца ~/.xscreensaver на root.

Если это единственный практический способ сделать это, как мне создать ~/.xscreensaver с правами root при первом входе пользователя в систему (в Redhat и Debian/Ubuntu)?

решение1

Если домашние каталоги ваших пользователей находятся на локальном диске или размещены на сервере Linux NFS, на котором у вас есть привилегии sudo/root, то вы можете сделать каждый файл ~/.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и там ищем функцию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");

Найдите функцию, которая называетсязагрузка_инициализационного_файлаи измените строку:

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;

Что касается создания .xscreensaver с правами root при первом входе в систему, я думаю, что это не совсем возможно или целесообразно. Вы можете создать скрипт в /etc/profile.d, который создаст пустой .xscreensaver при входе пользователя в систему. Но вышеупомянутое изменение делает это ненужным.

Связанный контент