나는 책을 읽고 있습니다리눅스 커널 개발, 77페이지의 5장 "시스템 호출 구현"에서 설명했습니다.
예를 들어, Capable(CAP_SYS_NICE)은 호출자가 다른 프로세스의 nice 값을 수정할 수 있는지 여부를 확인합니다. 기본적으로 수퍼유저는 모든 기능을 갖고 루트가 아닌 사람은 아무 기능도 갖지 않습니다. 예를 들어, 여기 재부팅() 시스템 호출이 있습니다. 첫 번째 단계는 호출 프로세스에 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