Οργάνωση απομακρυσμένης εργασίας ενός οργανισμού SMB στο OpenVPN

Δήλωση προβλήματος

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

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

Ως αποτέλεσμα, θα λάβουμε ένα σύστημα στο οποίο θα χρησιμοποιούνται πιστοποιητικά και (προαιρετικά) η εταιρική υπηρεσία καταλόγου Active Directory για τον έλεγχο ταυτότητας των χρηστών. Οτι. θα πάρουμε ένα σύστημα με δύο παράγοντες επαλήθευσης - τι έχω (πιστοποιητικό) και τι ξέρω (κωδικός πρόσβασης).

Ένα σημάδι ότι ένας χρήστης επιτρέπεται να συνδεθεί είναι η συμμετοχή του στην ομάδα myVPNUsr. Η αρχή έκδοσης πιστοποιητικών θα χρησιμοποιηθεί εκτός σύνδεσης.

Το κόστος υλοποίησης της λύσης είναι μόνο μικροί πόροι υλικού και 1 ώρα εργασίας του διαχειριστή του συστήματος.

Θα χρησιμοποιήσουμε μια εικονική μηχανή με OpenVPN και Easy-RSA έκδοση 3 στο CetntOS 7, στην οποία εκχωρούνται 100 vCPU και 4 GiB RAM ανά 4 συνδέσεις.

Στο παράδειγμα, το δίκτυο του οργανισμού μας είναι 172.16.0.0/16, στον οποίο ο διακομιστής VPN με τη διεύθυνση 172.16.19.123 βρίσκεται στο τμήμα 172.16.19.0/24, οι διακομιστές DNS 172.16.16.16 και 172.16.17.17, και 172.16.20.0, και 23. Το .XNUMX/XNUMX έχει εκχωρηθεί για πελάτες VPN.

Για να συνδεθείτε από έξω, χρησιμοποιείται μια σύνδεση μέσω της θύρας 1194/udp και έχει δημιουργηθεί ένα αρχείο A-record gw.abc.ru στο DNS για τον διακομιστή μας.

Δεν συνιστάται αυστηρά να απενεργοποιήσετε το SELinux! Το OpenVPN λειτουργεί χωρίς να απενεργοποιεί τις πολιτικές ασφαλείας.

περιεχόμενο

  1. Εγκατάσταση ΛΣ και λογισμικού εφαρμογών
  2. Ρύθμιση κρυπτογραφίας
  3. Ρύθμιση του OpenVPN
  4. Πιστοποίηση AD
  5. Εκκίνηση και διάγνωση
  6. Έκδοση πιστοποιητικού και ανάκληση
  7. Διαμόρφωση δικτύου
  8. Ποιο είναι το επόμενο

Εγκατάσταση ΛΣ και λογισμικού εφαρμογών

Χρησιμοποιούμε τη διανομή CentOS 7.8.2003. Πρέπει να εγκαταστήσουμε το λειτουργικό σύστημα σε ελάχιστη διαμόρφωση. Είναι βολικό να το κάνετε αυτό χρησιμοποιώντας ξεκινούν, κλωνοποίηση μιας προηγουμένως εγκατεστημένης εικόνας του λειτουργικού συστήματος και άλλων μέσων.

Μετά την εγκατάσταση, εκχωρώντας μια διεύθυνση στη διεπαφή δικτύου (σύμφωνα με τους όρους της εργασίας 172.16.19.123), ενημερώνουμε το λειτουργικό σύστημα:

$ sudo yum update -y && reboot

Πρέπει επίσης να βεβαιωθούμε ότι ο συγχρονισμός χρόνου εκτελείται στο μηχάνημά μας.
Για να εγκαταστήσετε το λογισμικό εφαρμογής, χρειάζεστε τα πακέτα openvpn, openvpn-auth-ldap, easy-rsa και vim ως κύριο πρόγραμμα επεξεργασίας (θα χρειαστείτε το αποθετήριο EPEL).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Είναι χρήσιμο να εγκαταστήσετε έναν επισκέπτη πράκτορα για μια εικονική μηχανή:

$ sudo yum install open-vm-tools

για κεντρικούς υπολογιστές VMware ESXi ή για oVirt

$ sudo yum install ovirt-guest-agent

Ρύθμιση κρυπτογραφίας

Μεταβείτε στον κατάλογο easy-rsa:

$ cd /usr/share/easy-rsa/3/

Δημιουργήστε ένα αρχείο μεταβλητής:

$ sudo vim vars

το ακόλουθο περιεχόμενο:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Οι παράμετροι για τον οργανισμό υπό όρους ABC LLC περιγράφονται εδώ· μπορείτε να τις διορθώσετε στις πραγματικές ή να τις αφήσετε από το παράδειγμα. Το πιο σημαντικό πράγμα στις παραμέτρους είναι η τελευταία γραμμή, η οποία καθορίζει την περίοδο ισχύος του πιστοποιητικού σε ημέρες. Το παράδειγμα χρησιμοποιεί την τιμή 10 έτη (365*10+2 δίσεκτα έτη). Αυτή η τιμή θα πρέπει να προσαρμοστεί πριν από την έκδοση πιστοποιητικών χρήστη.

