Polkit kasutamine operatsioonisüsteemiga Debian

Allikas: Imre kasutab arvutit

Sissejuhatus

Polkit https://www.freedesktop.org/wiki/Software/polkit/ lahenduse abil saab privilegeerimata protsess sooritada privilegeeritud tegevusi; ehk tavakasutaja teha neid tegevusi, mis on tavaliselt lubatud vaid root kasutajale. Praktiliselt kasutatakse Polkit lahendust Linux graafilise kasutajaliidesega töökohaarvutis nt selleks, et

  • tavakasutaja saaks monteerida USB pulgal olevat failisüsteemi
  • seadistada wifi võrku
  • lülitada viisakalt arvuti välja

Reeglina ei ole serveris Polkit vajalik. Käesolev tekst põhineb Debian v. 9 Stretch ja Xfce keskkonna kasutamisele.

Mõisted

  • systemd-logind - süsteem võimaldab saada infot sisselogitud kasutaja kohta (sh kas sisse on logitud üle ssh eemalt või füüsilise arvuti X Window System konsoolilt)
  • ConsoleKit - systemd-logind eelkäija
  • Polkit - privileegide eleveerimise (suurendamise) süsteem
  • PolicyKit - Polkit eelkäija
  • D-Bus - arvutile/operatsioonisüsteemile lokaalne sõnumite vahetamise keskkond

Tööpõhimõte

Privileegide eleveerimise osas teevad koostööd mitu komponenti, üldise osa juurde esitatakse näiteks USB pulga monteerimine. Aadressil https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html esitatakse umbes sellised seosed Polkit kasutamises osalevate komponentide kohta

       parooli küsimise pop-up aken                                klientprogramm (nt udisksctl)
protsess polkit-gnome-authentication-agent-1
          (Authentication Agent)                                      (Subject)
 
                   |                                                      |
                   |                                                      |
-----------|-------|--------------- D-Bus -----------------|--------------|-------------------
           |                                               |
           |                                               |
 
        polkitd                                     serverprogramm (nt udisksd)
     (autentimine ja autoriseerimine)                 (Mechanism)
  

kus

  • klientprogramm udisksctl abil monteeritakse usb pulgal olev failisüsteem ja seejuures on vaja täiendavaid privileege
  • klientprogrammi käivitamisel ta leiab D-Bus pealt vajaliku teenuse st serverprogrammi (udisksd)
  • enne kui udisksd midagi sooritama hakkab, küsib ta D-Bus peal teenusena töötava polkitd käest luba
  • sõltuvalt Polkit seadistustest antakse see luba kohe või kasutajalt küsitakse täiendavalt parooli (kasutaja enda parooli uuesti, näiteks; X Window System konsoolil avaneb vastav popup aken)
  • udisksd korraldab failisüsteemi monteerimise ja edasi saab seda kasutada tavalisel viisil (tavaliste cd, cp jt mitte-polkit enabled programmidega)
  • sõnakasutus Mechanism rõhutab asjaolu. et udisksd programmi ei ole hardcode'itud ehk udisksd seadistutega kirjeldatud mida tema poole pööruv kasutaja tohib teha; selle teadmise saab ta polkitd käest üle D-Bus võrgu
  • nb! tundub, et usb pulgale saab X Window System keskkonna nö sisse vaadata enne monteerimist ka (seda võimaldab mingi muu polkit reegel?)

Väited

  • Polkit teeb koostööd systemd-logind lahendusega (varem consolekit) ja saab aru, kas kasutaja on lokaalne (polkit lingos active) või remote (polkit lingos inactive)
  • reeglina on samal kasutajal aktiivses rollis olles rohkem lubatud kui mitte-aktiivses rollis; nt kui kasutaja on lokaalselt oma laptop juures, siis ta saab ilma pikemata usb pulka monteerida, kuid olles loginud eemalt sisse oma töökohaarvutisse üle ssh mitte
  • Polkit on reeglina vajalik töökoharvutis, server arvutites (nt postimasinas, nimeserveris vms) ei peaks polkit protsessid töötama
  • Polkit lahendus töötab lokaalselt, st ühe operatsioonisüsteemi piires

Tundub, et Polkit abil saavad programmid töötada kahel viisil

  • otse, eeldusel, et neil on polkit tugi (nt udisksctl on ldd abil näha, et on lingitud vastu libpolkit teeke)
  • ilma Polkit toeta ja kasutades pkexec utiliiti (nt gparted, synaptic)

