ユーザーが xscreensaver 設定を変更することを制限する

ユーザーが xscreensaver 設定を変更することを制限する

ユーザーが xscreensaver のシステム全体の設定を変更できないように制限する解決策があれば知りたいです。私の仕事の一部は、デスクトップが約 10 分でロックされ、パスワードでのみロック解除できるという要件を持つシステムを管理することです。私は 1 つのスクリーンセーバーを使用したいのですが、xscreensaver は成熟したコード ベースで非常に安全であることを考えると、これは論理的な選択です。

/etc/X11/app-defaults/XScreenSaver* に適切な設定を作成しましたが、問題は、ユーザーが xscreensaver-demo を実行したり、~/.xscreensaver を編集したりすることで、個人の設定を変更できることです。

これを実行するには、/usr/bin/xscreensaver-demo から実行権限を削除し、~/.xscreensaver の所有権を root に変更するという、少しハックっぽい方法があることは理解しています。

これが唯一の実用的な方法である場合、ユーザーの最初のログイン時にルート所有権で ~/.xscreensaver を作成するにはどうすればよいでしょうか (redhat および debian/ubuntu)?

答え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そしてそこで関数を探します書き込み初期化ファイルその関数内で次の行を見つけます。

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 であることに注意してください。ユーザーがモードを「オフ」に設定した場合、上記のように強制的に空白に戻されます。

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 を作成することができます。ただし、上記の変更により、そのスクリプトは不要になります。

関連情報