사용자가 xscreensaver 설정을 변경하는 것을 제한합니다.

사용자가 xscreensaver 설정을 변경하는 것을 제한합니다.

사용자가 xscreensaver의 시스템 전체 구성을 변경하지 못하도록 제한하는 솔루션이 있는지 알고 싶습니다. 제가 맡은 업무 중 하나는 데스크톱이 약 10분 안에 잠기고 비밀번호를 통해서만 잠금을 해제할 수 있는 시스템을 관리하는 것입니다. 하나의 화면 보호기를 사용하고 싶고 xscreensaver가 성숙한 코드 기반으로 매우 안전하다는 점을 고려하면 논리적인 선택입니다.

/etc/X11/app-defaults/XScreenSaver*에 적절한 설정을 생성했지만 문제는 사용자가 xscreensaver-demo를 실행하거나 ~/.xscreensaver를 편집하여 개인 기본 설정을 계속 변경할 수 있다는 것입니다.

/usr/bin/xscreensaver-demo에서 실행 권한을 제거하고 ~/.xscreensaver의 소유권을 루트로 변경하는 약간의 해킹 방법이 있다는 것을 이해합니다.

이것이 이 작업을 수행하는 유일한 실용적인 방법이라면 사용자가 처음 로그인할 때(redhat 및 debian/ubuntu에서) 루트 소유권을 사용하여 ~/.xscreensaver를 만드는 방법은 무엇입니까?

답변1

사용자의 홈 디렉터리가 로컬 디스크에 있거나 sudo/root 권한이 있는 Linux NFS 서버에서 호스팅되는 경우 각 ~/.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-demo를 사용하는 대신 .xscreensaver 파일을 직접 편집할 때 해당 값이 xscreensaver에서 사용되지 않고 "정상" 값이 대신 사용되도록 하는 좋은 지점입니다.

기능 중광기를 멈춰라원하는 경우 자신의 값을 사용하여 이와 같은 것을 추가하십시오. 시간 값은 초*1000입니다. 사용자가 모드를 "off"로 설정한 경우 위에서는 이미 강제로 공백으로 되돌렸습니다.

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를 생성하는 것은 실제로 가능하지도 않고 바람직하지도 않다고 생각합니다. 사용자 로그인 시 빈 .xscreensaver를 생성하는 스크립트를 /etc/profile.d에 생성할 수 있습니다. 그러나 위에서 언급한 변경으로 인해 그러한 작업이 불필요해졌습니다.

관련 정보