2017 aastal on levinud kaks polkit versiooni, seadistamine erineb oluliselt

  • <= 0.105 puhul on seadistusfail nn .ini formaadis (käesolevas tekstis käsitletakse põhiliselt sellist, nt Debian v. 9 kasutab v. 0.105)
# pkaction --version
pkaction version 0.105
  • > 0.105 puhul on seadistusfail JavaScript formaadis (nt Fedora v. 25)

Lisaks üldisele klientprogrammi käivitamisel privileegide eleveerimisele saab neid privileege kontrollida mingite alam-tegevuste täpsusega. Alamtegevusi kirjeldavad Action'id kataloogis

/usr/share/polkit-1/actions

Action sees on kirjas ka vaikimisi autoriseerimise reegid, lokaalselt vajalikud erisused asuvad kataloogis

/etc/polkit-1/localauthority

Action ja Authorize muudatused kehtestuvad koheselt, midagi reloadida, restartida ega sisse-välja logida ei ole vaja.

Oluline on tähele panna, et Polkit tegeleb ainult autentimise ja autoriseerimisega ning annab mingiks tegevuseks loa. Seejärel toimub edasine nö tavalisel viisil. Nt USB pulga monteerimisel on vaja nö erilist kliendi ja serveri tarkvara udisks*, kui aga failisüsteem on monteeritud, siis saab seda kasutada tavaliste mitte-polkit-enabled utiliitidega (ls, cd, cp jt).

Tarkvara paigaldamine

Tõenäoliselt ei ole vaja 2017 aastal Linux töökohaarvutisse Polkit tarkvara paigalda, see on seal vaikimisi olemas. Käesolev tekst keskendub tarkvara kasutamisele.

# dpkg -l \*polkit\* \*policykit\*
+++-==============================-============-========-=========================================================================
ii  libpolkit-agent-1-0:amd64      0.105-17     amd64    PolicyKit Authentication Agent API
ii  libpolkit-backend-1-0:amd64    0.105-17     amd64    PolicyKit backend API
ii  libpolkit-gobject-1-0:amd64    0.105-17     amd64    PolicyKit Authorization API
ii  policykit-1                    0.105-17     amd64    framework for managing administrative policies and privileges
ii  policykit-1-gnome              0.105-6      amd64    authentication agent for PolicyKit

Action

Actionid on kirjeldatud kataloogis ja üldiselt iga Polkit võimeline tarkvara tuleb koos oma actionitega

/usr/share/polkit-1/actions 

Action'ite nimekirja küsimine

$ pkaction 
com.hp.hplip.installplugin
com.ubuntu.pkexec.synaptic
com.ubuntu.softwareproperties.applychanges
org.debian.apt.cancel-foreign
org.debian.apt.change-config
org.debian.apt.change-repository
org.debian.apt.clean
org.debian.apt.get-trusted-vendor-keys
...

Konkreetse actioni kohta info küsimine

$ pkaction --verbose --action-id org.freedesktop.NetworkManager.settings.modify.hostname
org.freedesktop.NetworkManager.settings.modify.hostname:
  description:       Modify persistent system hostname
  message:           System policy prevents modification of the persistent system hostname
  vendor:            NetworkManager
  vendor_url:        http://www.gnome.org/projects/NetworkManager
  icon:              nm-icon
  implicit any:      auth_admin_keep
  implicit inactive: auth_admin_keep
  implicit active:   auth_admin_keep

kus

  • implicit * read esitavad vastavaid väärtusi policy failist
# cat /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.settings.modify.hostname
..
     <defaults>
      <allow_any>auth_admin_keep</allow_any>
      <allow_inactive>auth_admin_keep</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
...

parameetrite tähendused

  • allow_any -
  • allow_inactive - väärtus kehtib mitte-aktiivse st eemalt üle ssh vms viisil sisse loginud kasutaja kohta
  • allow_active - väärtus kehtib aktiivse st lokaalselt X konsooli kaudu sisse loginud kasutaja kohta

parameetrite väärtuste tähendused

  • no - policy keelab teenuse kasutamise tingimusteta
  • yes - policy lubab teenuse kasutamist tigimusteta
  • auth_self - policy lubab teenuse kasutamist peale seda kui kasutaja on sisestanud Authentication Agent dialoogis oma parooli
  • auth_admin - policy lubab teenuse kasutamist peale seda kui kasutaja on sisestanud Authentication Agent dialoogis administraatori parooli
  • *_keep - viivitab

Authorization rules

Autoriseerimise reeglid asuvad kataloogis

