2012-05-11 30 views
5

Escribí mi propio servidor web en C. ¿Cómo puedo vincularlo al puerto 80 sin ser root para que la seguridad no se vea comprometida (desbordamientos de buffer, etc.)?Enlazar un servidor web al puerto 80 sin ser root

¿Debo simplemente reenviar el tráfico de otro servidor "estable" que se ejecuta en el puerto 80?

Respuesta

5

El uso de un proxy directo es la solución más fácil y recomendable. También tiene la ventaja de filtrar solicitudes horriblemente inválidas incluso antes de que lleguen a su servidor auto-escrito.
En caso de que su aplicación use la dirección IP del usuario para algo, recuerde recuperarla del encabezado que use su servidor web (X-Client-IP etc.). Sin embargo, solo debe hacerlo para las solicitudes que realmente provienen de su servidor web, de lo contrario, los usuarios pueden falsificar su IP. Puede hacerlo comprobando si la solicitud proviene de su IP y solo verifique el encabezado en este caso o simplemente haga que su aplicación se vincule a localhost.

Otra solución sería otorgarle al programa la capacidad CAP_NET_BIND_SERVICE. Esto requiere que root use setcap cap_net_bind_service=ep /path/to/the/executable - dado que el indicador se almacena en un atributo de sistema de archivos, se perderá al copiar el archivo a otro sistema o volver a compilar la aplicación.

Por supuesto, también puede hacer que su programa setuid root y luego cambiar a un usuario sin privilegios después de llamar al bind(). Sin embargo, dependiendo de cómo funciona su programa y lo que hace, podría no ser una buena idea, por ejemplo, si necesita cerrar y volver a abrir el puerto de escucha por alguna razón, requerirá un reinicio completo del proceso.

+0

+1 para capacidades, aunque no son portátiles para ningún otro Unix. – dwalter

+0

La mayoría de las personas usa Linux de todos modos. Y creo que * BSD tiene algo similar. – ThiefMaster

2

si quiere vincular su servidor al puerto 80, debe hacerlo como root y luego soltar los privilegios.

bind(sockfd, addr, addrlen); 
/* process is running as root, drop privileges after bind*/ 
if (setgid(groupid) != 0) 
    errx(1, "setgid: Unable to drop group privileges: %s", strerror(errno)); 
if (setuid(userid) != 0) 
    errx(1, "setuid: Unable to drop user privileges: %S", strerror(errno)); 

¿Cómo puedo enlazar al puerto 80 sin ser root para que la seguridad no está en peligro (desbordamientos de buffer etc.)

no se ejecutan como root hace no hacer su sistema más seguro solo agrega otra capa para explotar. Así que en lugar de pensar acerca de cómo no se debe ejecutar como root, asegúrese de que no se utiliza ninguna función conocida como insegura strcpy(), sprintf(), etc, pero en lugar de utilizar strncpy(), snprintf(), etc.

+0

Se debe mencionar que 'errx' es una función no estándar disponible en muchos sistemas derivados o compatibles con BSD. Si necesita su funcionalidad (que es una función trivial de 2 a 3 líneas), debe escribir la suya para no dañar la portabilidad de su programa. –

3

Una alternativa a llamar bind() como privilegios raíz, luego descarte, es tener un proceso raíz que crea el socket y lo vincula, y luego pasa el socket de escucha al proceso no privilegiado a través de una conexión de socket de dominio UNIX utilizando un mensaje SCM_RIGHTS.

2

Bueno, como saben, todos los puertos de menos de 1024 en Unix requieren privilegios de administrador para abrir. En un sistema Unix, no desea que se ejecuten las menos aplicaciones posibles con privilegios de administrador. Es y siempre será un gran riesgo de seguridad.

Una alternativa es usar iptables para redirigir el tráfico del puerto 80 a un puerto más inofensivo como 8080. Aquí hay un description sobre cómo configurarlo.

Iptables no es la herramienta más fácil de configurar, pero una vez que la domina, es muy útil y potente (y segura).

+0

Para mí esto solo funcionó en la tabla NAT en la cadena OUTPUT. Pero es la respuesta más directa a la pregunta. – nus

0

que trabajaron en este problema desde hace bastante tiempo y llegaron a la conclusión de que systemd + iptables es la solución, y no capacidades, como elaborated in great detail here.

Cuestiones relacionadas