OpenVPN'de bir KOBİ kuruluşunun uzaktan çalışmasının organizasyonu

Sorunun formüle edilmesi

Makalede, açık kaynaklı ürünlere çalışanlar için uzaktan erişimin organizasyonu anlatılmaktadır ve hem tamamen otonom bir sistem oluşturmak için kullanılabilir hem de mevcut ticari sistemde lisans sıkıntısı olduğunda veya performansı yetersiz olduğunda genişleme için faydalı olacaktır.

Makalenin amacı, bir kuruluşa uzaktan erişim sağlamak için "OpenVPN'i 10 dakikada kurmak"tan biraz daha fazlası olan eksiksiz bir sistem uygulamaktır.

Sonuç olarak, kullanıcıların kimliğini doğrulamak için sertifikaların ve (isteğe bağlı olarak) kurumsal Active Directory'nin kullanılacağı bir sistem elde edeceğiz. O. iki doğrulama faktörüne sahip bir sistem elde edeceğiz - sahip olduklarım (sertifika) ve bildiklerim (şifre).

Bir kullanıcının bağlanmasına izin verildiğinin bir işareti, myVPNUsr grubuna üye olmasıdır. Sertifika yetkilisi çevrimdışı kullanılacak.

Çözümü uygulamanın maliyeti yalnızca küçük donanım kaynakları ve sistem yöneticisinin 1 saatlik çalışmasıdır.

CetntOS 3 üzerinde OpenVPN ve Easy-RSA sürüm 7'e sahip, 100 bağlantı başına 4 vCPU ve 4 GiB RAM tahsis edilmiş bir sanal makine kullanacağız.

Örnekte kuruluşumuzun ağı 172.16.0.0/16 olup, 172.16.19.123 adresli VPN sunucusu 172.16.19.0/24 segmentinde, DNS sunucuları 172.16.16.16 ve 172.16.17.17 ve alt ağ 172.16.20.0'da yer almaktadır. .23/XNUMX VPN istemcileri için ayrılmıştır.

Dışarıdan bağlanmak için 1194/udp portu üzerinden bağlantı kullanılmış ve sunucumuz için DNS'de gw.abc.ru A kaydı oluşturulmuştur.

SELinux'un devre dışı bırakılması kesinlikle önerilmez! OpenVPN, güvenlik politikalarını devre dışı bırakmadan çalışır.

Içerik

  1. İşletim sistemi ve uygulama yazılımının kurulumu
  2. Kriptografiyi ayarlama
  3. OpenVPN'i Yapılandırma
  4. AD Kimlik Doğrulaması
  5. Başlatma ve teşhis
  6. Sertifika verilmesi ve iptali
  7. Ağ yapılandırması
  8. sonra ne

İşletim sistemi ve uygulama yazılımının kurulumu

CentOS 7.8.2003 dağıtımını kullanıyoruz. İşletim sistemini minimum konfigürasyonda kurmamız gerekiyor. Bunu kullanarak yapmak uygundur kickstart, önceden yüklenmiş bir işletim sistemi görüntüsünün klonlanması ve diğer yollar.

Kurulumdan sonra ağ arayüzüne bir adres atayarak (172.16.19.123 görev şartlarına göre) işletim sistemini güncelliyoruz:

$ sudo yum update -y && reboot

Ayrıca makinemizde zaman senkronizasyonunun yapıldığından emin olmamız gerekiyor.
Uygulama yazılımını yüklemek için ana düzenleyici olarak openvpn, openvpn-auth-ldap, easy-rsa ve vim paketlerine ihtiyacınız vardır (EPEL deposuna ihtiyacınız olacaktır).

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

Bir sanal makine için konuk aracı kurmak faydalıdır:

$ sudo yum install open-vm-tools

VMware ESXi ana bilgisayarları veya oVirt için

$ sudo yum install ovirt-guest-agent

Kriptografiyi ayarlama

easy-rsa dizinine gidin:

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

Değişken bir dosya oluşturun:

$ sudo vim vars

aşağıdaki içerik:

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