Στη συνέχεια, διαμορφώνουμε μια αυτόνομη αρχή πιστοποίησης.

Η ρύθμιση περιλαμβάνει την εξαγωγή μεταβλητών, την προετοιμασία της ΑΠ, την έκδοση του κλειδιού και του πιστοποιητικού ρίζας CA, του κλειδιού Diffie-Hellman, του κλειδιού TLS και του κλειδιού και του πιστοποιητικού διακομιστή. Το κλειδί CA πρέπει να προστατεύεται προσεκτικά και να διατηρείται μυστικό! Όλες οι παράμετροι ερωτήματος μπορούν να παραμείνουν ως προεπιλογές.

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

Αυτό ολοκληρώνει το κύριο μέρος της ρύθμισης του κρυπτογραφικού μηχανισμού.

Ρύθμιση του OpenVPN

Μεταβείτε στον κατάλογο OpenVPN, δημιουργήστε καταλόγους υπηρεσιών και προσθέστε έναν σύνδεσμο στο easy-rsa:

cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/

Δημιουργήστε το κύριο αρχείο διαμόρφωσης OpenVPN:

$ sudo vim server.conf

το παρακάτω περιεχόμενο

port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

Μερικές σημειώσεις για τις παραμέτρους:

  • εάν προσδιορίστηκε διαφορετικό όνομα κατά την έκδοση του πιστοποιητικού, υποδείξτε το·
  • καθορίστε το σύνολο των διευθύνσεων που ταιριάζουν στις εργασίες σας*.
  • μπορεί να υπάρχουν μία ή περισσότερες διαδρομές και διακομιστές DNS.
  • Οι τελευταίες 2 γραμμές απαιτούνται για την εφαρμογή του ελέγχου ταυτότητας στο AD**.

*Το εύρος των διευθύνσεων που επιλέχθηκε στο παράδειγμα θα επιτρέψει σε έως και 127 πελάτες να συνδεθούν ταυτόχρονα, επειδή επιλέγεται το δίκτυο /23 και το OpenVPN δημιουργεί ένα υποδίκτυο για κάθε πελάτη χρησιμοποιώντας τη μάσκα /30.
Εάν είναι ιδιαίτερα απαραίτητο, η θύρα και το πρωτόκολλο μπορούν να αλλάξουν, ωστόσο, θα πρέπει να ληφθεί υπόψη ότι η αλλαγή του αριθμού θύρας θα συνεπάγεται τη διαμόρφωση του SELinux και η χρήση του πρωτοκόλλου tcp θα αυξήσει το κόστος, επειδή Ο έλεγχος παράδοσης πακέτων TCP εκτελείται ήδη στο επίπεδο των πακέτων που είναι εγκλωβισμένα στη σήραγγα.

**Εάν δεν απαιτείται έλεγχος ταυτότητας στο AD, σχολιάστε τα, παραλείψτε την επόμενη ενότητα και στο πρότυπο αφαιρέστε τη γραμμή auth-user-pass.

Πιστοποίηση AD

Για να υποστηρίξουμε τον δεύτερο παράγοντα, θα χρησιμοποιήσουμε την επαλήθευση λογαριασμού στο AD.

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

Δημιουργήστε ένα αρχείο ρυθμίσεων:

/etc/openvpn/ldap.conf

το παρακάτω περιεχόμενο

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Βασικές παράμετροι:

  • URL "ldap://ldap.abc.ru" - διεύθυνση ελεγκτή τομέα.
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" - κανονικό όνομα για τη σύνδεση στο LDAP (UZ - bindUsr στο κοντέινερ abc.ru/Users).
  • Κωδικός πρόσβασης b1ndP@SS — κωδικός πρόσβασης χρήστη για δέσμευση.
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — η διαδρομή από την οποία θα ξεκινήσει η αναζήτηση του χρήστη.
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – κοντέινερ της επιτρεπόμενης ομάδας (ομάδα myVPNUsr στο κοντέινερ abc.rumyGrp).
  • SearchFilter "(cn=myVPNUsr)" είναι το όνομα της επιτρεπόμενης ομάδας.

Εκκίνηση και διάγνωση

Τώρα μπορούμε να προσπαθήσουμε να ενεργοποιήσουμε και να ξεκινήσουμε τον διακομιστή μας:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Έλεγχος εκκίνησης:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Έκδοση πιστοποιητικού και ανάκληση

Επειδή Εκτός από τα ίδια τα πιστοποιητικά, χρειάζεστε κλειδιά και άλλες ρυθμίσεις· είναι πολύ βολικό να τυλίξετε όλα αυτά σε ένα αρχείο προφίλ. Αυτό το αρχείο στη συνέχεια μεταφέρεται στον χρήστη και το προφίλ εισάγεται στον υπολογιστή-πελάτη OpenVPN. Για να γίνει αυτό, θα δημιουργήσουμε ένα πρότυπο ρυθμίσεων και ένα σενάριο που δημιουργεί το προφίλ.

