Назад | Перейти на главную страницу

Запретить пользователю изменять настройки xscreensaver

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

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

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

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

Если домашние каталоги ваших пользователей находятся на локальном диске или они размещены на сервере 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

Похоже, это на самом деле невозможно. В конечном итоге я немного изменил источник 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");

Найдите функцию с именем 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;

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