Freeradius + Google Authenticator + LDAP + Fortigate

E se a autenticación de dous factores é desexable e espinosa, pero non hai cartos para os tokens de hardware e, en xeral, ofrecen estar de bo humor.

Esta solución non é algo súper orixinal, senón unha mestura de diferentes solucións que se atopan en Internet.

Así dado

Домен Active Directory.

Usuarios de dominio que traballan a través dunha VPN, como moitos hoxe en día.

Actúa como pasarela VPN Fortalecer.

Gardar o contrasinal para o cliente VPN está prohibido pola política de seguridade.

Política Fortinet Con respecto aos teus propios tokens, non podes chamalo menos que un zhlob: hai ata 10 fichas gratuítas, o resto, a un prezo moi non kosher. Non considerei RSASecureID, Duo e similares, porque quero código aberto.

Requisitos previos: servidor * nix co establecido radio libre, ssd - ingresado no dominio, os usuarios do dominio poden autenticarse facilmente nel.

Paquetes adicionais: caixa de Shellina, figueira, freeradius-ldap, tipo de letra rebelde.tlf dende o repositorio https://github.com/xero/figlet-fonts.

No meu exemplo - CentOS 7.8.

Suponse que a lóxica de traballo é a seguinte: ao conectarse a unha VPN, o usuario debe introducir un inicio de sesión de dominio e OTP en lugar dun contrasinal.

Configuración de servizos

В /etc/raddb/radiusd.conf só comeza o usuario e o grupo en nome dos cales radio libre, dende o servizo raiod debería poder ler ficheiros en todos os subdirectorios / home /.

user = root
group = root

Para poder usar grupos na configuración Fortalecer, debe ser transmitido Atributo específico do provedor. Para iso, no directorio raddb/política.d Creo un ficheiro co seguinte contido:

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
        }
}

Despois da instalación freeradius-ldap no directorio raddb/mods-dispoñible créase o ficheiro ldap.

É necesario crear unha ligazón simbólica ao directorio raddb/mods-habilitado.

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

Traigo o seu contido 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 arquivos raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel na sección autorizar Engado o nome da política que se vai usar - group_authorization. Un punto importante: o nome da política non está determinado polo nome do ficheiro no directorio política.d, pero por unha directiva dentro do ficheiro antes das chaves.
Na sección autenticar nos mesmos ficheiros cómpre descomentar a liña pam.

En arquivo clientes.conf prescribir os parámetros cos que se conectará Fortalecer:

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

Configuración do 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

Opcións de implementación de paquetes predeterminadas radio libre с Autenticador de Google requirir ao usuario que introduza as credenciais no formato: nome de usuario Contrasinal+OTP.

Ao imaxinar o número de maldicións que caerán sobre a cabeza, no caso de usar o paquete predeterminado radio libre с Google Authenticator, decidiuse utilizar a configuración do módulo pam para que só se poida comprobar a ficha Google Authenticator.

Cando un usuario se conecta, ocorre o seguinte:

  • Freeradius comproba se o usuario está no dominio e nun grupo determinado e, se ten éxito, verifica o token OTP.

Todo parecía o suficientemente bo ata o momento no que pensei "Como podo rexistrar OTP para máis de 300 usuarios?"

O usuario debe iniciar sesión no servidor con radio libre e desde a túa conta e executa a aplicación autenticador de google, que xerará un código QR para a aplicación para o usuario. Aquí é onde entra a axuda. caixa de Shellina en combinación con .bash_perfil.

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

O ficheiro de configuración do daemon está situado en /etc/sysconfig/shellinabox.
Especifico o porto 443 alí e podes especificar o teu certificado.

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

O usuario só ten que seguir a ligazón, introducir créditos de dominio e recibir un código QR para a aplicación.

O algoritmo é o seguinte:

  • O usuario inicia sesión na máquina a través dun navegador.
  • Indica se o usuario do dominio está marcado. Se non, non se toma ningunha medida.
  • Se o usuario é un usuario de dominio, compróbase a pertenza ao grupo Administradores.
  • Se non é un administrador, comproba se Google Authenticator está configurado. Se non, xérase un código QR e o usuario pecha sesión.
  • Se non está configurado un administrador e Google Authenticator, só tes que pechar sesión.
  • Se é administrador, comprobe Google Authenticator de novo. Se non está configurado, xérase un código QR.

Toda a lóxica faise usando /etc/skel/.bash_profile.

cat /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:

  • Nós creamos raio-servidor

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Creamos os grupos necesarios, se é necesario, control de acceso por grupos. Nome do grupo activado Fortalecer debe coincidir co grupo que se transmite Atributo específico do provedor Nome do grupo Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Editando o necesario SSL-portais.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Engadindo grupos ás políticas.

    Freeradius + Google Authenticator + LDAP + Fortigate

As vantaxes desta solución:

  • É posible autenticarse mediante OTP activado Fortalecer solución de código aberto.
  • O usuario non introduce un contrasinal de dominio ao conectarse mediante VPN, o que simplifica un pouco o proceso de conexión. O contrasinal de 6 díxitos é máis fácil de introducir que o proporcionado pola política de seguridade. Como resultado, o número de tickets co asunto: "Non podo conectarme á VPN" diminúe.

PS Planeamos actualizar esta solución a unha autenticación completa de dous factores con desafío-resposta.

Actualización:

Como prometín, axusteino á opción desafío-resposta.
Así:
En arquivo /etc/raddb/sites-enabled/default sección autorizar parece así:

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 agora ten este aspecto:

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
}

Agora a verificación do usuario prodúcese segundo o seguinte algoritmo:

  • O usuario introduce créditos de dominio no cliente VPN.
  • Freeradius comproba a validez da conta e do contrasinal
  • Se o contrasinal é correcto, envíase unha solicitude de token.
  • Estase verificando o token.
  • beneficio).

Fonte: www.habr.com

Engadir un comentario