web-dev-qa-db-ja.com

gnomeはroot権限なしでどのように再起動しますか?

私は本を​​読んでいます Linuxカーネル開発 、第5章「システムコールの実装」77ページに

たとえば、capable(CAP_SYS_Nice)は、呼び出し元が他のプロセスのNice値を変更できるかどうかを確認します。デフォルトでは、スーパーユーザーはすべての機能を所有し、非ルートは何も所有していません。たとえば、これがreboot()システムコールです。その最初のステップが、呼び出しプロセスにCAP_SYS_REBOOTがあることを確認する方法に注意してください。その1つの条件ステートメントが削除された場合、どのプロセスでもシステムを再起動できます。

ただし、Debian Sidでは、gnomeを使用するか、Sudoまたはsuなしで/ sbin/rebootを実行することにより、マシンを再起動できます。これはどのように可能ですか?

多分systemctlで?

ls -l /sbin/reboot 
lrwxrwxrwx 1 root root 14 Jun 28 04:23 /sbin/reboot -> /bin/systemctl

編集:私のユーザーグループ

[damian@xvz:~]$ groups 
damian Sudo wireshark bumblebee

編集2:systemctlパーミッション

[damian@xvz:~]$ ls -l /bin/systemctl 
-rwxr-xr-x 1 root root 626640 Jun 28 04:23 /bin/systemctl
8
osdamv

これは、 polkit と呼ばれる承認マネージャーを介して行われます。

polkitは、特権プログラム( "MECHANISMS")が使用することを目的とした承認APIを提供し、多くの場合、何らかの形式のプロセス間通信メカニズムを介して非特権プログラム( "SUBJECTS")にサービスを提供します。

systemdおよびpolkitを使用すると、非リモートセッションのユーザーは電源関連のコマンドを発行できます。 polkitに登録されているすべてのアクションを一覧表示し、pkactionを使用してそれらの詳細を取得できます(引数なしで呼び出すと、すべてのアクションIDが一覧表示されます)。
この特定のケースでは、アクションIDはorg.freedesktop.login1.rebootしたがって、実行する場合:

pkaction --action-id org.freedesktop.login1.reboot --verbose

出力は次のようになります。

org.freedesktop.login1.reboot:
  description:       Reboot the system
  message:           Authentication is required for rebooting the system.
  vendor:            The systemd Project
  vendor_url:        http://www.freedesktop.org/wiki/Software/systemd
  icon:              
  implicit any:      auth_admin_keep
  implicit inactive: auth_admin_keep
  implicit active:   yes

ここに、 active: yesは、アクティブセッションのユーザーがシステムの再起動を許可されていることを意味します(polkitページの暗黙的な許可の詳細)。セッションがアクティブであるかどうかは、次の方法で確認できます。

loginctl show-session $ XDG_SESSION_ID --property = Active
Active=yes
12
don_crissti