Autenticación en Apache 2.4
Sumario
- 1 Consideracións previas
- 2 Autenticación
- 2.1 Sección da declaración dun directorio: Directory
- 2.2 Control de acceso. Directive require
- 2.3 Apache 2.2
- 2.4 Exemplos
- 2.5 Autenticación básica
- 2.6 Autenticación digest
- 2.7 Autenticación con usuarios do sistema
- 2.8 Autenticación: Integración con OpenLDAP
- 2.9 Autenticación: Con authn_dbd y MySQL/MariaDB
- 3 Referencias
- 4 Créditos
Consideracións previas
Temos xa instalado un servidor Apache, e configurado un virtual host.
Autenticación
O servidor HTTP Apache permite controlar os dereitos de acceso dos usuarios identificándoos. Diferentes módulos permiten configurar múltiples métodos de autenticación para os usuarios que solicitan acceso a un ficheiro our ruta xestionada polo servidor HTTP Apache.
Sección da declaración dun directorio: Directory
O control de accesos aos directorios aplícase a toda a árbore dentro do directorio, agás se hai outros dereitos posicionados nun subdirectorio.
Se o directorio está protexido no acceso, só os usuarios autorizados poderán acceder a el.
A declaración dun directorio faise usando a sección Directory, segundo a seguinte sintaxe:
<Directory CaminoDir> [Directivas] </Directory>
O camiño de acceso do directorio pode estar especificado en camiño absoluto ou relativo á raíz dos documentos configurada para o servidor ou o host virtual que administra este directorio.
Pode haber diferentes directivas especificadas na sección, pero só se aplicarán a ese directorio (e aos seus subdirectorios, agás que estes estean asociados a unha sección Directory específica).
Control de acceso. Directive require
O control de acceso fai referencia a todos os medios que proporcionan unha forma de controlar o acceso os recursos.
Dentro dunha sección de directorio, esta directiva require permite especificar qué usuarios terán acceso autorizado ao contido do directorio.
Pode haber distintas directivas Require na mesma sección do directorio.
Sintaxe Require [not] valid-user|user|group|ip|host [ Ident1 ... identN]
- not
- Prohibe o acceso.
- valid-user
- Calquer usuario autenticado.
- user Ident ...
- Lista dos usuarios autorizados.
- group Ident ...
- Lista dos grupos de usuarios autorizados.
- ip Dir ...
- Lista dos enderezos IP autorizados.
- host NomeDNS
- Lista dos nomes de hosts ou de dominios DNS autorizados.
Exemplo. Permite nun directorio recursos que sexa accesible para os usuarios do grupo rrhh mais non para o usuario becario, aínda que pertenza o grupo rrhh
<Directory /var/www/html/recursos Require group rrhh Require not user becario </Directory>
A directiva Require proporciona unha variedade de diferentes xeitos de permitir ou denegar o acceso. Pode tamen ser usada xunto as directivas:
* RequireAll * RequireAny * RequireNone
E todos estos requerimientos poden ser combinados elaborar complexas políticas de acceso.
Máis exemplos. Podemos controlar o acceso a calquera recurso, (por exemplo usando a directiva Directory), con estas opciones: Require all granted: O acceso é permitido incondicionalmente. Require all denied: O acceso é denegado incondicionalmente. Require user userid [userid] ...: O acceso é permitido sólo se os usuarios indicados autenticaronse. Require group group-name [group-name] ...: O acceso é permitido sólo os grupos de usuarios especificados. Require valid-user: O acceso é permitido os usuarios válidos. Require ip 10 172.40 192.168.5: O acceso é permitido se se fai desde o conxunto de direccións especificadas. Require host dominio: El acceso es permitido si se hace desde el dominio especificado. Require local: O acceso é permitido desde localhost (127.0.0.1). Pódese facer uso do operador not para indicar a denegación, por exemplo: Require not ip 192.168.1
Apache 2.2
En versiones anteriores de Apache utilizabanse outras directivas para controlar o acceso:
- Allow
- Deny
- Order
Están obsoletas e non serán validas en futuras versións.
Exemplos
Exemplo 1
Para permitir a todos no directorio:
<Directory "/var/www">
Require all granted
</Directory>
Exemplo 2
Para non permitir o acceso o fichiero .htaccess, podíamos encontrar:
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
Exemplo 3
Para denegar todos excepto host example.org:
Require host example.org
Autenticación básica
Poden utilizarse diferentes módulos para proporcionar diferentes modelos de autenticación.
O máis simple é con autenticación básica que xa ven instalada: mod_auth_basic.
Hai que engadir esta configuración no ficheiro de definición do Virtual Host que se quere configurar:
<Directory "/var/www/html/paxina1/privado">
AuthUserFile "/etc/apache2/chaves/passwd.txt"
AuthName "Palabra de paso"
AuthType Basic
Require valid-user
</Directory>
- O método de autentificación básica indicase na directiva AuthType con Basic.
- En Directory escribimos o directorio a protexer, que pode ser a raíz do noso Virtual Host ou un subdirectorio.
- En AuthUserFile poñemos o ficheiro que gardará a información de usuarios e contrasinais que debería de estar nun directorio que non sexa visitable desde o noso Apache.
Usuarios. Xeración de ficheiro de contrasinais
Xeéerase o ficheiro de contrasinais mediante a utilidade htpasswd:
$ htpasswd -c /etc/apache2/chaves/passwd.txt xose New password: Re-type new password: Adding password for user xose
Para crear o ficherio coa introdución do primeiro usuario temos que engadir a opción -c (create). Se por erro seguimos usando -c ó incorporar novos usuarios borraremos todos os anteriores! Os contrasinais non se gardan en claro; o que se garda é o resultado de aplicar unha función hash:
leire:h3UetcAKWaliZ xose:rmO3V7cM8KLda
En AuthName personalizamos a mensaxe que aparecerá no navegador cando nos pida o contrasinal.
Para xestionar o control de acceso (qué usuarios ou grupos teñen permiso para obter o recurso utilizamos as seguintes directivas:
- AuthGroupFile
- Require user
- Require group
Con borrar a liña correspondente a un usuario denegaremos o seu acceso; non e necesario reinicia apache cos cambios no ficheiro de contrasinais.
Grupos
Para permitir a un grupo de usuarios necesitarás crear un ficheiro de grupo que asocie os nombres de grupos cos de usuario para permitirlles acceso. O formato deste fichero é:
- NombreGrupo: usuario1 usuario2 usuario3
A directiva que utilizaremos para inidicar o ficheiro de grupo é AuthGroupFile; e para permitir o acceso os grupos utilizaríamos:
- Require group NombreGrupo
Ventaxas e inconvintes
Ventaxa deste método:
- A súa sinxeleza.
Inconvintes:
- ter que delegar a xeneración de novos usuarios en alguen que non sexa un administrador de sistemas ou ter que facer un front-end para que o propio usuario cambie o seu contrasinal.
- os contrasinais viaxan en claro a través da rede (ainda que podemos esto configurando Apache2 con SSL).
Autenticación digest
Procedemento similar o tipo básico cambiando algunhas das directivas e usando a utilidade htdigest no canto de htpassword para crear o ficheiro de contrasinais.
Habilitar módulo auth_digest
Habilítase coa utilidade a2enmod, sendo necesario posterior reinicio do servidor Apache:
a2enmod auth_digest systemctl restart apache2
Configuración no Virtual Host
E despois incluimos unha sección no ficheiro de configuración do noso Virtual Host:
<Directory "/var/www/html/paxina1/privado">
AuthType Digest
AuthName "dominio"
AuthUserFile "/etc/claves/digest.txt"
Require valid-user
</Directory>
A directiva AuthName utilízase ahora para identificar un nome de dominio (realm) que debe coincidir co que apareza no fichero de contrasenais.
Xeneración de ficheiro con htdigest
Primeiro creamos a ruta onde almacenar o ficherio:
mkdir /etc/claves/
Coa utilidade htdigest:
$ htdigest -c /etc/claves/digest.txt dominio xose Adding password for josemaria in realm dominio. New password: Re-type new password:
A opción -c (create) sólo debe ser usada para crear o ficheiro co primeiro usuario; os seguintes prescindirán da mesma.
O ficheiro xenerado despois de engadir un segundo usuario:
xose:dominio:4c7af2e11e38ee1a51cd775895e11e0a leire:dominio:bcd34f4294e2a39f62a486ec070b9b9b
Ventaxas e inconvintes
Ventaxa:
- Solucionase o problema da transferencia de contrasinais en claro sen ser necesario usar SSL; aplicase unha función hash o contrasinal antes de ser enviada pola rede
Invonvinte:
- Un chisco máis de complexidade na configuración
Autenticación con usuarios do sistema
Utilizaremos o módulo mod_auth_external que permite autenticar os usuarios contra servizos externos; no noso caso ímos usar pwauth para verificar usuarios e contrasinais do sistema.
Hablitación do módulo
apt-get install libapache2-mod-auth-external pwauth
Configuración
Exemplo de ficheiro de configuración do Virtual
DefineExternalAuth pwauth_auth pipe /usr/sbin/pwauth
<Directory /var/www/privadoUsuarioSistema>
AuthType Basic
AuthBasicProvider external
AuthExternal pwauth_auth
AuthName "texto que se mostrará na ventana para pedir autorización"
Require valid-user
</Directory>
Autenticación: Integración con OpenLDAP
Autenticación: Con authn_dbd y MySQL/MariaDB
Referencias
- https://httpd.apache.org/docs/2.4/es/howto/auth.html
- https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-18-04-quickstart-es
- https://manuais.iessanclemente.net/index.php/O_Servidor_Web_Apache#Autenticaci.C3.B3n_e_autorizaci.C3.B3n