Securizar Apache HTTPS(SSL)
Oct 15, 07 by Juan Lebrijo about blog, security, Web, Services
Os voy a contar como montar un servidor web seguro con Apache2 y las herramientas de OpenSSL. Para esto queremos que la raiz del sistema con todas las configuraciones del sitio, vaya encriptado. Creamos los certificados:
  • Generación de llave privada:
openssl genrsa 1024 > web.key
  • Sin contraseña para que arranque automáticamente.
  • Generación de petición del certificado:
openssl req -new -key web.key -out web.csr
  • Generación del certificado con una validez de 10000 días, firmado por nosotros mismos.
openssl req -x509 -days 10000 -key web.key -in web.csr -out web.crt
Instalamos el módulo mod_ssl en nuestro apache (mejor dicho lo habilitamos):
elite:~# cd /etc/apache2/mods-enabled/
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.conf ssl.conf
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.load ssl.load
elite:/etc/apache2/mods-enabled# /etc/init.d/apache restart
Para crear un host virtual que tirara de ssl tendriamos que incluir la declaración del puerto, y el Host. Les pongo una declaración mínima:
#NameVirtualHost *:443
<VirtualHost *>
	ServerName www.midominioseguro.com
        DocumentRoot /var/www/midominioseguro/

        SSLEngine On
        SSLCertificateFile /root/web.crt
        SSLCertificateKeyFile /root/web.key
</ VirtualHost>
Activando el modo SSL con la directiva SSLEngine, y pasándole la clave pública (ó dertificado) web.crt, y la privada web.key. De esta forma podrán acceder desde cualquier cliente a la web: https://www.midominioseguro.com. Por supuesto, su servidor DNS tiene que tener configurado ese nombre.
Virtual Hosting in Apache (Part 2)
Oct 11, 07 by Juan Lebrijo about blog, Web
Continuing qith the second part about my Apache Virtual Hosting experience. You can read first in: Apache Virtual Hosting (Parte 1). We can see how our Apache serves remote server pages encrypted with SSL and un-encrypted.

Redirect to other web server

With this estrategy we can serve other server content as this contents are in our server. It is a web proxy, but for one determined site. It can take various uses:
  • Serve towards internet a local server filtered because of security.
  • Serve from internet some beyond server to win in speed.
  • If you think another put a comment.
To use the following directives we must enabled the proxy module mod_proxy. How is enable in Apache2:
elite:~# cd /etc/apache2/mods-enabled/
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy.conf proxy.conf
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy.load proxy.load
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy_http.load proxy_http.load
elite:/etc/apache2/mods-enabled# /etc/init.d/apache restart
The code:
<VirtualHost *>
        ServerName privado.tudominio.com

        ProxyPreserveHost On
        ProxyRequests Off
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass / http://192.168.0.1/
        ProxyPassReverse / http://192.168.0.1/
</VirtualHost>
ServerName is how it be called from intenet (http://privado.tudominio.com) to this content (http://192.168.0.1/) of local network. <Proxy> directive set the permissions to the object. And directives as ProxyPass (mapping extern direction) and ProxyPassReverse (adjusting the URL to HTTP Location field) fix us the direction (IP or DNS) that we want map.

Redirect to another web server, but secure https

Even more dificult, we want that Apache acts as proxy or secure remote server. Installing webmin which provides of a secure server on port 10000, I cocluded that was beter redirect with this estrategy than change webmin to apache. Of course ssl and proxy modules must be installed, mod_ssl y mod_proxy (installed at previous point):
elite:~# cd /etc/apache2/mods-enabled/
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.conf ssl.conf
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.load ssl.load
elite:/etc/apache2/mods-enabled# /etc/init.d/apache restart
Virtual Host configuration would be:
<VirtualHost *>
        ServerName webmin.tudominio.com

        ProxyRequests Off
        SSLProxyEngine On
        ProxyVia On
        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyPass / https://localhost:10000/
        ProxyPassReverse / https://localhost:10000/
        ProxyPassReverseCookieDomain localhost:10000 tudominio.com
        ProxyPassReverseCookiePath / /
</VirtualHost>
The same explication as previous point but caching the SSL certificates with  SSLProxyEngine tag, and futherore the cookies with last tags.
Hosting Virtual en Apache (Parte II)
Oct 11, 07 by Juan Lebrijo about blog, Web, Services
Hoy continuamos con la segunda entrega sobre mis andanzas con el Hosting Virtual de Apache. Podeis ver la primera en: Hosting Virtual en Apache (Parte I). Veremos como hacer que nuestro Apache sirva las páginas de otro servidor remoto encriptados con SSL y sin encriptar.

Redirigir a otro servidor web

Esta estrategia nos puede servir para servir un servidor externo como si se tratara del nuestro. Es una especie de proxy web, pero de un solo sitio. Puede tener varios usos:
  • Servir hacia internet un servidor local que por seguridad este capado.
  • Servir desde internet algún servidor lejano para ganar velocidad.
  • A ver si se os ocurre alguno más y me lo contais.
Para utilizar las directivas siguientes hay que tener habilitado el módulo mod_proxy. Como se habilita en Apache2:
elite:~# cd /etc/apache2/mods-enabled/
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy.conf proxy.conf
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy.load proxy.load
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/proxy_http.load proxy_http.load
elite:/etc/apache2/mods-enabled# /etc/init.d/apache restart
El código:
<VirtualHost *>
        ServerName privado.tudominio.com

        ProxyPreserveHost On
        ProxyRequests Off
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass / http://192.168.0.1/
        ProxyPassReverse / http://192.168.0.1/
</VirtualHost>
ServerName es como llamaremos desde la internet (http://privado.tudominio.com) a este recurso (http://192.168.0.1/) de nuestra red local. La directiva <Proxy> marca los permisos de entrada al objeto. Y las directivas ProxyPass (mapeando la dirección externa) y ProxyPassReverse (ajustando la URL al campo HTTP Location) nos fijan la dirección (IP o DNS) de lo que queramos mapear.

Redirigir a otro servidor web, pero seguro https

Pues más difícil todavia, queremos que nuestro Apache actue como servidor proxy de un servidor remoto seguro. Este problema se me planteo al instalar webmin que provee de un servidor seguro en el puerto 10000, y llegue a la conclusión de que era más infernal modificar el uso de este servidor que redirigirlo a través de este mecanismo. Por supuesto hay que tener instalados los módulos mod_ssl y mod_proxy (que instalamos en el punto anterior):
elite:~# cd /etc/apache2/mods-enabled/
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.conf ssl.conf
elite:/etc/apache2/mods-enabled# ln -s ../mods-available/ssl.load ssl.load
elite:/etc/apache2/mods-enabled# /etc/init.d/apache restart
La configuración del fichero de Virtual Host quedaría:
<VirtualHost *>
        ServerName webmin.tudominio.com

        ProxyRequests Off
        SSLProxyEngine On
        ProxyVia On
        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyPass / https://localhost:10000/
        ProxyPassReverse / https://localhost:10000/
        ProxyPassReverseCookieDomain localhost:10000 tudominio.com
        ProxyPassReverseCookiePath / /
</VirtualHost>
Pues sería igual que el anterior pero habría que cachear los certificados SSL con la etiqueta SSLProxyEngine, y además las cookies con las últimas etiquetas.