La configuración de Apache con autenticación LDAP puede ser bastante útil para garantizar la seguridad de tus aplicaciones web. En este tutorial, aprenderás cómo configurar Apache con autenticación LDAP utilizando Samba4, que también es compatible con Active Directory de Windows. Este proceso se realizará en Rocky Linux 9, pero también es compatible con otras distribuciones de Red Hat como CentOS, Fedora, y RHEL, ya que la configuración de Apache es muy similar en todas ellas.
Prerequisitos
 Antes de comenzar, necesitarás lo siguiente:
Rocky Linux 9 o cualquier otra distro basada en Red Hat
 Apache y mod_ldap instalados
 Un servidor LDAP en funcionamiento (Samba4 o Active Directory de Windows)
 Un grupo de usuarios en tu LDAP llamado mailServer (o cualquier otro nombre de tu elección, sólo recuerda cambiarlo en la configuración)
Paso 1: Instalar los Paquetes Necesarios
dnf -y install mod_ldap httpd
Paso 2: Crear y Configurar los Directorios
vamos a crear el directorio que alojará nuestro contenido protegido:
mkdir /var/www/html/auth-ldap
Luego, vamos a ajustar la configuración de SELinux para permitir a Apache conectarse a la red y al servidor LDAP:
setsebool -P httpd_can_network_connect on setsebool -P httpd_can_connect_ldap on
Paso 3: Configuración del Archivo
Ahora, vamos a crear y configurar el archivo de configuración auth_ldap_ebolges-com.conf:
vi /etc/httpd/conf.d/auth_ldap_ebolges-com.conf
Nota: El usuario utilizado es un correo electrónico, pero se puede cambiar el parámetro sAMAccountName.
Y añadimos el siguiente contenido:
<Directory "/var/www/html/auth-ldap">
    AuthType Basic
    AuthName "LDAP Authentication"
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://ip-o-dominio-srv-ldap:389/dc=dominio,dc=com?mail"
    sAMAccountName"
    AuthLDAPBindDN user@dominio.com
    AuthLDAPBindPassword tu-passwd-aqui
    
      Require valid-user
      Require ldap-group CN=mailServer,OU=GRUPOS,dc=dominio,dc=com
      Require ldap-filter &(objectClass=user)(objectCategory=person)(memberOf=CN=mailServer,OU=GRUPOS,dc=dominio,dc=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2))
    
    AuthLDAPMaxSubGroupDepth 1
    LogLevel debug
    # SSLRequireSSL     
# La linea anterior (comentada por defecto # SSLRequireSSL) obligaría a Apache a requerir una conexión SSL. 
# Esto significa que todos los datos entre el cliente y el servidor se enviarían de manera segura. 
# Es altamente recomendable habilitar SSL, especialmente cuando se transmiten credenciales de usuario y otros datos sensibles. 
# Para obtener instrucciones sobre cómo habilitar SSL en Apache con Ansible y Certbot (o un certificado autofirmado), consulta este artículo: 
# https://ebolges.com/como-instalar-y-activar-el-ssl-en-apache-con-ansible-y-cerbot-o-certificado-auto-firmado/Reemplaza "ip-o-dominio-srv-ldap", "dc=dominio,dc=com", "user@dominio.com" y "tu-passwd-aqui" con los valores correspondientes a tu configuración de LDAP.
Finalmente, debemos ajustar los permisos del archivo de configuración
chgrp apache /etc/httpd/conf.d/auth_ldap_ebolges-com.conf chmod 640 /etc/httpd/conf.d/auth_ldap_ebolges-com.conf
Paso 4: Reiniciar Apache
systemctl restart httpd
Paso 5: Crear un Archivo Index.html
Vamos a crear un archivo index.html en nuestro directorio protegido:
echo "¡Felicidades! ¡Puedes ver este contenido porque te has autenticado correctamente!" > /var/www/html/auth-ldap/index.html
Explicación de la Configuración
AuthType Basic: Es el tipo de autenticación que estamos utilizando, en este caso, es Basic.
 AuthName: Es el mensaje que se mostrará en el cuadro de diálogo de autenticación.
 AuthBasicProvider ldap: Define que estamos utilizando LDAP como nuestro proveedor de autenticación.
 AuthLDAPURL: Es la URL de nuestro servidor LDAP. La consulta después del signo de interrogación especifica que estamos buscando el atributo "mail".
 AuthLDAPBindDN y AuthLDAPBindPassword: Son las credenciales que Apache utilizará para conectarse al servidor LDAP.
 Require valid-user: Esto especifica que cualquier usuario válido puede acceder al recurso.
 Require ldap-group: Esto restringe el acceso a los miembros del grupo "mailServer".
 Require ldap-filter: Esta es una consulta LDAP que permite un mayor control sobre quién puede acceder al recurso.
