Freeradius + Autenticador de Google + LDAP + Fortigate

¿Qué pasa si la autenticación de dos factores es deseable y espinosa, pero no hay dinero para tokens de hardware y, en general, ofrecen mantenerse de buen humor?

Esta solución no es algo súper original, sino más bien una mezcla de diferentes soluciones que se encuentran en Internet.

tan dado

Nombre de dominio Directorio Activo.

Usuarios de dominio que trabajan a través de una VPN, como muchos en la actualidad.

Actúa como una puerta de enlace VPN Fortigate.

La política de seguridad prohíbe guardar la contraseña para el cliente VPN.

Política Fortinet en relación con sus propios tokens, no puede llamarlo menos que un zhlob: hay hasta 10 tokens gratuitos, el resto, a un precio muy poco kosher. No consideré RSASecureID, Duo y similares, porque quiero código abierto.

requisitos previos: host *nada con lo establecido freeradius, ssd - ingresado en el dominio, los usuarios del dominio pueden autenticarse fácilmente en él.

Paquetes adicionales: caja de shellina, filete, freeradius-ldap, fuente rebelde.tlf del repositorio https://github.com/xero/figlet-fonts.

En mi ejemplo, CentOS 7.8.

Se supone que la lógica de trabajo es la siguiente: cuando se conecta a una VPN, el usuario debe ingresar un nombre de usuario de dominio y OTP en lugar de una contraseña.

Configuración de servicios

В /etc/raddb/radiusd.conf solo el usuario y el grupo en nombre del cual comienza freeradius, ya que el servicio redondeado debería poder leer archivos en todos los subdirectorios /casa/.

user = root
group = root

Para poder usar grupos en la configuración Fortigate, debe ser transmitido Atributo específico del proveedor. Para ello, en el directorio raddb/policy.d Creo un archivo con el siguiente contenido:

group_authorization {
    if (&LDAP-Group[*] == "CN=vpn_admins,OU=vpn-groups,DC=domain,DC=local") {
            update reply {
                &Fortinet-Group-Name = "vpn_admins" }
            update control {
                &Auth-Type := PAM
                &Reply-Message := "Welcome Admin"
                }
        }
    else {
        update reply {
        &Reply-Message := "Not authorized for vpn"
            }
        reject
        }
}

Después de la instalación freeradius-ldap en el directorio raddb/mods-disponible se crea el archivo ldap.

Necesidad de crear un enlace simbólico al directorio habilitado para raddb/mods.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Traigo su contenido a este formulario:

ldap {
        server = 'domain.local'
        identity = 'CN=freerad_user,OU=users,DC=domain,DC=local'
        password = "SupeSecretP@ssword"
        base_dn = 'dc=domain,dc=local'
        sasl {
        }
        user {
                base_dn = "${..base_dn}"
                filter = "(sAMAccountname=%{%{Stripped-User-Name}:-%{User-Name}})"
                sasl {
                }
                scope = 'sub'
        }
        group {
                base_dn = "${..base_dn}"
                filter = '(objectClass=Group)'
                scope = 'sub'
                name_attribute = cn
                membership_filter = "(|(member=%{control:Ldap-UserDn})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"
                membership_attribute = 'memberOf'
        }
}

en archivos raddb/sitios habilitados/predeterminado и raddb/sitios habilitados/inner-tunnel en la sección autorizar Agrego el nombre de la política que se utilizará - group_authorization. Un punto importante: el nombre de la política no está determinado por el nombre del archivo en el directorio política.d, sino por una directiva dentro del archivo antes de las llaves.
En la sección autenticar en los mismos archivos necesitas descomentar la línea pam.

En archivo clientes.conf prescribir los parámetros con los que se conectará Fortigate:

client fortigate {
    ipaddr = 192.168.1.200
    secret = testing123
    require_message_authenticator = no
    nas_type = other
}

Configuración del módulo pam.d/radiusd:

#%PAM-1.0
auth       sufficient   pam_google_authenticator.so
auth       include      password-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
session    include      password-auth

Opciones de implementación de paquetes predeterminados freeradius с Autenticador de google requieren que el usuario ingrese las credenciales en el formato: usuario Contraseña+OTP.

Al imaginar la cantidad de maldiciones que caerán sobre la cabeza, en el caso de usar el paquete predeterminado freeradius с google Authenticator, se decidió utilizar la configuración del módulo pam para que solo se pueda verificar el token google Authenticator.

Cuando un usuario se conecta, sucede lo siguiente:

  • Freeradius verifica si el usuario está en el dominio y en un grupo determinado y, si tiene éxito, verifica el token OTP.

Todo se veía lo suficientemente bien hasta el momento en que pensé "¿Cómo puedo registrar OTP para más de 300 usuarios?"

El usuario debe iniciar sesión en el servidor con freeradius y desde debajo de su cuenta y ejecute la aplicación Autenticador de Google, que generará un código QR de la aplicación para el usuario. Aquí es donde entra la ayuda. caja de shellina en combinación con .bash_perfil.

[root@freeradius ~]# yum install -y shellinabox

El archivo de configuración del daemon se encuentra en /etc/sysconfig/shellinabox.
Allí especifico el puerto 443 y usted puede especificar su certificado.

[root@freeradius ~]#systemctl enable --now shellinaboxd

El usuario solo necesita seguir el enlace, ingresar créditos de dominio y recibir un código QR para la aplicación.

El algoritmo es como sigue:

  • El usuario inicia sesión en la máquina a través de un navegador.
  • Si el usuario del dominio está marcado. Si no, entonces no se toma ninguna acción.
  • Si el usuario es un usuario de dominio, se comprueba la pertenencia al grupo Administradores.
  • Si no es administrador, comprueba si Google Authenticator está configurado. De lo contrario, se genera un código QR y el cierre de sesión del usuario.
  • Si no hay un administrador y Google Authenticator está configurado, simplemente cierre la sesión.
  • Si es administrador, vuelva a comprobar Google Authenticator. Si no está configurado, se genera un código QR.

