Restringe el acceso a carpetas específicas usando Apache

18 Dic

url7[1]Nosotros nunca recomendamos exponer la interfaz web de tu conmutador (entiéndase: FreePBX/Elastix/Trixbox) bajo ningún motivo. Sin embargo, hay casos específicos en los cuales puede existir la necesidad de abrir el puerto HTTP/HTTPS para algunos servicios (ej. un CRM o alguna aplicación in house). Si esto debe de hacerse, es mejor hacerlo teniendo en cuenta algunas funciones básicas de seguridad.

Si aplicáramos lo que vimos en nuestros artículos del modelo de seguridad en Asterisk veremos que no es posible defender a nivel de firewall externo/iptables, ya que no hay una manera de permitir el paso solamente a ciertas carpetas. Para lograrlo, debemos hacer uso de la configuración de Apache la cual nos permite aplicar un mini firewall interno que solo permitirá a ciertas IPs ver ciertas páginas.

Primero, localicemos el archivo /etc/httpd/conf/httpd.conf (en algunos casos cambia de nombre a /etc/apache2/httpd.conf, así que hay que buscarlo con calma). Lo que buscamos es encontrar una directriz que permite el acceso por default a toda nuestra carpeta /var/www/html. El default en Elastix lo encuentran escrito así:

<Directory "/var/www/html">

#
# Possible values for the Options directive are "None", "All",
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
    Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None

#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from all

</Directory>

Haciendo a un lado los comentarios, quedamos con estas instrucciones:

<Directory "/var/www/html">
SymLinksifOwnerMatch ExecCGI MultiViews
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Queremos ponerle atención a las lineas de Order allow,denyAllow from all. Explicamos lo que quiere decir:

  • Order allow,deny quiere decir que las instrucciones están declaradas como Permite primero, niega después.
  • Allow from all es una cláusula que permite que todos vean todo (default), lo cual le quita todas las restricciones a los usuarios.

El primer paso consiste en cerrar todo y permitir el paso solamente a direcciones IPs de confianza. Esto lo podemos conseguir con lo siguiente:

<Directory "/var/www/html">
SymLinksifOwnerMatch ExecCGI MultiViews
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24
    Allow from 127
    Allow from 10.200.1.0/24
</Directory>

¿Notan la diferencia? Ahora estamos negando el paso a todo y permitiendo solamente que las redes de confianza 192.168.1.0/24, 10.200.1.0/24 y la de loopback tengan acceso completo al servidor. En otras palabras: solo las redes locales van a poder entrar a la administración web completa.

Para crear ahora carpetas sin restricción (ej. que cualquier usuario interno o externo las pueda ver), las agregamos como directrices nuevas:

<Directory "/var/www/html/vtigercrm" >
   Order deny,allow
   Allow from all
</Directory>

Y ahora estamos permitiendo el acceso completo a esa carpeta en particular (nuestro CRM). Por cada carpeta debemos crear una directiva <Directory> que permita el acceso.

Recuerden reiniciar el servicio de Apache:

/etc/init.d/httpd restart

# Según nuestra distro, el servicio se llama Apache2
/etc/init.d/apache2 restart

De esta manera, si abrimos http://<direccion ip publica>/vtigercrm podremos ver el CRM de nuestro equipo, pero si tratáramos de ver nuestra interfaz de administración con http://<direccion ip publica>/adminhttp://<direccion ip publica>

Advertencia: Siempre asegúrate de probar tu configuración de seguridad antes de ponerla en producción. Nosotros nunca recomendamos exponer el puerto HTTP/HTTPS, ya que aunque al usar esta configuración no permites el paso a otros usuarios, no quiere decir que no haya vulnerabilidades en tu código mostrado por Apache, así que acepta el riesgo de exponer tu equipo así. Lo mejor que puedes hacer es crear un nuevo equipo que hostee tu aplicación y exponer ese, sin que tengas abierto lo mismo en tu conmutador.

¡Suerte!

Christian Cabrera

Soy ingeniero en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 18 años. En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk, así como servicios de interpretación simultánea y traducción.