Método adecuado para adquirir acceso raíz en Linux para aplicaciones Qt

Buen día

Antecedentes:

Estoy creando una aplicación de contenedor OpenVPN para sistemas Linux que está casi terminada. Me he encontrado con un pequeño inconveniente.

OpenVPN requiere acceso de root para modificar las tablas de enrutamiento (agregar y eliminar rutas). Aquí es donde las cosas se ponen un poco vagas y confusas.

Con suerte, extendiendoesta pregunta, se podrían compartir algunas respuestas y soluciones estándar de la industria.

Documentación:

Entonces, después de varias horas de búsqueda, compilé una lista de posibles métodos para obtener acceso a la raíz, sin embargo, ninguno parece ser oficial ni ninguna guía sólida real para adquirir este privilegio SU.

Consideremos los siguientes métodos.

1. Usando pkexec y polkits

Por favor encuentre oficialdocumentación de Freedesktop Polkit aquí yaquí para obtener información sobre las mejores prácticas

Hay algunos tutoriales que se encuentran en línea usando pkexec y polkits:aquí, esto me ayudó a crear mi archivo polkit. -Hilo SO - y unpequeño tutorial encantador para aplicaciones Qt

Para dar una breve explicación (de mi comprensión) sobrepkexec ypolkits:

polkits:

los polkits consisten en acciones y reglas (ver documentación para leer y explicar en profundidad). Define las acciones de una aplicación y las reglas asociadas a ella. Las reglas se pueden definir como un usuario que pertenece a un grupo específico, mediante el cual la acción consulta la regla, si ha logrado pasar la regla, el usuario se autentica automáticamente (sin solicitud de contraseña emergente), de lo contrario, se requiere que ingrese un administrador contraseña

pkexec:

Una aplicación utilizada para interactuar con las acciones de Polkit y autenticar una aplicación para adquirir acceso raíz.

Estos requieren agregar una acción en/usr/share/polkit-1/actions/ y/usr/share/polkit-1/rules.d/ (entre otros directorios, consulte la documentación de todas las ubicaciones)

Este método parece estar bien utilizado (pero requiere un poco más de explicación para que se entienda fácilmente, en mi opinión)

nota: hayqt-polkit bibliotecas disponibles para su uso, consulte surepositorio github

Para una versión TL; DR simple, veaesta

El archivo polkit que creé (tenga en cuenta que esto puede no ser correcto, pero funciona para mí):

Ubicación donde se puede encontrar / agregar (también hay otros)

/usr/share/polkit-1/actions

Nombre del archivo del kit de políticas: com.myappname.something.policy // the.policy es requerido

Nota:

com.myappname.something

es referido como el espacio de nombres de la política (leyendo la documentación, esto no estará claro)

Contenido del kit de políticas

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD polkit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">
<policyconfig>
  <vendor>My App Name</vendor>
  <vendor_url>http://myappurl.com/</vendor_url>

  <action id="com.myappname.something.myaction-name">
    <description>Run the polkit for My App which requires it for X usage</description>
    <message>My App requires access to X, which requires root authentication, please let me have su access</message>
    <icon_name>myappname</icon_name>
    <defaults>
      <allow_any>auth_admin_keep</allow_any>
      <allow_inactive>auth_admin_keep</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/myappname</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

Notas sobre mi archivo de política (los bits importantes)

Este es solo un ejemplo; consulte la documentación para ver ejemplos y descripciones oficiales:<vendor>My App Name</vendor> es el nombre de la aplicación, puede tener espacios

<action id="com.myappname.something.myaction-name"> cualquier nombre de acción aquí.

¡NOTA! El nombre del archivo ->com.myappname.something.policy y elaction id ->com.myappname.something.myaction-name debería tener el mismo espacio de nombres

El nombre del icono debe estar de acuerdo con la última especificación de icono de freedesktop encontradaaquí

TL; DR (o no): las ubicaciones de los íconos son:

 1. /home/yourusername/.icons (sometimes not there)
 2. /home/yourusername/.local/share/icons
 2. /usr/share/icons