Koşullu organizasyon ABC LLC'nin parametreleri burada açıklanmaktadır, bunları gerçek olanlarla düzeltebilir veya örnekten bırakabilirsiniz. Parametrelerde en önemli şey sertifikanın geçerlilik süresini gün olarak belirleyen son satırdır. Örnekte 10 yıl değeri kullanılmaktadır (365*10+2 artık yıl). Kullanıcı sertifikaları verilmeden önce bu değerin ayarlanması gerekecektir.

Daha sonra özerk bir sertifika yetkilisi yapılandırıyoruz.

Kurulum, değişkenlerin dışarı aktarılmasını, CA'nın başlatılmasını, CA kök anahtarının ve sertifikasının verilmesini, Diffie-Hellman anahtarını, TLS anahtarını ve sunucu anahtarı ve sertifikasını içerir. CA anahtarı dikkatle korunmalı ve gizli tutulmalıdır! Tüm sorgu parametreleri varsayılan olarak bırakılabilir.

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

Bu, şifreleme mekanizmasını kurmanın ana bölümünü tamamlar.

OpenVPN'i Yapılandırma

OpenVPN dizinine gidin, hizmet dizinleri oluşturun ve easy-rsa'ya bir bağlantı ekleyin:

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/

Ana OpenVPN yapılandırma dosyasını oluşturun:

$ sudo vim server.conf

aşağıdaki içerik

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

Parametrelerle ilgili bazı notlar:

  • sertifika verilirken farklı bir ad belirtildiyse bunu belirtin;
  • Görevlerinize uygun adres havuzunu belirtin*;
  • bir veya daha fazla rota ve DNS sunucusu olabilir;
  • AD'de kimlik doğrulamayı uygulamak için son 2 satıra ihtiyaç vardır**.

*Örnekte seçilen adres aralığı 127'ye kadar istemcinin aynı anda bağlanmasına olanak tanıyacaktır, çünkü /23 ağı seçilir ve OpenVPN, /30 maskesini kullanarak her istemci için bir alt ağ oluşturur.
Özellikle gerekliyse port ve protokol değiştirilebilir, ancak port port numarasını değiştirmenin SELinux'un yapılandırılmasını gerektireceği ve tcp protokolünün kullanılmasının ek yükü artıracağı unutulmamalıdır. TCP paket dağıtım kontrolü zaten tünelde kapsüllenen paketler düzeyinde gerçekleştirilir.

**AD'de kimlik doğrulama gerekmiyorsa bunları yorumlayın, sonraki bölümü atlayın ve şablonda au-user-pass satırını kaldırın.

AD Kimlik Doğrulaması

İkinci faktörü desteklemek için AD'de hesap doğrulamayı kullanacağız.

Etki alanında sıradan bir kullanıcının ve bir grubun haklarına sahip, üyeliğinin bağlanma yeteneğini belirleyeceği bir hesaba ihtiyacımız var.

Bir yapılandırma dosyası oluşturun:

/etc/openvpn/ldap.conf

aşağıdaki içerik

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

Ana parametreleri:

  • URL “ldap://ldap.abc.ru” - etki alanı denetleyicisinin adresi;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - LDAP'ye bağlanma için standart ad (UZ - abc.ru/Users kapsayıcısında bindUsr);
  • Şifre b1ndP@SS — bağlama için kullanıcı şifresi;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — kullanıcıyı aramaya başlanacak yol;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – izin veren grubun kapsayıcısı (abc.rumyGrp kapsayıcısındaki myVPNUsr grubu);
  • SearchFilter "(cn=myVPNUsr)" izin veren grubun adıdır.

Başlatma ve teşhis

Artık sunucumuzu etkinleştirip başlatmayı deneyebiliriz:

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

Başlangıç ​​kontrolü:

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

Sertifika verilmesi ve iptali

Çünkü Sertifikaların yanı sıra anahtarlara ve diğer ayarlara da ihtiyacınız var, tüm bunları tek bir profil dosyasına sarmak çok uygun. Bu dosya daha sonra kullanıcıya aktarılır ve profil OpenVPN istemcisine aktarılır. Bunu yapmak için bir ayar şablonu ve profili oluşturan bir komut dosyası oluşturacağız.

Kök sertifika (ca.crt) ve TLS anahtar (ta.key) dosyalarının içeriğini profile eklemeniz gerekir.

