Ограничить изменение пользователем настроек 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