/etc/polkit-1/localauthority

Lisaks saab kataloogis

/etc/polkit-1/localauthority.conf.d

asuvate seadistusfailide abil määrata AdminIdentities väärtusi. See võimaldab kirjeldada lisaks kasutajaid, mis toimivad Polkit jaoks administraator kasutajatena. (Auth agent dialoogis pakutakse vajadusel valida sobiv kasutaja ja sisestada tema parool.)

Natively Polkit-enabled tarkvara kasutamine

polkit teegi vastu lingitud süsteemi paigaldatud programmid

# for i in /usr/bin/*; do if a=`ldd $i | grep -q polkit`; then echo $i; fi ; done
/usr/bin/nmcli
/usr/bin/pkaction
/usr/bin/pkcheck
/usr/bin/pkexec
/usr/bin/pkttyagent
/usr/bin/udisksctl
/usr/bin/xbrlapi
/usr/bin/xfce4-session

udisksd

udisks2 tarkvara sisaldab

  • udisksd - d-bus deemon (töötab root kasutajana, Polkit lingos Mechanism)
  • udisksctl - klientprogramm (kasutamiseks tavakasutajana, Polkit lingos Subject)
  • Polkit Actions ja Authorization Rules - udisksctl ja udisksd on ettevalmistatud suhtlema selliselt, et deemonilt küsitakse luba erinevateks tegevusteks; need erinevate tegevuste lubamiste tingimused on kirjas vastavates policites; selline asjakorraldus võimaldab deemonil teenindada pöördumisi paindlikult; tavaliselt tuleb tarkvaraga (nt udisks2) kaasa .policy failid st Actionid, aga reeglid kohendatakse kohapeal nagu tarvis (või kasutatakse vaikeväärtusi)

Kui kasutaja käivitab udisksctl programmi, siis

  • ta pöördub udisks deemoni poole
  • udisks deemon pöördub üle D-Bus Polkit Authority deemoni poole
  • Polkit vahenditega tehakse kindlaks, kas udisksctl programmi kasutajat teenindada
  • udisks saab vastuse Polkit Authority deemonilt ja täidab või ei täida kasutaja soovi

Seejuures

  • Polkit deemon võib kasutaja teenindamist lubada, aga alles juhul kui kasutaja on täiendavalt autenditud Authentication Agent abil (GUI keskkonna kasutajale avatakse aken ja küsitakse sisestada oma või admin privileegiga kasutaja parool)

USB pulga failisüsteemi monteerimine käsurealt kui see on Polkit rules poolt lubatud

$ udisksctl mount -b /dev/sda1
==== AUTHENTICATING FOR org.freedesktop.udisks2.filesystem-mount ===
Authentication is required to mount Kingston DataTraveler 3.0 (/dev/sda1)
Authenticating as: Imre Oolberg,,, (imre)
Password: 
==== AUTHENTICATION COMPLETE ===
Mounted /dev/sda1 at /media/imre/10E8-B208.

Tulemusena

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              495544       0    495544   0% /dev
...
/dev/sda1       30691680  198784  30492896   1% /media/imre/10E8-B208

Lahti monteerimine

$ udisksctl unmount -b /dev/sda1
Unmounted /dev/sda1.

nmcli

TODO

Üldotstarbelise tarkvara kasutamine pkexec abil

Tundub, et pkexec utiliidi abil saab käivitada programme üldotsarbeliselt privilegeeritud õigustes. Nt paketihaldusest paigaldatud gparted ja synaptic sisaldab kasutaja path peal selliseid nö wapper skripte

# cat /usr/bin/gparted-pkexec 
#!/bin/sh
pkexec "/usr/sbin/gparted" "$@"

# cat /usr/bin/synaptic-pkexec
#!/bin/sh
pkexec "/usr/sbin/synaptic" "$@"

Synaptic

Tavaliselt on Synaptic kasutamine lubatud ainult root kasutajale, polkit abil saab seda teha nii yhele konkreetsele tavakasutajale kattesaadavaks (mitte, et see oleks tingimata hea mote)

# cat /etc/polkit-1/localauthority/50-local.d/11-synaptic-for-priit.pkla 
[imre test]
Identity=unix-user:priit
Action=com.ubuntu.pkexec.synaptic
ResultAny=yes
ResultInactive=yes
ResultActive=yes

GParted

TODO

tcpdump

Nt tcpdump käivitamiseks kasutajana root sobib tekitada selline action fail

