Permisos de ficheiros en Linux

Ola a todos. Estamos a traballar activamente e xa estamos preparando moitos lanzamentos potentes en xaneiro. Entre outros, anunciouse a inscrición para unha nova emisión do curso favorito de todos. "Administrador Linux". Antes do lanzamento, tradicionalmente compartimos traducións de material útil.

Permisos de ficheiros en Linux

Os permisos dos ficheiros ofrecen unha alternativa segura aos executables SUID, pero ao principio poden parecer un pouco confusos.


Todos sabemos que os binarios SUID son mala decisión dende o punto de vista da seguridade. Afortunadamente, se a túa aplicación require algúns privilexios limitados, hai un xeito máis eficiente de chamar permisos de ficheiros.

Aforrareiche tempo se queres evitar ler o artigo anterior en detalle: esencialmente, os permisos de ficheiros permiten procesos que se executan como root e, polo tanto, poden facer algo para conservar certas capacidades, limitadas. esta listacando eliminan privilexios e son executados por un usuario sen privilexios. Isto significa que se un atacante consegue comprometer un proceso mediante un desbordamento de búfer ou outro exploit, non poderá aproveitar nada máis que certos privilexios mínimos que realmente necesita o proceso.

Os permisos son excelentes para servizos que normalmente sempre se executan como root, pero que pasa coas utilidades de liña de comandos? Afortunadamente, isto tamén é compatible sempre que teñas instaladas as utilidades adecuadas. Se estás a usar Ubuntu, necesitarás, por exemplo, o paquete libcap2-bin. Tamén terás que executar un núcleo non arcaico (da versión 2.6.24).

Estas funcións permiten que se asocien permisos a ficheiros executables, de xeito similar á configuración do bit SUID, pero só para un conxunto específico de permisos. Utilidade setcap úsase para engadir e eliminar permisos dun ficheiro.

O primeiro paso é seleccionar os permisos que necesitas. Polo ben deste artigo, supoño que hai unha ferramenta de diagnóstico de rede chamada tracewalk, que debería poder usar enchufes en bruto. Isto xeralmente require que a aplicación se execute como root, pero ao ver a lista resulta que só se precisa permiso CAP_NET_RAW.

Asumindo que estás no directorio onde se atopa o binario tracewalk, podes engadir este permiso así:

sudo setcap cap_net_raw=eip tracewalk

Ignora o sufixo polo momento =eip para resolver, falarei diso nun par de segundos. Teña en conta que o nome do permiso está en minúscula. Agora podes comprobar se configuraches os permisos correctamente con:

setcap -v cap_new_raw=eip tracewalk

Ou pode enumerar todos os permisos establecidos para un executable determinado:

getcap tracewalk

Como referencia, tamén pode eliminar todos os permisos do executable con:

setcap -r tracewalk

Neste punto, debería poder executar o executable como un usuario sen privilexios, e debería poder traballar con sockets en bruto, pero non ter ningún dos outros privilexios que ten o usuario root.

Entón, que significa este sufixo estraño? =eip? Isto require unha certa comprensión da natureza dos permisos. Cada proceso ten tres conxuntos de permisos − eficaz, herdable e permitido:

  • Eficaz Os permisos son aqueles que definen o que realmente pode facer un proceso. Por exemplo, non pode tratar con sockets en bruto se CAP_NET_RAW non está no conxunto efectivo.
  • Dispoñible os permisos son aqueles que un proceso pode ter se os solicita mediante a chamada correspondente. Impiden que un proceso faga algo a menos que se escribise especificamente para solicitar o devandito permiso. Isto permite que se escriban procesos para engadir permisos críticos ao conxunto efectivo só durante o período en que sexan realmente necesarios.
  • Herdable os permisos son aqueles que se poden herdar no conxunto accesible do proceso fillo xerado. Durante a cirurxía fork() ou clone() o proceso fillo sempre recibe unha copia dos permisos do proceso pai xa que aínda está a executar o mesmo executable nese momento. Úsase un conxunto herdable cando exec() (ou equivalente) é chamado para substituír o ficheiro executable por outro. Neste punto, o conxunto dispoñible do proceso está enmascarado polo conxunto herdable para obter o conxunto accesible que se utilizará para o novo proceso.

Entón a utilidade setcap permítenos engadir os permisos destes tres conxuntos de forma independente para un executable determinado. Teña en conta que o significado dos grupos interprétase de forma lixeiramente diferente para os permisos dos ficheiros:

  • Dispoñible Os permisos de ficheiro son aqueles que están sempre dispoñibles para un ficheiro executable, aínda que o proceso principal que o chamou non os tivese. Antes chamábanse permisos "forzosos".
  • Herdado os permisos dos ficheiros definen unha máscara adicional que tamén se pode usar para eliminar permisos do conxunto do proceso de chamada. Aplícanse ademais do conxunto herdado do proceso de chamada, polo que o permiso só se herda se existe nos dous conxuntos.
  • Eficaz Os permisos dos ficheiros son en realidade só un bit, non un conxunto, e se se establecen, significa que todo o conxunto dispoñible tamén se copia no conxunto efectivo do novo proceso. Isto pódese usar para engadir permisos a procesos que non foron escritos especificamente para solicitalos. Dado que é un bit, se o configuras para calquera permiso, debe configurarse para todos os permisos. Pódese pensar nel como un bit herdado porque se usa para permitir que aplicacións que non os admitan usen permisos.

Ao especificar permisos mediante setcap tres letras e, i и p refírense a eficaz, herdable e accesible conxuntos respectivamente. Entón, a especificación anterior:

sudo setcap cap_net_raw=eip tracewalk

...indica que a resolución CAP_NET_RAW debe engadirse aos conxuntos dispoñibles e herdables e que tamén se debe establecer o bit efectivo. Isto anulará os permisos establecidos previamente no ficheiro. Para establecer varios permisos á vez, utiliza unha lista separada por comas:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Guía de permisos analiza todo isto con máis detalle, pero esperamos que esta publicación desmitifique un pouco o que está a suceder. Só quedan algunhas advertencias e trucos por mencionar.

En primeiro lugar, as capacidades dos ficheiros non funcionan coas ligazóns simbólicas; tes que aplicalas ao propio ficheiro binario (é dicir, ao destino da ligazón simbólica).

En segundo lugar, non funcionan con guións interpretados. Por exemplo, se tes un script de Python ao que queres asignarlle permiso, debes asignalo ao propio intérprete de Python. Obviamente, este é un problema de seguranza potencial porque entón todos os scripts executados con ese intérprete terán o permiso especificado, aínda que aínda é moito mellor que facelo SUID. A solución máis común parece ser escribir un executable separado en C ou equivalente que poida realizar as operacións necesarias e chamalo desde un script. Isto é semellante ao enfoque utilizado por Wireshark que usa un binario /usr/bin/dumpcap para realizar operacións privilexiadas:

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

En terceiro lugar, os permisos dos ficheiros están desactivados se usa unha variable de ambiente LD_LIBRARY_PATH por razóns de seguridade obvias(1). O mesmo aplícase a LD_PRELOAD, Polo que eu sei.

1. Xa que un atacante obviamente pode substituír unha das bibliotecas estándar e usar LD_LIBRARY_PATHpara obrigar a chamar a súa biblioteca con preferencia á do sistema e, polo tanto, ter o seu propio código arbitrario executado cos mesmos privilexios que a aplicación de chamada.

Iso é todo. Podes consultar máis detalles sobre o programa do curso en webinar, que terá lugar o 24 de xaneiro.

Fonte: www.habr.com

Engadir un comentario