私は本を読んでいます 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
これは、 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