Nota: Este artículo fue publicado originalmente en 2013. Algunos pasos, comandos o versiones de software pueden haber cambiado. Consulta la documentación actual de Apache Web Server para obtener la información más reciente.

En esta guía paso a paso, aprenderás a asegurar un sitio usando Apache.

Cómo: Asegurar un sitio usando Apache

Si tuviera que decirlo, probablemente diría que la mayoría de las personas que usan Apache lo hacen para publicar sitios que son públicamente accesibles y/o tienen seguridad incorporada (digamos WordPress que gestiona por sí mismo el acceso a la aplicación y los datos). Así que ahora que quería publicar un sitio que requiere un nombre de usuario/contraseña o algún tipo de restricción para que solo yo pueda ver sus datos (piensa en una consola de administración) no tenía idea de por dónde empezar.

Apache ofrece ambas modalidades que pueden usarse independientemente o en combinación: Autenticación y Autorización.

Autenticación significa que el usuario necesita proporcionar credenciales para acceder y su sesión es autenticada (identificada) durante su permanencia.

Autorización significa que el cliente está autorizado para acceder a la página. El usuario individual no necesariamente es identificado. Por ejemplo, si la autorización se basa en el host de origen (dirección ip) entonces no hay necesidad de autenticación (Módulo de Apache mod_authz_host.)

A continuación se muestra la información relevante para configurar Apache de manera simple (obtenida de: http://httpd.apache.org/docs/2.2/howto/auth.html)


Hay tres tipos de módulos involucrados en el proceso de autenticación y autorización. Generalmente necesitarás elegir al menos un módulo de cada grupo.

  • Tipo de autenticación (consulta la directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authtype>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html>)
  • Proveedor de autenticación (consulta las directivas (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider>) y (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html#authdigestprovider>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_anon.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>)
  • Autorización (consulta la directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_dbm.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_groupfile.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_owner.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_user.html>)

El módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>) es tanto un proveedor de autenticación como de autorización. El módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authn_alias.html>) no es un proveedor de autenticación en sí mismo, pero permite que otros proveedores de autenticación se configuren de manera flexible. El módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html>) proporciona autorización y control de acceso basado en el nombre de host, dirección IP o características de la solicitud, pero no es parte del sistema de proveedores de autenticación.


Primero, necesitas crear un archivo de contraseñas. Exactamente cómo lo hagas variará dependiendo del proveedor de autenticación que hayas elegido. Más sobre eso después. Para comenzar, usaremos un archivo de contraseñas en texto plano. Este archivo debe colocarse en algún lugar no accesible desde la web. Esto es para que la gente no pueda descargar el archivo de contraseñas. Por ejemplo, si tus documentos se sirven desde /usr/local/apache/htdocs podrías querer poner los archivos de contraseñas en /usr/local/apache/passwd. Para crear el archivo, usa la utilidad (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) que viene con Apache. Esta se encontrará en el directorio bin de donde hayas instalado Apache. Si has instalado Apache desde un paquete de terceros, puede estar en tu ruta de ejecución. Para crear el archivo, escribe:

htpasswd -c /usr/local/apache/passwd/passwords rbowen

(<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) te pedirá la contraseña, y luego te pedirá que la escribas nuevamente para confirmarla:

# htpasswd -c /usr/local/apache/passwd/passwords rbowen New password: mypassword Re-type new password: mypassword Adding password for user rbowen

Si (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) no está en tu ruta, por supuesto tendrás que escribir la ruta completa al archivo para ejecutarlo. Con una instalación predeterminada, se encuentra en /usr/local/apache2/bin/htpasswd. A continuación, necesitarás configurar el servidor para solicitar una contraseña y decirle al servidor qué usuarios tienen acceso permitido. Puedes hacer esto editando el archivo httpd.conf o usando un archivo .htaccess. Por ejemplo, si deseas proteger el directorio /usr/local/apache/htdocs/secret, puedes usar las siguientes directivas, ya sea colocadas en el archivo /usr/local/apache/htdocs/secret/.htaccess, o colocadas en httpd.conf dentro de una sección <Directory /usr/local/apache/apache/htdocs/secret>.

AuthType Basic AuthName "Restricted Files" # (Following line optional) AuthBasicProvider file AuthUserFile /usr/local/apache/passwd/passwords Require user rbowen