Toda la lógica se hace usando /etc/skel/.bash_perfil.

gato /etc/skel/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
# Make several commands available from user shell

if [[ -z $(id $USER | grep "admins") || -z $(cat /etc/passwd | grep $USER) ]]
  then
    [[ ! -d $HOME/bin ]] && mkdir $HOME/bin
    [[ ! -f $HOME/bin/id ]] && ln -s /usr/bin/id $HOME/bin/id
    [[ ! -f $HOME/bin/google-auth ]] && ln -s /usr/bin/google-authenticator $HOME/bin/google-auth
    [[ ! -f $HOME/bin/grep ]] && ln -s /usr/bin/grep $HOME/bin/grep
    [[ ! -f $HOME/bin/figlet ]] && ln -s /usr/bin/figlet $HOME/bin/figlet
    [[ ! -f $HOME/bin/rebel.tlf ]] && ln -s /usr/share/figlet/rebel.tlf $HOME/bin/rebel.tlf
    [[ ! -f $HOME/bin/sleep ]] && ln -s /usr/bin/sleep $HOME/bin/sleep
  # Set PATH env to <home user directory>/bin
    PATH=$HOME/bin
    export PATH
  else
    PATH=PATH=$PATH:$HOME/.local/bin:$HOME/bin
    export PATH
fi


if [[ -n $(id $USER | grep "domain users") ]]
  then
    if [[ ! -e $HOME/.google_authenticator ]]
      then
        if [[ -n $(id $USER | grep "admins") ]]
          then
            figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"
            sleep 1.5
            echo "Please, run any of these software on your device, where you would like to setup OTP:
Google Autheticator:
AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605
Play Market - https://play.google.com/stor/apps/details?id=com.google.android.apps.authenticator2&hl=en
FreeOTP:
AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395
Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=en

And prepare to scan QR code.

"
            sleep 5
            google-auth -f -t -w 3 -r 3 -R 30 -d -e 1
            echo "Congratulations, now you can use an OTP token from application as a password connecting to VPN."
          else
            figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"
            sleep 1.5
            echo "Please, run any of these software on your device, where you would like to setup OTP:
Google Autheticator:
AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605
Play Market - https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en
FreeOTP:
AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395
Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=en

And prepare to scan QR code.

"
            sleep 5
            google-auth -f -t -w 3 -r 3 -R 30 -d -e 1
            echo "Congratulations, now you can use an OTP token from application as a password to VPN."
            logout
        fi
      else
        echo "You have already setup a Google Authenticator"
        if [[ -z $(id $USER | grep "admins") ]]
          then
          logout
        fi
    fi
  else
    echo "You don't need to set up a Google Authenticator"
fi

Configuración de Fortigate:

  • Crear Radio de busqueda-servidor

    Freeradius + Autenticador de Google + LDAP + Fortigate

  • Creamos los grupos necesarios, si es necesario, control de acceso por grupos. Nombre del grupo en Fortigate debe coincidir con el grupo que se pasa en Atributo específico del proveedor Nombre del grupo de Fortinet.

    Freeradius + Autenticador de Google + LDAP + Fortigate

  • Editando lo necesario SSL-portales.

    Freeradius + Autenticador de Google + LDAP + Fortigate

  • Agregar grupos a las políticas.

    Freeradius + Autenticador de Google + LDAP + Fortigate

Las ventajas de esta solución:

  • Es posible autenticarse por OTP en Fortigate solución de código abierto.
  • El usuario no ingresa una contraseña de dominio cuando se conecta a través de VPN, lo que simplifica un poco el proceso de conexión. La contraseña de 6 dígitos es más fácil de ingresar que la proporcionada por la política de seguridad. Como resultado, la cantidad de tickets con el asunto: "No puedo conectarme a la VPN" disminuye.

PS Planeamos actualizar esta solución a una autenticación completa de dos factores con respuesta de desafío.

Actualizar:

Como prometí, lo ajusté a la opción de desafío-respuesta.
Por lo tanto:
En archivo /etc/raddb/sitios habilitados/predeterminado seccion autorizar выглядит следующим образом:

authorize {
    filter_username
    preprocess
    auth_log
    chap
    mschap
    suffix
    eap {
        ok = return
    }
    files
    -sql
    #-ldap
    expiration
    logintime
    if (!State) {
        if (&User-Password) {
            # If !State and User-Password (PAP), then force LDAP:
            update control {
                Ldap-UserDN := "%{User-Name}"
                Auth-Type := LDAP
            }
        }
        else {
            reject
        }
    }
    else {
        # If State, then proxy request:
        group_authorization
    }
pap
}

sección autenticar ahora se ve así:

authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        digest
        # Attempt authentication with a direct LDAP bind:
        Auth-Type LDAP {
        ldap
        if (ok) {
            update reply {
                # Create a random State attribute:
                State := "%{randstr:aaaaaaaaaaaaaaaa}"
                Reply-Message := "Please enter OTP"
                }
            # Return Access-Challenge:
            challenge
            }
        }
        pam
        eap
}

Ahora la verificación del usuario ocurre de acuerdo con el siguiente algoritmo:

  • El usuario ingresa créditos de dominio en el cliente VPN.
  • Freeradius comprueba la validez de la cuenta y la contraseña
  • Si la contraseña es correcta, se envía una solicitud de token.
  • El token se está verificando.
  • ganancia).

Fuente: habr.com

Añadir un comentario