Nota: El usuario utilizado es un correo electrónico, pero se puede cambiar el parámetro sAMAccountName.
Por favor, revisa el playbook de Ansible para automatizar este proceso de instalación y no olvides cambiar los parámetros necesarios.
Recuerda que este playbook debe adaptarse a tus necesidades y entorno específicos:
---
- hosts: webservers
  become: yes
  tasks:
    - name: Instalar paquetes necesarios
      dnf: 
        name: 
          - mod_ldap 
          - httpd
        state: present
    - name: Crear directorio
      file: 
        path: /var/www/html/auth-ldap
        state: directory
        owner: apache
        group: apache
        mode: '0755'
    - name: Configurar SELinux
      command: 
        cmd: "{{ item }}"
      loop:
        - setsebool -P httpd_can_network_connect on
        - setsebool -P httpd_can_connect_ldap on
    - name: Configurar archivo
      template:
        src: /ruta/al/archivo/auth_ldape_ebolges-com.conf.j2
        dest: /etc/httpd/conf.d/auth_ldape_ebolges-com.conf
        owner: apache
        group: apache
        mode: '0640'
    - name: Reiniciar Apache
      service:
        name: httpd
        state: restarted
Este playbook necesita un archivo de plantilla (auth_ldape_ebolges-com.conf.j2), que deberás crear en tu máquina local. Este archivo debe contener la configuración de Apache que discutimos anteriormente, pero con variables de Ansible en lugar de los valores específicos del servidor LDAP. Asegúrate de cambiar "/ruta/al/archivo" a la ubicación correcta en tu máquina local.
El contenido del archivo auth_ldape_ebolges-com.conf.j2)
<Directory "/var/www/html/auth-ldap">
#    SSLRequireSSL
    AuthType Basic
    AuthName "LDAP Authentication"
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://{{ ldap_server_ip_or_domain }}:389/dc={{ ldap_domain }},dc=com?mail"
    sAMAccountName"
    AuthLDAPBindDN {{ ldap_bind_user }}
    AuthLDAPBindPassword {{ ldap_bind_password }}
    
      Require valid-user
      Require ldap-group CN=mailServer,OU=GRUPOS,dc={{ ldap_domain }},dc=com
      Require ldap-filter &(objectClass=user)(objectCategory=person)(memberOf=CN=mailServer,OU=GRUPOS,dc={{ ldap_domain }},dc=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2))
    
    AuthLDAPMaxSubGroupDepth 1
    LogLevel debug
Donde:
{{ ldap_server_ip_or_domain }} debe ser reemplazado por la IP o dominio de tu servidor LDAP.
 {{ ldap_domain }} debe ser reemplazado por tu dominio LDAP.
 {{ ldap_bind_user }} y {{ ldap_bind_password }} deben ser reemplazados por el usuario y la contraseña que Apache utilizará para conectarse al servidor LDAP.
 Recuerda que debes guardar estos valores en tu inventario de Ansible o pasarlos como variables extra al ejecutar el playbook.
Nota importante: Recuerda que debes guardar tus contraseñas y otros datos sensibles de manera segura. Nunca deberías escribir contraseñas directamente en tus playbooks de Ansible. Considera el uso de Ansible Vault para guardar tus secretos de manera segura.