pam_apparmor
PolKit (formerly known as PolicyKit) is an application framework that
acts as a negotiator between the unprivileged user session and the
privileged system context. Whenever a process from the user session
tries to carry out an action in the system context, PolKit is queried.
Based on its configuration—specified in a so-called
“policy”—the answer could be “yes”,
“no”, or “needs authentication”. Unlike
classical privilege authorization programs such as sudo, PolKit does
not grant root
permissions to an entire session, but only to
the action in question.
PolKit works by limiting specific actions by users, by group, or by name. It then defines how those users are allowed to perform this action.
When a user starts a session (using the graphical environment or on the console), each session consists of the authority and an authentication agent. The authority is implemented as a service on the system message bus, whereas the authentication agent is used to authenticate the current user, which started the session. The current user needs to prove their authenticity, for example, using a passphrase.
Each desktop environment has its own authentication agent. Usually it is started automatically, whatever environment you choose.
PolKit's configuration depends on actions and authorization rules:
*.policy
)
Written as XML files and located in
/usr/share/polkit-1/actions
. Each file defines
one or more actions, and each action contains descriptions and
default permissions. Although a system administrator can write their
own rules, PolKit's files must not be edited.
*.rules
)
Written as JavaScript files and located in two places:
/usr/share/polkit-1/rules.d
is used for third
party packages and /etc/polkit-1/rules.d
for
local configurations. Each rule file refers to the action specified
in the action file. A rule determines what restrictions are allowed
to a subset of users. For example, a rule file could overrule a
restrictive permission and allow some users to allow it.
PolKit contains several commands for specific tasks (see also the specific man page for further details):
pkaction
Get details about a defined action. See Section 19.3, “Querying Privileges” for more information.
pkcheck
Checks whether a process is authorized, specified by either
--process
or --system-bus-name
.
pkexec
Allows an authorized user to execute the specific program as another user.
pkttyagent
Starts a textual authentication agent. This agent is used if a desktop environment does not have its own authentication agent.
At the moment, not all applications requiring privileges use PolKit. Find the most important policies available on openSUSE® Leap below, sorted into the categories where they are used.
Set scheduling priorities for the PulseAudio daemon |
Add, remove, edit, enable or disable printers |
Modify schedule |
Modify system and mandatory values with GConf |
Change the system time |
Manage and monitor local virtualized systems |
Apply and modify connections |
Read and change privileges for other users |
Modify defaults |
Update and remove packages |
Change and refresh repositories |
Install local files |
Rollback |
Import repository keys |
Accepting EULAs |
Setting the network proxy |
Wake on LAN |
Mount or unmount fixed, hotpluggable and encrypted devices |
Eject and decrypt removable media |
Enable or disable WLAN |
Enable or disable Bluetooth |
Device access |
Stop, suspend, hibernate and restart the system |
Undock a docking station |
Change power-management settings |
Register product |
Change the system time and language |
Every time a PolKit-enabled process carries out a privileged operation,
PolKit is asked whether this process is entitled to do so. PolKit
answers according to the policy defined for this process. The answers can
be yes
, no
, or
authentication needed
. By default, a policy contains
implicit
privileges, which automatically apply to all
users. It is also possible to specify explicit
privileges which apply to a specific user.
Implicit privileges can be defined for any active and inactive sessions. An active session is the one in which you are currently working. It becomes inactive when you switch to another console for example. When setting implicit privileges to “no”, no user is authorized, whereas “yes” authorizes all users. However, usually it is useful to demand authentication.
A user can either authorize by authenticating as root
or by
authenticating as self. Both authentication methods exist in four
variants:
The user always needs to authenticate.
The authentication is bound to the instance of the program currently running. After the program is restarted, the user is required to authenticate again.
The authentication dialog offers a check button
. If checked, the authentication is valid until the user logs out.The authentication dialog offers a check button
. If checked, the user needs to authenticate only once.Explicit privileges can be granted to specific users. They can either be granted without limitations, or, when using constraints, limited to an active session and/or a local console.
It is not only possible to grant privileges to a user, a user can also be blocked. Blocked users cannot carry out an action requiring authorization, even though the default implicit policy allows authorization by authentication.
Each application supporting PolKit comes with a default set of implicit policies defined by the application's developers. Those policies are the so-called “upstream defaults”. The privileges defined by the upstream defaults are not necessarily the ones that are activated by default on SUSE systems. openSUSE Leap comes with a predefined set of privileges that override the upstream defaults:
/etc/polkit-default-privs.standard
Defines privileges suitable for most desktop systems
/etc/polkit-default-privs.restrictive
Designed for machines administrated centrally
To switch between the two sets of default privileges, adjust the value
of POLKIT_DEFAULT_PRIVS
to either
restrictive
or standard
in
/etc/sysconfig/security
. Then run the command
set_polkit_default_privs
as root
.
Do not modify the two files in the list above. To define your
own custom set of privileges, use
/etc/polkit-default-privs.local
. For details, refer
to
Section 19.4.3, “Modifying Configuration Files for Implicit Privileges”.
To query privileges use the command pkaction
included
in PolKit.
PolKit comes with command line tools for changing privileges and
executing commands as another user (see
Section 19.1.3, “Available Commands” for a short
overview). Each existing policy has a speaking, unique name with which it
can be identified. List all available policies with the command
pkaction
. See man pkaction
for more
information.
If you want to display the needed authorization for a given policy (for
example, org.freedesktop.login1.reboot
) use
pkaction
as follows:
tux >
pkaction -v --action-id=org.freedesktop.login1.reboot
org.freedesktop.login1.reboot:
description: Reboot the system
message: Authentication is required to allow 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
The keyword auth_admin_keep
means that users need to
enter a passphrase.
pkaction
on openSUSE Leap
pkaction
always operates on the upstream defaults.
Therefore it cannot be used to list or restore the defaults shipped with
openSUSE Leap. To do so, refer to
Section 19.5, “Restoring the Default Privileges”.
Adjusting privileges by modifying configuration files is useful when you want to deploy the same set of policies to different machines, for example to the computers of a specific team. It is possible to change implicit and explicit privileges by modifying configuration files.
The available actions depend on what additional packages you have
installed on your system. For a quick overview, use
pkaction
to list all defined rules.
To get an idea, the following example describes how the command
gparted
(“GNOME Partition Editor”)
is integrated into PolKit.
The file
/usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policy
contains the following content:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd"> <policyconfig> 1 <action id="org-opensuse-policykit-gparted"> 2 <message>Authentication is required to run the GParted Partition Editor</message> <icon_name>gparted</icon_name> <defaults> 3 <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> < allow_active>auth_admin</allow_active> </defaults> <annotate 4 key="org.freedesktop.policykit.exec.path">/usr/sbin/gparted</annotate> <annotate 4 key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
Root element of the policy file. | |
Contains one single action. | |
The | |
The |
To add your own policy, create a .policy
file with
the structure above, add the appropriate value into the
id
attribute, and define the default permissions.
Your own authorization rules overrule the default settings. To add your
own settings, store your files under
/etc/polkit-1/rules.d/
.
The files in this directory start with a two-digit number, followed by a
descriptive name, and end with .rules
. Functions
inside these files are executed in the order they have been sorted in.
For example, 00-foo.rules
is sorted (and hence
executed) before 60-bar.rules
or even
90-default-privs.rules
.
Inside the file, the script checks for the specified action ID, which is
defined in the .policy
file. For example, if you
want to allow the command gparted
to be executed by
any member of the admin
group, check for the action ID
org.opensuse.policykit.gparted
:
/* Allow users in admin group to run GParted without authentication */ polkit.addRule(function(action, subject) { if (action.id == "org.opensuse.policykit.gparted" && subject.isInGroup("admin")) { return polkit.Result.YES; } });
Find the description of all classes and methods of the functions in the PolKit API at http://www.freedesktop.org/software/polkit/docs/latest/ref-api.html.
openSUSE Leap ships with two sets of default authorizations, located
in /etc/polkit-default-privs.standard
and
/etc/polkit-default-privs.restrictive
. For more
information, refer to
Section 19.2.3, “Default Privileges”.
Custom privileges are defined in
/etc/polkit-default-privs.local
. Privileges defined
here will always take precedence over the ones defined in the other
configuration files. To define your custom set of privileges,
do the following:
Open /etc/polkit-default-privs.local
. To define a
privilege, add a line for each policy with the following format:
<privilege_identifier> <any session>:<inactive session>:<active session>
For example:
org.freedesktop.policykit.modify-defaults auth_admin_keep_always
The following values are valid for the SESSION placeholders:
yes
grant privilege
no
block
auth_self
user needs to authenticate with own password every time the privilege is requested
auth_self_keep_session
user needs to authenticate with own password once per session, privilege is granted for the whole session
auth_self_keep_always
user needs to authenticate with own password once, privilege is granted for the current and for future sessions
auth_admin
user needs to authenticate with root
password every time
the privilege is requested
auth_admin_keep_session
user needs to authenticate with root
password once per
session, privilege is granted for the whole session
auth_admin_keep_always
user needs to authenticate with root
password once,
privilege is granted for the current and for future sessions
Run as root
for changes to take effect:
# /sbin/set_polkit_default_privs
Optionally check the list of all privilege identifiers with the
command pkaction
.
openSUSE Leap comes with a predefined set of privileges that is activated by default and thus overrides the upstream defaults. For details, refer to Section 19.2.3, “Default Privileges”.
Since the graphical PolKit tools and the command line tools always
operate on the upstream defaults, openSUSE Leap includes an additional
command-line tool, set_polkit_default_privs
. It resets
privileges to the values defined in
/etc/polkit-default-privs.*
. However, the command
set_polkit_default_privs
will only reset policies that
are set to the upstream defaults.
Make sure /etc/polkit-default-privs.local
does not
contain any overrides of the default policies.
Policies defined in
/etc/polkit-default-privs.local
will be applied
on top of the defaults during the next step.
To reset all policies to the upstream defaults first and then apply the openSUSE Leap defaults:
tux >
sudo
rm -f /var/lib/polkit/* && set_polkit_default_privs