Kullanıcı sertifikalarını vermeden önce Sertifikalar için gerekli geçerlilik süresini ayarlamayı unutmayın parametreler dosyasında. Çok uzatmamalısınız, maksimum 180 gün ile sınırlandırmanızı tavsiye ederim.

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>

Notlar:

  • Teller KENDİNİZİ KOYUN... içeriğe geçiş Ateş sertifikalar;
  • uzak yönergede ağ geçidinizin adını/adresini belirtin;
  • auth-user-pass yönergesi ek harici kimlik doğrulama için kullanılır.

Ana dizinde (veya başka bir uygun yerde), sertifika istemek ve profil oluşturmak için bir komut dosyası oluştururuz:

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 ~

Dosyayı yürütülebilir hale getirmek:

chmod a+x ~/make.profile.sh

Ve ilk sertifikamızı verebiliriz.

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

geri çağırma

Bir sertifikanın tehlikeye girmesi durumunda (kaybolması, çalınması), bu sertifikanın iptal edilmesi gerekir:

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

Verilen ve iptal edilen sertifikaları görüntüleyin

Verilen ve iptal edilen sertifikaları görüntülemek için dizin dosyasını görüntülemeniz yeterlidir:

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

Açıklama:

  • ilk satır sunucu sertifikasıdır;
  • ilk karakter
    • V (Geçerli) - geçerli;
    • R (İptal edildi) - geri çağrıldı.

Ağ yapılandırması

Son adımlar iletim ağının (yönlendirme ve güvenlik duvarları) yapılandırılmasıdır.

Yerel güvenlik duvarındaki bağlantılara izin verme:

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

Ardından IP trafiği yönlendirmesini etkinleştirin:

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

Kurumsal bir ortamda, alt ağların olması muhtemeldir ve yönlendiricilere, VPN istemcilerimize yönelik paketleri nasıl göndereceklerini söylememiz gerekir. Komut satırında komutu şu şekilde yürütürüz (kullanılan ekipmana bağlı olarak):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

ve yapılandırmayı kaydedin.

Ayrıca gw.abc.ru harici adresinin sunulduğu sınır yönlendirici arayüzünde udp/1194 paketlerinin geçişine izin verilmesi gerekir.

Kuruluşun sıkı güvenlik kurallarına sahip olması durumunda VPN sunucumuzda bir güvenlik duvarının da yapılandırılması gerekir. Bana göre en büyük esneklik, iptables FORWARD zincirlerinin kurulmasıyla sağlanır, ancak bunları ayarlamak daha az kullanışlıdır. Bunları ayarlama hakkında biraz daha. Bunu yapmak için, bir dosyada saklanan "doğrudan kuralları" - doğrudan kuralları kullanmak en uygunudur /etc/firewalld/direct.xml. Kuralların mevcut konfigürasyonu şu şekilde bulunabilir:

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

Bir dosyayı değiştirmeden önce yedek kopyasını alın:

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

Dosyanın yaklaşık içeriği şöyledir:

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

Açıklama

Bunlar esasen normal iptables kurallarıdır, aksi takdirde güvenlik duvarının ortaya çıkmasından sonra paketlenirler.

Varsayılan ayarlara sahip hedef arayüz tun0'dır ve tünelin harici arayüzü, kullanılan platforma bağlı olarak ens192 gibi farklı olabilir.

Son satır bırakılan paketleri günlüğe kaydetmek içindir. Oturum açma işleminin çalışması için güvenlik duvarı yapılandırmasındaki hata ayıklama düzeyini değiştirmeniz gerekir:

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

Ayarları uygulamak, ayarları yeniden okumak için kullanılan olağan güvenlik duvarı komutudur:

$ sudo firewall-cmd --reload

Bırakılan paketleri şu şekilde görüntüleyebilirsiniz:

grep forward_fw /var/log/messages

sonra ne

Bu, kurulumu tamamlar!

Geriye kalan tek şey istemci yazılımını istemci tarafına yüklemek, profili içe aktarmak ve bağlanmaktır. Windows işletim sistemleri için dağıtım kiti şu adreste bulunur: geliştirici web sitesi.

Son olarak yeni sunucumuzu izleme ve arşivleme sistemlerine bağlıyoruz ve güncellemeleri düzenli olarak yüklemeyi unutmuyoruz.

Kararlı bağlantı!

Kaynak: habr.com

Yorum ekle