Permisos de archivos en Linux

Hola a todos. Nos estamos integrando activamente en el trabajo y ya en enero estamos preparando muchos lanzamientos potentes. Entre otros, se ha anunciado una nueva convocatoria para la querida curso. «Administrador de Linux». Antes del lanzamiento, tradicionalmente compartimos la traducción de material útil.

Permisos de archivos en Linux

Los permisos de archivos ofrecen una alternativa segura a los archivos ejecutables SUID, pero pueden parecer un poco confusos a primera vista.


Todos sabemos que los archivos binarios SUID son una mala solución desde el punto de vista de la seguridad. Afortunadamente, si su aplicación requiere ciertos privilegios limitados, existe una forma más eficaz, denominada permisos de archivo.

Te ahorraré tiempo si deseas evitar una lectura detallada del artículo anterior: en esencia, los permisos de archivos permiten a los procesos que se ejecutan en nombre del usuario root y, por lo tanto, tienen el derecho de hacer cualquier cosa, conservar ciertas capacidades, restringidas a esta lista, cuando despojan privilegios y se ejecutan como un usuario no privilegiado. Esto significa que si un atacante logra comprometer un proceso mediante un desbordamiento de búfer u otra explotación, no podrá aprovecharse de nada más que de ciertos privilegios mínimos, que realmente necesita el proceso.

Los permisos son excelentes para servicios que generalmente siempre se ejecutan en nombre del usuario root, pero ¿qué pasa con las utilidades de línea de comandos? Afortunadamente, esto también se admite, siempre que tengas las utilidades adecuadas instaladas. Si usas Ubuntu, por ejemplo, necesitarás el paquete libcap2-bin. También necesitarás ejecutar un kernel no arcaico (a partir de la versión 2.6.24).

Estas funciones permiten vincular permisos con archivos ejecutables de manera similar a la configuración del bit SUID, pero solo para un conjunto específico de permisos. La utilidad setcap se utiliza para agregar y eliminar permisos de un archivo.

El primer paso es seleccionar los permisos que necesitas. Para este artículo, supongo que hay una herramienta de diagnóstico de red llamada tracewalk, que debería poder usar sockets en crudo. Normalmente se requiere que la aplicación se ejecute en nombre del usuario root, pero al revisar la lista se revela que solo se requiere un permiso CAP_NET_RAW.

Suponiendo que está en el directorio donde se encuentra el archivo binario tracewalk, puede agregar este permiso de la siguiente manera:

sudo setcap cap_net_raw=eip tracewalk

Por ahora, ignore el sufijo =eip para el permiso, les hablaré de esto en un par de segundos. Tenga en cuenta que el nombre del permiso está en minúsculas. Ahora puede verificar si ha configurado correctamente los permisos con:

setcap -v cap_new_raw=eip tracewalk

O puede listar todos los permisos establecidos para el archivo ejecutable:

getcap tracewalk

Para su información, también puede eliminar todos los permisos del archivo ejecutable con:

setcap -r tracewalk

En este punto, debería poder ejecutar el archivo ejecutable como un usuario no privilegiado, y debería poder trabajar con sockets sin procesar, pero no tendrá ningún otro privilegio que posee el usuario root.

Entonces, ¿qué significa este extraño sufijo =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efectivos, heredados y permitidos (effective, inheritable y permitted):

  • Efectivos (Effective) los permisos son aquellos que determinan lo que el proceso puede realmente hacer. Por ejemplo, no puede interactuar con sockets sin procesar si CAP_NET_RAW no está en el conjunto efectivo.
  • Permitidos (Permitted) los permisos son aquellos que el proceso puede tener, si los solicita con la llamada correspondiente. No permiten que el proceso haga realmente nada, a menos que haya sido programado específicamente para solicitar el permiso indicado. Esto permite escribir procesos para agregar permisos especialmente importantes al conjunto efectivo solo por el tiempo que realmente se requieran.
  • Heredados (Inheritable) los permisos son aquellos que pueden ser heredados en el conjunto disponible de un proceso hijo. Durante la operación fork() o clone() al proceso hijo siempre se le da una copia de los permisos del proceso padre, ya que en este momento aún está ejecutando el mismo archivo ejecutable. El conjunto heredado se utiliza cuando exec() (o análogo) se llama para reemplazar el archivo ejecutable por otro. En este punto, el conjunto disponible del proceso se enmascara por el conjunto heredado para obtener el conjunto disponible que se utilizará para el nuevo proceso.

