本を読んでいますLinuxカーネルの開発77ページの第5章「システムコールの実装」で説明しました。
たとえば、Capable(CAP_SYS_NICE)は、呼び出し元が他のプロセスのnice値を変更できるかどうかを確認します。デフォルトでは、スーパーユーザーはすべての機能を持ち、root以外の人は何もしません。たとえば、ここで再起動()システムコールがあります。最初のステップは、呼び出しプロセスにCAP_SYS_REBOOTがあることを確認することです。条件文を削除すると、すべてのプロセスがシステムを再起動できます。
しかし、私のDebian Sidでは、gnomeを使用するか、/sbin/rebootを実行してsudoやsuなしでコンピュータを再起動できます。どうやってこれができますか?
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
答え1
これは、次の承認マネージャを介して行われます。polkit
:
polkitは、特権プログラム(「メカニズム」)で使用するための認証APIを提供し、通常はプロセス間通信メカニズムの形で無許可プログラム(「サブジェクト」)を提供します。
リモートセッションではないユーザーは、電源関連コマンドを実行できます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=yes