Freeradius + Google Authenticator + LDAP + Fortigate

Τι θα συμβεί αν ο έλεγχος ταυτότητας δύο παραγόντων είναι και επιθυμητός και τσιμπημένος, αλλά δεν υπάρχουν χρήματα για μάρκες υλικού και γενικά προσφέρουν να παραμείνουν σε καλή διάθεση.

Αυτή η λύση δεν είναι κάτι εξαιρετικά πρωτότυπο, αλλά μάλλον ένας συνδυασμός διαφορετικών λύσεων που βρίσκονται στο Διαδίκτυο.

Έτσι δεδομένο

Όνομα τομέα Active Directory.

Οι χρήστες τομέα που εργάζονται μέσω VPN, όπως πολλοί σήμερα.

Λειτουργεί ως πύλη VPN Οχυρώστε.

Η αποθήκευση του κωδικού πρόσβασης για τον πελάτη VPN απαγορεύεται από την πολιτική ασφαλείας.

Πολιτική Fortinet Όσον αφορά τα δικά σας μάρκες, δεν μπορείτε να το αποκαλέσετε λιγότερο από zhlob - υπάρχουν έως και 10 δωρεάν μάρκες, τα υπόλοιπα - σε πολύ μη kosher τιμή. Δεν σκέφτηκα τα RSASecureID, Duo και τα παρόμοια, γιατί θέλω ανοιχτό κώδικα.

Προαπαιτούμενα: υποδοχής *νεράιδα με καθιερωμένο FreeRADIUS, SSD - εισαγάγετε στον τομέα, οι χρήστες του τομέα μπορούν εύκολα να ελέγξουν την ταυτότητα σε αυτόν.

Πρόσθετα πακέτα: κουτί shellina, συρτάρι, freeradius-ldap, γραμματοσειρά επαναστάτης.tlf από το αποθετήριο https://github.com/xero/figlet-fonts.

Στο παράδειγμά μου - CentOS 7.8.

Η λογική της εργασίας υποτίθεται ότι είναι η εξής: κατά τη σύνδεση σε ένα VPN, ο χρήστης πρέπει να εισάγει ένα login τομέα και ένα OTP αντί για έναν κωδικό πρόσβασης.

Ρύθμιση υπηρεσιών

В /etc/raddb/radiusd.conf μόνο ο χρήστης και η ομάδα για λογαριασμό των οποίων ξεκινά FreeRADIUS, από την υπηρεσία ακτίνα θα πρέπει να μπορεί να διαβάζει αρχεία σε όλους τους υποκαταλόγους /Σπίτι/.

user = root
group = root

Για να μπορείτε να χρησιμοποιείτε ομάδες στις ρυθμίσεις Οχυρώστε, πρέπει να μεταδοθεί Ειδικό Χαρακτηριστικό Προμηθευτή. Για να το κάνετε αυτό, στον κατάλογο raddb/policy.δ Δημιουργώ ένα αρχείο με το ακόλουθο περιεχόμενο:

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

Μετά την εγκατάσταση freeradius-ldap στον κατάλογο raddb/mods-διαθέσιμο δημιουργείται αρχείο ldap.

Πρέπει να δημιουργήσετε έναν συμβολικό σύνδεσμο προς τον κατάλογο raddb/mods-enabled.

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

Φέρνω το περιεχόμενό του σε αυτή τη μορφή:

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

Σε αρχεία raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel στο τμήμα εξουσιοδοτώ Προσθέτω το όνομα της πολιτικής που θα χρησιμοποιηθεί - group_authorization. Ένα σημαντικό σημείο - το όνομα της πολιτικής δεν καθορίζεται από το όνομα του αρχείου στον κατάλογο πολιτική.δ, αλλά από μια οδηγία μέσα στο αρχείο πριν από τα σγουρά σιδεράκια.
Στην ενότητα πιστοποιώ την αυθεντικότητα στα ίδια αρχεία πρέπει να αφαιρέσετε το σχόλιο της γραμμής pam.

Στο αρχείο πελάτες.conf ορίστε τις παραμέτρους με τις οποίες θα συνδεθεί Οχυρώστε:

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

Διαμόρφωση μονάδας 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

Προεπιλεγμένες επιλογές υλοποίησης πακέτου FreeRADIUS с google authenticator απαιτούν από τον χρήστη να εισάγει διαπιστευτήρια στη μορφή: όνομα χρήστη κωδικός+OTP.

Φανταζόμαστε τον αριθμό των κατάρα που θα πέσουν στο κεφάλι, στην περίπτωση χρήσης του προεπιλεγμένου πακέτου FreeRADIUS с Επαληθευτής Google, αποφασίστηκε να χρησιμοποιηθεί η διαμόρφωση της μονάδας pam ώστε να μπορεί να ελεγχθεί μόνο το διακριτικό Επαληθευτής Google.

Όταν ένας χρήστης συνδέεται, συμβαίνουν τα εξής:

  • Το Freeradius ελέγχει εάν ο χρήστης βρίσκεται στον τομέα και σε μια συγκεκριμένη ομάδα και, εάν είναι επιτυχής, ελέγχει το διακριτικό OTP.

