esto es la suraguwiki el contenido, como puedes ver, deja mucho que desear para comentarios sobre los cosos aquí, puedes mandar un correo a diego arroba suragu punto net

Si eres un putísimo crack y quieres contribuir a esta wiki, pídeme una cuenta en el mismo correo de arriba

httpd(8)

Este artículo es sobre el httpd de OpenBSD, no confundir con el software de la fundación Apache con el mismo nombre.

Introducción

Realmente lo que se debería hacer es crear un servicio http con httpd en una IP privada/de loopback y luego usar relayd o haproxy para redirigir el tráfico al mundo de fuera. Idealmente el relayd o haproxy está en una máquina distinta1) (la máquina que da al internet). Esto lo hace mas seguro y mas fácil de gestionar al largo plazo (si quieres tener mas servicios además de httpd(8), como forgejo, por ejemplo).

Una de las características de seguridad que trae este httpd es que hace chroot a /var/www, por lo cual las peticiones HTTP y todo eso están encerradas en el chroot. Así que un atacante por HTTP no podría acceder, en principio, a tu host.

Por defecto el chroot está en /var/www, tenlo en cuenta cuando configures httpd, ya que sobrará esa parte y tendrás que tomar /var/www como / cuando configures httpd.

Configuración de ejemplo

La configuración de httpd se encuentra en /etc/httpd.conf. Puedes ver un ejemplo de como configurarlo en /etc/examples/httpd.conf (copiado aquí abajo)

Esta configuración es demasiado básica (aunque funciona perfectamente)

/etc/httpd.conf
# $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $
 
# Directory to chroot
chroot "/var/www"
 
# MIME types
 
include "/etc/mimetypes"
default type text/plain
 
server "example.com" {
        listen on * port 80
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
        location * {
                block return 302 "https://$HTTP_HOST$REQUEST_URI"
        }
}
 
server "example.com" {
        listen on * tls port 443
        tls {
                certificate "/etc/ssl/example.com.fullchain.pem"
                key "/etc/ssl/private/example.com.key"
        }
        root /sites/example.com # /var/www/sites/example.com
        location "/pub/*" {
                directory auto index
        }
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
}

Total, que esto crea un servicio en el puerto 80 que lo único que hace es redirigir todo el tráfico a el puerto 443 (en castellano: que redirige el HTTP a HTTPS). Todo con el dominio “example.com” (así que el certificado debería ser para ese dominio). Para generar certificados SSL fácilmente con OpenBSD vea acme-client. Que es certbot si fuese un buen programa.

Puedes iniciar httpd(8) con rcctl(8):

rcctl enable httpd
rcctl start httpd

Configuración de httpd mas avanzada

Lo de arriba está bien pero eventualmente vas a querer mas cosas como CGI o PHP. OpenBSD trae su propio servidor FastCGI así que esto es relativamente fácil. Debes iniciar el servicio con

rcctl enable slowcgi
rcctl start slowcgi

Aquí una configuración mas avanzada:

/etc/httpd.conf
  1. # Directory to chroot
  2. chroot "/var/www"
  3.  
  4. # MIME types
  5.  
  6. include "/etc/mimetypes"
  7. default type text/plain
  8.  
  9. server "suragu.net" {
  10. # For darknets
  11. alias loquesea.onion
  12. listen on 10.100.0.2 port 1341 # Cualquier puerto que no sea el 80
  13. listen on ::1 port 1341
  14. # Default log format
  15. log style forwarded
  16. errdocs "/sites/suragu.net/errdocs"
  17. gzip-static
  18. root "/sites/suragu.net"
  19. directory index "index.html"
  20. # Soporte de scripts CGI
  21. location match "/*.cgi" {
  22. fastcgi
  23. }
  24. # Soporte de scripts PHP
  25. # Requiere el paquete "php<version>"
  26. location match "*.php" {
  27. fastcgi socket "/var/www/run/php-fpm.sock"
  28.  
  29. }
  30. }

Atento a las líneas subrayadas. Son interesantes o deberás cambiarlas.

Cambia lo que te haga falta, como el root o la dirección a la que bindeas (que aconsejo que sea una dirección privada si vas a usar un proxy inverso para mostrar el sitio al mundo). En este caso la dirección me la he inventado

Tras reiniciar httpd nuevamente (con rcctl restart httpd) podrás hacer curl http://10.100.0.2:1341 y debería funcionar. También puedes probar los scripts de CGI

Como se avisó anteriormente, httpd(8) hace un chroot a /var/www y slowcgi es conciente de esto. Así que si tu script CGI usa Perl o Python, deberás copiar los intérpretes a /var/www/bin o /var/www/usr/bin. Tu sabrás como quieres hacerlo. También tendrás que instalar los módulos de Perl/Python que uses para tus scripts CGI en /var/www/usr/lib/perl5 y cosas así

Es un dolor de huevos. Pero también muy satisfactorio cuando funciona.

Suerte compañero. No estás solo.

Con esto ya tienes el servidor HTTP funcionando. ¡Felicidades!

¿Problemas?

Nos ha jodido que si no le va a doler nada. Lo primero que hay que ver es que le duele, esto se puede ver en /var/www/logs. Ahí tienes los logs y los error logs. Investígalos a ver que esconden. Seguro que te dicen exactamente lo que pasa.

Si httpd sencillamente se niega a arrancar, puedes iniciarlo verbosamente y sin demonio para ver que le duele (normalmente suele ser un error en la sintaxis del archivo de configuración). Esto se ve con el comando # httpd -dv

-d para que no se forkee en segundo plano y -v para que sea verboso.

Enlaces externos

1)
Suele ser la máquina firewall, la DMZ, el “nodo edge”, llámalo como quieras. La razón por la cual el proxy inverso/balancer/como le llames está en una máquina separada es porque es la mas vulnerable, el jodido SPOF. cuidala, hermano

QR Code
QR Code openbsd:httpd (generated for current page)