$ cat /usr/share/polkit-1/actions/com.ubuntu.pkexec.tcpdump.policy 
<?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/policyconfig.dtd">
<policyconfig>

  <action id="com.ubuntu.pkexec.tcpdump">
    <message>Authentication is required to run the tcpdump</message>
    <icon_name>gparted</icon_name>
    <defaults>
      <allow_any>auth_self</allow_any>
      <allow_inactive>auth_self</allow_inactive>
      <allow_active>auth_self</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/tcpdump</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

kus

  • TODO

ning lisaks

# cat /etc/polkit-1/localauthority/50-local.d/12-tcpdump.pkla 
[wireshark]
Identity=unix-user:priit
Action=com.ubuntu.pkexec.tcpdump
ResultAny=yes
ResultInactive=yes
ResultActive=yes

kus

  • TODO

tcpdump käivitamine GUI keskkonnast (st gnome polkit agent töötab taustab)

$ pkexec /usr/sbin/tcpdump -ni any icmp

Seejuures midagi ei küsita kuna Result* väärtused on 'yes'.

Authentication Agent

Polkit authentication agent käivitatakse xfce4-session protsessi poolt

# ps auxf
..
root      1762  0.1  1.3 297274 13742 ?        Ssl  15:20   0:13 /usr/lib/policykit-1/polkitd --no-debug
root      1764  0.1  1.3 297272 13744 ?        SLsl 15:20   0:13 /usr/sbin/lightdm
root      2060  0.0  0.6 243656  6796 ?        Sl   17:48   0:00  \_ lightdm --session-child 14 23
imre      2069  0.0  0.1   4288  1404 ?        Ss   17:48   0:00  |   \_ /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
imre      2106  0.0  0.0  11084   328 ?        Ss   17:48   0:00  |       \_ /usr/bin/ssh-agent x-session-manager
imre      2116  0.0  1.5 335948 15856 ?        Sl   17:48   0:00  |       \_ xfce4-session
imre      2163  0.0  1.4 311892 14724 ?        Sl   17:48   0:00  |          \_ /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
...

Kasutaja autentimine tema enda parooli küsimisega USB pulga monteerimisel paistab selline kui valida Xfce File Manageris Mount pulga peal

Polkit-1.gif

kus

  • ressursi nimi
  • Password: - oodatakse kasutaja enda parooli (muu juhul oleks seal kirjas, millise kasutaja parooli oodatakse)

Seda kutsub esile selline reegel

# cat /etc/polkit-1/localauthority/50-local.d/10-usb-mount.pkla
[usb mount]
Identity=unix-user:imre
Action=org.freedesktop.udisks2.filesystem-mount
ResultAny=auth_self
ResultInactive=auth_self
ResultActive=auth_self

Kui autentimiseks on vajalik admin kasutaja ja neid on mitu, siis paistab dialoog selline

Polkit-2.gif

Seda kutsub esile nt selline seadistusfail

# cat /etc/polkit-1/localauthority.conf.d/60-admin.conf
[Configuration]
AdminIdentities=unix-user:0;unix-user:mart;unix-user:priit

pkttyagent kasutamine

Kui tavaliselt toimub Polkit kasutamine GUI keskkonnas, siis pkttyagent võimaldab seda kasutada ilma graafilise keskkonnata. Nt eelnevalt kirjeldatud tcpdump kävitamisel käsurealt tuleb

  • avada samas arvutis ja sama kasutajana üle ssh sisse logides kaks shelli
  • vaatada teise selli PID ja öelda esimeses
$ pkttyagent --process 749
  • öelda teises shellis
$ pkexec /usr/sbin/tcpdump -ni any icmp
  • selle peale küsitake esimeses shellis kasutaja parool
$ pkttyagent --process 749
==== AUTHENTICATING FOR com.ubuntu.pkexec.tcpdump ===
Authentication is required to run the tcpdump
Authenticating as:
  • lõpuks teises shellis hakkab tcpdump tööle root kasutajana

Logi ja debugimine

Debugimiseks sobib teha selline muudatus

# cat /lib/systemd/system/polkit.service
[Unit]
Description=Authorization Manager
Documentation=man:polkit(8)

[Service]
Type=dbus
BusName=org.freedesktop.PolicyKit1
# ExecStart=/usr/lib/policykit-1/polkitd --no-debug
ExecStart=/bin/sh -c 'G_MESSAGES_DEBUG=all /usr/lib/policykit-1/polkitd > /tmp/polkitd.log 2>&1'

D-Bus osas

  • d-feed
  • dbus-monitor

Kasulikud lisamaterjalid