"Después del juego es antes del juego"
Sepp Herberger

viernes, 13 de noviembre de 2020

Trabajando con polkit cuando los ficheros .pkla dejan de funcionar.

Usando polkit podemos permitir o prohibir a los usuarios determinadas acciones de configuración de partes del sistema.

Por ejemplo, para permitir a los usuarios del grupo "netdev" modificar conexiones wifi sin necesidad de contraseña de root distribuimos por puppet este fichero:
# cat /etc/polkit-1/localauthority.conf.d/10-org-freedesktop-network-manager-settings.pkla
[Allow group netdev create wireless connection for all users]
Identity=unix-group:netdev
Action=org.freedesktop.network-manager-settings.system.modify
ResultAny=no
ResultInactive=no
ResultActive=yes
Otro ejemplo, para impedir a los usuarios regulares reiniciar/suspender/apagar las máquinas de los espacios comunes usamos estas reglas:
# cat /etc/polkit-1/localauthority/50-local.d/disable-poweroff.pkla                                                             
[Disable power-off (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.power-off
ResultActive=no
ResultInactive=no
ResultAny=no

[Disable power-off when others are logged in (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.power-off-multiple-sessions
ResultActive=no
ResultInactive=no
ResultAny=no

# cat /etc/polkit-1/localauthority/50-local.d/disable-reboot.pkla                                                              
[Disable reboot (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot
ResultActive=no
ResultInactive=no
ResultAny=no

[Disable reboot when others are logged in (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot-multiple-sessions
ResultActive=no
ResultInactive

# cat /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla
[Disable suspend (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend
ResultActive=no
ResultInactive=no
ResultAny=no

[Disable suspend when others are logged in (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend-multiple-sessions
ResultActive=no
ResultInactive=no
ResultAny=no
Como vemos, todo consiste en meter un fichero .pkla en la ruta /etc/polkit-1/localauthority/50-local.d.

Hace poco, preparando unas máquinas con un Linux mas moderno (Manjaro LXDE 20) que el que usamos normalmente (Ubuntu 18 LTS) me he encontrado con que los ficheros .pkla son ignorados. Al parecer hasta polkit 0.105 funcionan, pero luego dejan de usarse y yo estaba trabajando con polkit 0.112. Como mas pronto que tarde tendremos este problema al subir de versión nuestro Ubuntu, mejor dejarlo ya anotado aquí para resolverlo cuando se nos presente.

Se trataba de tocar los permisos sobre org.freedesktop.NetworkManager.settings.modify.system, que son los referentes a modifcar conexiones de red del sistema. Veamos los permisos actuales usando el comando pkaction:
# pkaction -v -a org.freedesktop.NetworkManager.settings.modify.system
implicit any:      auth_admin_keep
implicit inactive: auth_admin_keep
implicit active:   auth_admin_keep
Están con el valor "auth_admin_keep", que significa que se pedirán permisos de root al realizar la acción org.freedesktop.NetworkManager.settings.modify.system. Mi intención es ponerlos todos a "no", ¿como se hace ahora que no hay ficheros pkla?. Pues hay dos vías:
  1. Modificar en el fichero /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy el nodo org.freedesktop.NetworkManager.settings.modify.system:
        ....
        ....
        <defaults>
          <allow_any>no</allow_any>
          <allow_inactive>no</allow_inactive>
          <allow_active>no</allow_active>
        </defaults>
        ....
        ....
    
  2. O bien, dejar el fichero anterior sin tocar y escribir una regla en JavaScript tal como cuentan aquí:
    # cat /etc/polkit-1/rules.d/00-networkmanager.rules 
    polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.NetworkManager.settings.modify.system")
    {
        polkit.log("NetworkManager.settings.modify.system: rule called");
        return polkit.Result.NO;
    }
    });
    
    Otro ejemplo, para impedir la suspensión del equipo sería así:
    # cat /etc/polkit-1/rules.d/01-suspend.rules 
    polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.suspend") {
        polkit.log("login1.suspend: rule called");
        return polkit.Result.NO;
    }
    });
    
    polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.suspend-multiple-sessions")
    {
        polkit.log("login1.suspend-multiple-sessions: rule called");
        return polkit.Result.NO;
    }
    });
    
El segundo método me gusta más porque el fichero /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy podría ser machacado en alguna actualización, mientras que las reglas son ficheros que creamos nosotros y no se borrarán.

No hay comentarios:

Publicar un comentario