Examinemos cada una de esas directivas individualmente. La directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authtype>) selecciona el método que se usa para autenticar al usuario. El método más común es Basic, y este es el método implementado por (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html>). Es importante tener en cuenta, sin embargo, que la autenticación Basic envía la contraseña del cliente al servidor sin cifrar. Este método por lo tanto no debe usarse para datos altamente sensibles, a menos que esté acompañado de (<http://httpd.apache.org/docs/2.2/mod/mod_ssl.html>). Apache soporta otro método de autenticación: AuthType Digest. Este método es implementado por (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html>) y es mucho más seguro. La mayoría de los navegadores recientes soportan la autenticación Digest. La directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authname>) establece el Realm que se usará en la autenticación. El realm cumple dos funciones principales. Primero, el cliente a menudo presenta esta información al usuario como parte del cuadro de diálogo de contraseña. Segundo, es usado por el cliente para determinar qué contraseña enviar para un área autenticada dada. Así, por ejemplo, una vez que un cliente se ha autenticado en el área de "Restricted Files", automáticamente reintentará la misma contraseña para cualquier área en el mismo servidor que esté marcada con el Realm "Restricted Files". Por lo tanto, puedes evitar que un usuario sea solicitado más de una vez por una contraseña al dejar que múltiples áreas restringidas compartan el mismo realm. Por supuesto, por razones de seguridad, el cliente siempre necesitará pedir nuevamente la contraseña cada vez que cambie el nombre de host del servidor. La directiva (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider>) es, en este caso, opcional, ya que file es el valor predeterminado para esta directiva. Necesitarás usar esta directiva si estás eligiendo una fuente diferente para la autenticación, como (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) o (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>). La directiva (<http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html#authuserfile>) establece la ruta al archivo de contraseñas que acabamos de crear con (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>). Si tienes un gran número de usuarios, puede ser bastante lento buscar a través de un archivo de texto plano para autenticar al usuario en cada solicitud. Apache también tiene la capacidad de almacenar información de usuarios en archivos de base de datos rápidos. El módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) proporciona la directiva (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html#authdbmuserfile>). Estos archivos pueden crearse y manipularse con el programa (<http://httpd.apache.org/docs/2.2/programs/dbmmanage.html>). Muchos otros tipos de opciones de autenticación están disponibles desde módulos de terceros en (http://modules.apache.org/). Finalmente, la directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>) proporciona la parte de autorización del proceso al establecer el usuario que tiene permitido acceder a esta región del servidor. En la siguiente sección, discutimos varias formas de usar la directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>).


La directiva (<http://httpd.apache.org/docs/2.2/mod/core.html#satisfy>) puede usarse para especificar que varios criterios pueden considerarse al decidir si un usuario particular tendrá acceso. Satisfy puede tomar como argumento una de dos opciones - all o any. Por defecto, se asume que el valor es all. Esto significa que si se especifican varios criterios, entonces todos deben cumplirse para que alguien pueda entrar. Sin embargo, si se establece a any, entonces pueden especificarse varios criterios, pero si el usuario satisface cualquiera de estos, entonces se le concederá entrada. Un ejemplo de esto es usar control de acceso para asegurar que, aunque un recurso esté protegido con contraseña desde fuera de tu red, todos los hosts dentro de la red tendrán acceso no autenticado al recurso. Esto se lograría usando la directiva Satisfy, como se muestra a continuación.

<Directory /usr/local/apache/htdocs/sekrit> AuthType Basic AuthName intranet AuthUserFile /www/passwd/users AuthGroupFile /www/passwd/groups Require group customers Order allow,deny Allow from internal.com Satisfy any </Directory>


Las directivas anteriores solo permiten entrar a una persona (específicamente alguien con nombre de usuario rbowen) al directorio. En la mayoría de los casos, querrás dejar entrar a más de una persona. Aquí es donde entra (<http://httpd.apache.org/docs/2.2/mod/mod_authz_groupfile.html#authgroupfile>). Si quieres dejar entrar a más de una persona, necesitarás crear un archivo de grupo que asocie nombres de grupo con una lista de usuarios en ese grupo. El formato de este archivo es bastante simple, y puedes crearlo con tu editor favorito. El contenido del archivo se verá así:

GroupName: rbowen dpitts sungo rshersey

Eso es simplemente una lista de los miembros del grupo en una línea larga separados por espacios. Para agregar un usuario a tu archivo de contraseñas ya existente, escribe:

htpasswd /usr/local/apache/passwd/passwords dpitts

Obtendrás la misma respuesta que antes, pero se agregará al archivo existente en lugar de crear uno nuevo. (Es el -c lo que hace que cree un nuevo archivo de contraseñas). Ahora, necesitas modificar tu archivo .htaccess o bloque (<http://httpd.apache.org/docs/2.2/mod/core.html#directory>) para que se vea así:

AuthType Basic AuthName "By Invitation Only" # Optional line: AuthBasicProvider file AuthUserFile /usr/local/apache/passwd/passwords AuthGroupFile /usr/local/apache/passwd/groups Require group GroupName

Ahora, cualquiera que esté listado en el grupo GroupName, y tenga una entrada en el archivo de contraseñas, podrá entrar si escribe la contraseña correcta. Hay otra forma de dejar entrar a múltiples usuarios que es menos específica. En lugar de crear un archivo de grupo, puedes simplemente usar la siguiente directiva:

Require valid-user

Usar eso en lugar de la línea Require user rbowen permitirá entrar a cualquiera que esté listado en el archivo de contraseñas y que ingrese correctamente su contraseña.


Debido a que almacenar contraseñas en archivos de texto plano tiene los problemas mencionados, podrías desear almacenar tus contraseñas en otro lugar, como en una base de datos. (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) y (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>) son dos módulos que hacen esto posible. En lugar de seleccionar “(http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider) file, puedes elegir dbm o dbd como tu formato de almacenamiento. Para seleccionar un archivo dbd en lugar de un archivo de texto, por ejemplo:

<Directory /www/docs/private> AuthName "Private" AuthType Basic AuthBasicProvider dbm AuthDBMUserFile /www/passwords/passwd.dbm Require valid-user </Directory>

Otras opciones están disponibles. Consulta la documentación de (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) para más detalles.

(http://img.zemanta.com/zemified_e.png?x-id=e42f8804-6c89-45f2-a6df-f24978a5af3c)](http://www.zemanta.com/?px “Enhanced by Zemanta”)

Resumen

Has aprendido exitosamente a asegurar un sitio usando Apache. Si encuentras algún problema, verifica los requisitos previos y asegúrate de que tu entorno de Apache Web Server esté correctamente configurado.

Artículos Relacionados