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

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

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

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

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

2 ответа

Решение

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

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

Если домашние каталоги ваших пользователей находятся на локальном диске или они размещены на NFS-сервере Linux, на котором у вас есть права sudo / root, тогда вы можете установить каждый файл ~ /.xscreensaver как "неизменяемый".

sudo chattr +i /home/username/.xscreensaver

Это не позволит пользователям изменять его и удалять / перемещать / переименовывать.

Ссылка: http://sattia.blogspot.com/2015/01/how-to-make-file-immutable-on-linux.html

Другие вопросы по тегам