Por lo tanto, la utilidad setcap nos permite agregar permisos de estos tres conjuntos de forma independiente para este archivo ejecutable. Tenga en cuenta que el valor de los grupos se interpreta de manera un poco diferente para los permisos de archivo:

  • Líneas de alimentación duales disponibles 2×220 V los permisos de archivo son aquellos que siempre están disponibles para el archivo ejecutable, incluso si el proceso padre que lo invocó no los tenía. Anteriormente se les llamaba "permisos obligatorios".
  • Hereditarios los permisos de archivo definen una máscara adicional que también se puede utilizar para eliminar permisos del conjunto del proceso que llama. Se aplican además del conjunto heredado del proceso que llama, por lo que el permiso se hereda solo si existe en ambos conjuntos.
  • Efectivos los permisos de archivo son en realidad solo un bit, no un conjunto, y si se establece, significa que todo el conjunto de permisos disponible también se copia al conjunto efectivo del nuevo proceso. Esto puede ser usado para agregar permisos a los procesos que no fueron escritos específicamente para solicitarlos. Dado que es un solo bit, si lo establece para algún permiso, debe establecerse para todos los permisos. Puede pensar en él como un bit de legado, porque se usa para permitir el uso de permisos para aplicaciones que no los soportan.

Al especificar permisos a través de setcap tres letras e, i y p se refieren a efectivo, heredado y disponible conjuntos, respectivamente. Entonces, la especificación anterior:

sudo setcap cap_net_raw=eip tracewalk

… indica que el permiso CAP_NET_RAW debe añadirse a los conjuntos disponibles y heredados y que también debe establecerse el bit efectivo. Esto reemplazará cualquier permiso previamente establecido en el archivo. Para establecer varios permisos a la vez, use una lista separada por comas:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

La guía sobre permisos discute todo esto con más detalle, pero espero que esta publicación haya desmitificado un poco lo que está sucediendo. Solo queda mencionar algunas advertencias y trucos.

Primero, las capacidades de archivo no funcionan con enlaces simbólicos: debe aplicarlas al propio archivo binario (es decir, al destino del enlace simbólico).

En segundo lugar, no funcionan con scripts interpretados. Por ejemplo, si tienes un script de Python al que deseas asignar permisos, debes asignarlos al propio intérprete de Python. Esto es evidentemente un problema potencial de seguridad, ya que todos los scripts que se ejecuten con ese intérprete tendrán los permisos establecidos, aunque sigue siendo considerablemente mejor que usar SUID. La solución más común parece ser escribir un archivo ejecutable separado en C o un equivalente que pueda realizar las operaciones necesarias y llamarlo desde el script. Este enfoque es similar al utilizado por Wireshark, que emplea un archivo binario. /usr/bin/dumpcap para realizar operaciones privilegiadas:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

En tercer lugar, los permisos de archivos se desactivan si utilizas la variable de entorno LD_LIBRARY_PATH por razones evidentes de seguridad(1). Lo mismo se aplica a LD_PRELOAD, hasta donde sé.

1. Dado que un atacante evidentemente puede sustituir una de las bibliotecas estándar y usar LD_LIBRARY_PATH, para hacer que su biblioteca se llame preferiblemente antes que la del sistema, y, por lo tanto, tener su propio código arbitrario ejecutándose con los mismos privilegios que la aplicación que lo invoca.

Eso es todo. Puedes obtener más información sobre el programa del curso en el webinar que se llevará a cabo el 24 de enero.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster