web-dev-qa-db-ja.com

Sudoユーザーがシステムにログインしていないときにroot権限(Ubuntu OS)で特定のプログラムを実行するにはどうすればよいですか?

Sudoユーザーがシステムにログインしていないときに、root権限で特定のプログラム(Ubuntu OS)を実行するにはどうすればよいですか?プログラムが正しく機能するには、root権限が必要です。通常のユーザーは、このプロセスをシャットダウンできないはずです。たとえば、管理者とクライアントの2人のユーザーがいます。プログラムは、クライアントがシステムにログインしたときにのみ起動する必要があります。 root権限が必要であり、クライアントはこのプロセスをシャットダウンできないはずです。

3
Alexander

これを行うにはいくつかの方法があります。 UbuntuのグラフィカルログインはGDM(またはKubuntuを使用している場合はKDM)によって提供されます。 GDMは、Upstartサブシステムによって開始されます。

起動プロセスは次の手順に従います:

  1. システムが起動します。 Upstartは、GDM(/ etc/init/gdm)などのサービスを開始します。
  2. GDMが起動し、Xサーバーを初期化し(/ etc/gdm/Init/*)、GUIログインウィンドウを表示します。
  3. ユーザーがログインします。
    1. PAM認証が発生します(/etc/pam.d/gdm
    2. GDMはPostLoginスクリプト(/ etc/gdm/PostLogin/*)を実行します。
    3. GDMはPreSessionスクリプト(/ etc/gdm/PreSession/*)を実行します。
    4. GDMはXsessionおよびxinitスクリプトを実行します
      / etc/gdm/Xsession/ etc/X11/xinit/xinitrc.d/*/ etc/X11/Xsession/ etc/X11/Xsession.d/*
  4. ユーザーのデスクトップが表示されます。

スクリプトを実行する場所

XSessionより前のすべてがrootとして実行されます。/ etc/gdm/Xsessionそしてその後のすべてはユーザーとして実行されます。これにより、スクリプトを実行するためのここでの3つの実際のオプションが残ります。

  1. GDM/KDMのPostLoginまたはPreSessionスクリプトを変更してプログラムを実行します。ユーザー名は、[〜#〜] user [〜#〜]または[〜#〜] username [〜#〜]環境変数で使用できます。

  2. PAMを使用してスクリプトを実行します。 PAMは、承認ユーザーを PAM_USER 環境変数。これを/etc/pam.d/gdmに追加して、スクリプトを開始します。

    auth  required  pam_exec.so   /path/to/your/script
    
    • PAMを使用して特定のユーザーを照合できる場合があるため( この回答のように )、スクリプトはそのユーザーに対してのみ実行され、ユーザー自体を照合する必要はありません。その方法を説明するPAMの専門知識がありません。

  3. アップスタートスクリプトを書く プログラムを実行します。スクリプトはユーザーのログイン時に開始されるため、GDMのPreSessionスクリプトによって発行されるdesktop-session-startシグナルを探します。

    したがって、Upstartスクリプトは、そのシグナルを実行トリガーとして検出します。

    # start when GDM's PreSession script runs
    start on desktop-session-start
    

    PreSessionからのシグナルはユーザー名を渡さないため、シグナルを微調整する必要があります。/ etc/gdm/PreSession/Defaultで、initctl行を見つけて、これに変更します。[〜#〜] user [〜#〜]の代わりに[〜#〜] username [〜#〜]を使用することもできます。

    # add USER variable so Upstart script can find it
    initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
    

    詳細については、 pstart およびその startingevent のマンページを参照してください。


管理者ユーザーを回避する方法

スクリプトは、これらのメソッドの1つから取得した環境変数のユーザー/ユーザー名を調べ、それを使用して中止するか続行するかを決定する必要があります。標準のシェルスクリプト方式が機能します。上記のリストから選択した開始場所によっては、ユーザー名が[〜#〜] user [〜#〜][〜#〜] username [〜#〜 ]、または PAM_USER 環境変数。

7
quack quixote

setuid を使用して、常にプログラムをrootとして実行できます。セキュリティの観点から、これはおそらく非常に、非常に悪い考えです。ユーザーの1人がsetuidプログラムを悪用した場合、サーバー全体へのルートアクセスが許可されます

1
Mike1980