Πρέπει να προσθέσετε τα περιεχόμενα των αρχείων πιστοποιητικού ρίζας (ca.crt) και κλειδιού TLS (ta.key) στο προφίλ.

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

vim /usr/share/easy-rsa/3/vars

...
export EASYRSA_CERT_EXPIRE=180

vim /usr/share/easy-rsa/3/client/template.ovpn

client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass

<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

Σημειώσεις:

  • γραμμές ΒΑΛΤΕ ΤΟ... αλλαγή σε περιεχόμενο τους πιστοποιητικά?
  • στην απομακρυσμένη οδηγία, καθορίστε το όνομα/διεύθυνση της πύλης σας.
  • η οδηγία auth-user-pass χρησιμοποιείται για πρόσθετο εξωτερικό έλεγχο ταυτότητας.

Στον αρχικό κατάλογο (ή σε άλλο βολικό μέρος) δημιουργούμε ένα σενάριο για να ζητήσουμε ένα πιστοποιητικό και να δημιουργήσουμε ένα προφίλ:

vim ~/make.profile.sh

#!/bin/bash

if [ -z "$1" ] ; then
 echo Missing mandatory client name. Usage: $0 vpn-username
 exit 1
fi

#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn

#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client

cd $basepath

if [  -f client/$client* ]; then
    echo "*** ERROR! ***"
    echo "Certificate $client already issued!"
    echo "*** ERROR! ***"
    exit 1
fi

. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client

#Make profile
cp $clntpath/template.ovpn $profile

echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile

echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt

echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile

#remove tmp file
rm -f $basepath/$1.crt

echo Complete. See $profile file.

cd ~

Κάνοντας το αρχείο εκτελέσιμο:

chmod a+x ~/make.profile.sh

Και μπορούμε να εκδώσουμε το πρώτο μας πιστοποιητικό.

~/make.profile.sh my-first-user

Επανεξέταση

Σε περίπτωση παραβίασης πιστοποιητικού (απώλεια, κλοπή), είναι απαραίτητη η ανάκληση αυτού του πιστοποιητικού:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Προβολή πιστοποιητικών που έχουν εκδοθεί και ανακληθεί

Για να δείτε τα πιστοποιητικά που έχουν εκδοθεί και ανακληθεί, απλώς προβάλετε το αρχείο ευρετηρίου:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Επεξήγηση:

  • Η πρώτη γραμμή είναι το πιστοποιητικό διακομιστή.
  • πρώτος χαρακτήρας
    • V (Ισχύει) - ισχύει;
    • R (Ανακλήθηκε) - υπενθύμισε.

Διαμόρφωση δικτύου

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

Επιτρέπονται οι συνδέσεις στο τοπικό τείχος προστασίας:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Στη συνέχεια, ενεργοποιήστε τη δρομολόγηση επισκεψιμότητας IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

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

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

και αποθηκεύστε τη διαμόρφωση.

Επιπλέον, στη διεπαφή του δρομολογητή συνόρων όπου εξυπηρετείται η εξωτερική διεύθυνση gw.abc.ru, είναι απαραίτητο να επιτρέπεται η διέλευση των πακέτων udp/1194.

Σε περίπτωση που ο οργανισμός έχει αυστηρούς κανόνες ασφαλείας, ένα τείχος προστασίας πρέπει επίσης να ρυθμιστεί στον διακομιστή VPN μας. Κατά τη γνώμη μου, η μεγαλύτερη ευελιξία παρέχεται με τη ρύθμιση των αλυσίδων iptables FORWARD, αν και η τοποθέτησή τους είναι λιγότερο βολική. Λίγα περισσότερα για τη ρύθμιση τους. Για να γίνει αυτό, είναι πιο βολικό να χρησιμοποιήσετε "άμεσους κανόνες" - άμεσους κανόνες, αποθηκευμένους σε ένα αρχείο /etc/firewalld/direct.xml. Η τρέχουσα διαμόρφωση των κανόνων μπορεί να βρεθεί ως εξής:

$ sudo firewall-cmd --direct --get-all-rule

Πριν αλλάξετε ένα αρχείο, δημιουργήστε ένα αντίγραφο ασφαλείας του:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Τα περιεχόμενα του αρχείου κατά προσέγγιση είναι:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Επεξηγήσεις

Αυτοί είναι ουσιαστικά κανονικοί κανόνες iptables, διαφορετικά συσκευάζονται μετά την εμφάνιση του τείχους προστασίας.

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

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

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Η εφαρμογή ρυθμίσεων είναι η συνηθισμένη εντολή τείχους προστασίας για να διαβάσετε ξανά τις ρυθμίσεις:

$ sudo firewall-cmd --reload

Μπορείτε να δείτε πακέτα που απορρίφθηκαν ως εξής:

grep forward_fw /var/log/messages

Ποιο είναι το επόμενο

Αυτό ολοκληρώνει τη ρύθμιση!

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

Τέλος, συνδέουμε τον νέο μας διακομιστή με τα συστήματα παρακολούθησης και αρχειοθέτησης και μην ξεχνάμε να εγκαθιστούμε τακτικά ενημερώσεις.

Σταθερή σύνδεση!

Πηγή: www.habr.com

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