GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna forma de que los procesos no raíz se vinculen a puertos privilegiados en Linux?

De acuerdo, gracias a las personas que señalaron el sistema de capacidades y CAP_NET_BIND_SERVICE capacidad. Si tiene un kernel reciente, es posible usarlo para iniciar un servicio como no root pero vincular puertos bajos. La respuesta corta es que sí:

setcap 'cap_net_bind_service=+ep' /path/to/program

Y luego en cualquier momento program se ejecuta a partir de entonces tendrá el CAP_NET_BIND_SERVICE capacidad. setcap está en el paquete debian libcap2-bin .

Ahora las advertencias:

  1. Necesitará al menos un kernel 2.6.24
  2. Esto no funcionará si su archivo es un script. (es decir, usa una línea #! para iniciar un intérprete). En este caso, según tengo entendido, tendría que aplicar la capacidad al ejecutable del intérprete, lo que por supuesto es una pesadilla de seguridad, ya que cualquier programa que use ese intérprete tendrá la capacidad. No pude encontrar ninguna manera limpia y fácil de solucionar este problema.
  3. Linux deshabilitará LD_LIBRARY_PATH en cualquier program que tiene privilegios elevados como setcap o suid . Así que si tu program usa su propio .../lib/ , es posible que deba buscar otra opción, como el reenvío de puertos.

Recursos:

  • capabilities(7) página del manual. Lea esto largo y tendido si va a utilizar capacidades en un entorno de producción. Hay algunos detalles realmente complicados sobre cómo se heredan las capacidades a través de las llamadas exec() que se detallan aquí.
  • página man de setcap
  • "Enlazar puertos por debajo de 1024 sin root en GNU/Linux":el documento que primero me señaló hacia setcap .

Nota:RHEL agregó esto por primera vez en v6.


Puedes hacer una redirección de puerto. Esto es lo que hago para un servidor de políticas de Silverlight que se ejecuta en una caja de Linux

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

La forma estándar es hacerlos "setuid" para que se inicien como root, y luego descartan ese privilegio de root tan pronto como se vinculan al puerto, pero antes de que comiencen a aceptar conexiones. Puede ver buenos ejemplos de eso en el código fuente de Apache e INN. Me dijeron que Lighttpd es otro buen ejemplo.

Otro ejemplo es Postfix, que utiliza múltiples demonios que se comunican a través de conductos, y solo uno o dos de ellos (que hacen muy poco excepto aceptar o emitir bytes) se ejecutan como root y el resto se ejecuta con un privilegio menor.


Linux
  1. Linux:¿herramienta para medir la calidad de la entropía?

  2. ¿Hay alguna manera de inspeccionar el rpath actual en Linux?

  3. ¿Por qué no hay una API de DirectX para Linux?

  4. ¿Hay alguna manera de mejorar el rendimiento de las tuberías de Linux?

  5. ¿Hay alguna manera de dejar de escribir 'sudo' para cada pequeña cosa en Linux?

Cómo comprobar los puertos de escucha en Linux (Puertos en uso)

Cómo prepararse para el mal tiempo en Linux

¿Existe un cliente de OneDrive para Linux?

40 ejemplos útiles de comandos PS de Linux para aspirantes a administradores de sistemas

Comandos para la Gestión de Procesos en Linux

¿Hay algún equivalente de WinSCP para Linux?