siempre y cuando se ajusten a los tamaños y sean un.png, solo puede pasar el nombre del archivo (omitiendo el formato)

Very Important:

<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/myappname</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>

Cuando llamepkexec <myappname>y NO tener estas líneas(Sinceramente, no estoy muy seguro de su propósito), uno se encontrará con un error similar a este:

2017-12-19 12::58:24 Fatal: QXcbConnection: Could not connect to display  ((null):0, (null))

Aborted (core dumped)

Nota: mantenga elkey igual, sin embargo, usted puede y probablemente debería cambiar elexec.path clave para la ubicación de su aplicación.

¿Cómo funcionan los kits de políticas?

En resumen, si revisas el encantadorejemplo mencionado anteriormente (y omitir todos los nombres muy similares de archivos), queda claro.

Cuando uno corre:

pkexec <myappname> 

Esto llama al agente de autenticación local para ejecutar la aplicación (en nuestro caso) como root.

Esto es manejado por elactions (el kit de políticas mencionado anteriormente). Además, las reglas utilizan elaction id para realizar consultas adicionales, etc. que se pueden ver en los ejemplos proporcionados anteriormente.

Una vez que se ha ingresado la contraseña de administrador, dependiendo de la 'configuración' ingresada en los valores predeterminados (veraquí), tenemos:

auth_admin_keep

Como auth_admin pero la autorización se mantiene por un breve período (por ejemplo, cinco minutos).

Por lo tanto, el usuario puede (en mi aplicación OpenVPN) conectarse a una conexión OpenVPN durante los próximos 5 minutos, hasta que se solicite nuevamente la contraseña.

2)Sudo (/ etc / sudoers):

Este parece ser el método de acceso para la mayoría de los usuarios que requieren acceso root, sin embargo, no se recomienda:

p.ej. Verifique el acceso raíz antes de ejecutar la aplicación principal llamando a un solo disparoQProcess con argumentos:

/bin/sh -c sudo -v

dará como resultado un código de salida de1 en varias distribuciones de Linux (lo que me hace buscar alternativas)

3. setuid ():

Una muy buenaejemplo se puede encontrar aquí, desafortunadamente no parece funcionar en las distribuciones modernas de Linux por ser un agujero de seguridad que puede explotarse fácilmente.

En resumen, el proceso requiere que uno:

chmod +x <executable>

y comprobando que els bit se establece en la aplicación usandogetuid() para obtener la identificación de usuario ygetgid() para obtener la identificación del grupo del usuario.

Estas funciones se pueden encontrar en los encabezados de Linux definidos por:

<sys/types.h> // defines structs
<unistd.h>    // defines methods

Sin embargo, esto no parece funcionar con los sistemas Linux modernos. Aquí está el resultado de ejecutar una aplicación propiedad de root con els conjunto de bits, ejecutar como un usuario normal (sin privilegios):

2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid, this is a security hole. ((null):0, (null))

Aborted (core dumped)

Despedida,setuid()

4. Otros métodos:

PAM

para leer más, ver

página mantutorial / explicación

A QT Forum pregunta sobre la integración PAM multiplataforma

QT usermode Qt proporciona unpequeña implementación para adquirir acceso root, pero solo está disponible para las distribuciones de Linux que usanyum gerente de empaquetación.

Una pregunta seguida sobre esto, veresta pregunta del foro QT

Problema:

Lo anterior solo puede incluir una pequeña porción de los métodos disponibles para adquirir acceso root, sin embargo, considerando que algunas aplicaciones se usan globalmente, a menudo son atacadas o separadas o incluso comprometidas.

Después de hacer esta investigación, ha ampliado mi conocimiento, pero no me ha dado un método seguro que se recomienda, pero solo insinúa.

Pregunta:

¿Qué método anterior se prefiere en la industria, es decir, cuándo debo usar uno sobre el otro (PAM vs polkits vs sudo simple) y si hay otros métodos disponibles, ¿son estos preferidos?

Respuestas a la pregunta(2)

Su respuesta a la pregunta