Όλα φαίνονταν αρκετά καλά μέχρι τη στιγμή που σκέφτηκα "Πώς μπορώ να εγγράψω OTP για 300+ χρήστες;"

Ο χρήστης πρέπει να συνδεθεί στον διακομιστή με FreeRADIUS και από κάτω από τον λογαριασμό σας και εκτελέστε την εφαρμογή Επαληθευτής Google, το οποίο θα δημιουργήσει έναν κωδικό QR για την εφαρμογή για τον χρήστη. Εδώ έρχεται η βοήθεια. κουτί shellina σε συνδυασμό με .bash_profile.

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

Το αρχείο διαμόρφωσης δαίμονα βρίσκεται στη διεύθυνση /etc/sysconfig/shellinabox.
Καθορίζω τη θύρα 443 εκεί και μπορείτε να καθορίσετε το πιστοποιητικό σας.

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

Ο χρήστης χρειάζεται μόνο να ακολουθήσει τον σύνδεσμο, να εισαγάγει πιστώσεις τομέα και να λάβει έναν κωδικό QR για την εφαρμογή.

Ο αλγόριθμος έχει ως εξής:

  • Ο χρήστης συνδέεται στο μηχάνημα μέσω ενός προγράμματος περιήγησης.
  • Εάν έχει ελεγχθεί ο χρήστης τομέα. Εάν όχι, τότε δεν γίνεται καμία ενέργεια.
  • Εάν ο χρήστης είναι χρήστης τομέα, ελέγχεται η συμμετοχή στην ομάδα διαχειριστών.
  • Εάν δεν είναι διαχειριστής, ελέγχει εάν ο Επαληθευτής Google έχει διαμορφωθεί. Εάν όχι, τότε δημιουργείται ένας κωδικός QR και αποσύνδεση χρήστη.
  • Εάν δεν είναι διαχειριστής και έχει διαμορφωθεί ο Επαληθευτής Google, τότε απλώς αποσυνδεθείτε.
  • Εάν είστε διαχειριστής, ελέγξτε ξανά τον Επαληθευτή Google. Εάν δεν έχει διαμορφωθεί, δημιουργείται ένας κωδικός QR.

Όλη η λογική γίνεται χρησιμοποιώντας /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

Ρύθμιση Fortigate:

  • Δημιουργούμε Ακτίνα-υπηρέτης

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Δημιουργούμε τις απαραίτητες ομάδες, εάν είναι απαραίτητο, έλεγχος πρόσβασης από ομάδες. Το όνομα ομάδας είναι ενεργοποιημένο Οχυρώστε πρέπει να ταιριάζει με την ομάδα που έχει περάσει Ειδικό Χαρακτηριστικό Προμηθευτή Fortinet-Ομάδα-Όνομα.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Επεξεργασία των απαραίτητων SSL-πύλες.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Προσθήκη ομάδων στις πολιτικές.

    Freeradius + Google Authenticator + LDAP + Fortigate

Τα πλεονεκτήματα αυτής της λύσης:

  • Είναι δυνατός ο έλεγχος ταυτότητας μέσω OTP ενεργοποιημένος Οχυρώστε λύση ανοιχτού κώδικα.
  • Ο χρήστης δεν εισάγει κωδικό πρόσβασης τομέα κατά τη σύνδεση μέσω VPN, κάτι που απλοποιεί κάπως τη διαδικασία σύνδεσης. Ο 6ψήφιος κωδικός πρόσβασης είναι ευκολότερος να εισαχθεί από αυτόν που παρέχεται από την πολιτική ασφαλείας. Ως αποτέλεσμα, ο αριθμός των εισιτηρίων με θέμα: "Δεν μπορώ να συνδεθώ στο VPN" μειώνεται.

Υ.Γ. Σχεδιάζουμε να αναβαθμίσουμε αυτήν τη λύση σε έναν πλήρη έλεγχο ταυτότητας δύο παραγόντων με πρόκληση-απόκριση.

Ενημέρωση:

Όπως υποσχέθηκα, το τροποποίησα στην επιλογή πρόκλησης-απόκρισης.
Έτσι:
Στο αρχείο /etc/raddb/sites-enabled/default Ενότητα εξουσιοδοτώ μοιάζει με αυτό:

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
}

Τμήμα πιστοποιώ την αυθεντικότητα τώρα μοιάζει με αυτό:

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
}

Τώρα η επαλήθευση χρήστη πραγματοποιείται σύμφωνα με τον ακόλουθο αλγόριθμο:

  • Ο χρήστης εισάγει πιστώσεις τομέα στον πελάτη VPN.
  • Το Freeradius ελέγχει την εγκυρότητα του λογαριασμού και του κωδικού πρόσβασης
  • Εάν ο κωδικός πρόσβασης είναι σωστός, τότε αποστέλλεται ένα αίτημα για ένα διακριτικό.
  • Το διακριτικό επαληθεύεται.
  • κέρδος).

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο