Restringir a alteração das configurações do xscreensaver pelo usuário

Restringir a alteração das configurações do xscreensaver pelo usuário

Eu gostaria de saber quais soluções as pessoas encontraram para restringir um usuário de alterar uma configuração do xscreensaver em todo o sistema. Parte do meu trabalho é gerenciar sistemas que exigem que a área de trabalho seja bloqueada em cerca de 10 minutos e só possa ser desbloqueada com uma senha. Quero usar um protetor de tela e, considerando que o xscreensaver é muito seguro com uma base de código madura, é uma escolha lógica.

Criei configurações apropriadas em /etc/X11/app-defaults/XScreenSaver*, mas o problema é que um usuário ainda pode alterar suas preferências pessoais executando xscreensaver-demo ou editando ~/.xscreensaver.

Eu entendo que existe uma maneira um pouco hackeada de fazer isso, removendo as permissões executáveis ​​​​de /usr/bin/xscreensaver-demo e alterando a propriedade de ~/.xscreensaver para root.

Se essa for a única maneira prática de fazer isso, como eu criaria ~/.xscreensaver com propriedade root no login inicial do usuário (no redhat e no debian/ubuntu)?

Responder1

Se os diretórios pessoais dos seus usuários estiverem em um disco local ou hospedados em um servidor Linux NFS no qual você tenha privilégios sudo/root, você poderá definir cada arquivo ~/.xscreensaver como "imutável".

sudo chattr +i /home/username/.xscreensaver

Isso impedirá que os usuários o modifiquem e excluam/movam/renomeiem-no.

Referência:http://sattia.blogspot.com/2015/01/how-to-make-file-immutable-on-linux.html

Responder2

Parece que isso não é realmente possível. Acabei modificando ligeiramente a fonte do xscreensaver para forçar certas configurações. Tentei usar a maneira menos invasiva de fazer isso com modificação mínima da fonte. Isso ainda permitirá que o usuário configure muitas partes do protetor de tela, mas não aquelas relacionadas ao bloqueio de tela e ao tempo limite.

Na árvore de origem encontre o arquivodriver/prefs.ce lá procure a funçãowrite_init_file. Nessa função encontre estas linhas:

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");

E mude para algo como o exemplo de origem abaixo. O que isso fará é evitar que essas configurações sejam salvas no arquivo .xscreensaver no diretório inicial do usuário. E então, desde que o padrão de todo o sistema esteja definido como você preferir, o xscreensaver continuará usando essas configurações no lugar do que seria configurado no arquivo .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");

Ache a função chamadaload_init_filee altere a linha:

else if (s && !strcasecmp (s, "off"))         p->mode = DONT_BLANK;

para:

else if (s && !strcasecmp (s, "off"))         p->mode = BLANK_ONLY;

Agora encontre a função apropriadamente nomeadapare_a_insanidadeque define alguns valores de preferências de volta a valores sensatos, como um tempo limite> 15 segundos será forçado para 15 segundos. Este é um bom local para garantir que quando um usuário edita manualmente o arquivo .xscreensaver em vez de usar xscreensaver-demo, os valores não serão usados ​​pelo xscreensaver, mas nossos valores "sensatos" serão usados.

Em funçãopare_a_insanidadeadicione algo assim, usando seus próprios valores, se desejar. Observe que os valores de tempo são segundos*1000. Caso o usuário defina o modo como "desligado", já o forçamos a ficar em branco acima.

if (p->timeout > 600000) p->timeout = 600000;
if (p->lock_timeout > 0) p->lock_timeout = 0;
if (! p->lock_p) p->lock_p = True;

Com relação à criação de .xscreensaver com propriedade root no login inicial, acho que isso não é realmente possível ou aconselhável. Você pode criar um script em /etc/profile.d que criará um .xscreensaver vazio no login do usuário. Mas a mudança acima mencionada torna isso desnecessário.

informação relacionada