تنظيم العمل عن بعد SMB على OpenVPN

صياغة المشكلة


تصف المقالة تنظيم الوصول عن بعد للموظفين على منتجات مفتوحة المصدر ويمكن استخدامها لبناء نظام مستقل تمامًا وستكون مفيدة للتوسع عندما يكون هناك نقص في التراخيص في نظام تجاري قائم أو عندما يكون أدائه غير كافٍ.

الغرض من هذه المقالة هو تقديم نظام كامل لتوفير الوصول عن بعد إلى منظمة ، وهو ما يزيد قليلاً عن "تثبيت OpenVPN في 10 دقائق".

ونتيجة لذلك ، نحصل على نظام يتم فيه استخدام الشهادات ودليل شركة Active Directory (اختياريًا) لمصادقة المستخدم. إلى. نحصل على نظام مع عاملين للتحقق - ما لدي (الشهادة) وما أعرفه (كلمة المرور).

علامة على السماح للمستخدم بالاتصال هي عضويته في مجموعة myVPNUsr. سيتم استخدام المرجع المصدق بشكل مستقل.

تكلفة تنفيذ الحل ليست سوى موارد أجهزة صغيرة وساعة واحدة من عمل مسؤول النظام.

سنستخدم جهازًا افتراضيًا مع OpenVPN و Easy-RSA الإصدار الثالث على CetntOS 7 ، والذي يعتمد على 100 اتصال أصدر 4 vCPU و 4 GiB RAM.

في المثال ، شبكة مؤسستنا هي 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 مخصصة لعملاء VPN .

للاتصال من الخارج ، يتم استخدام الاتصال على المنفذ 1194 / UDP ، ويتم إنشاء سجل A gw.abc.ru في DNS الخاص بخادمنا.

لا ينصح بشدة بتعطيل SELinux! يعمل OpenVPN بدون تعطيل سياسات الأمان.

المحتوى


  1. نظام التشغيل وتثبيت برنامج التطبيق
  2. إعداد التشفير
  3. تكوين OpenVPN
  4. المصادقة في م
  5. التشغيل والتشخيص
  6. إصدار وإلغاء الشهادة
  7. تكوين شبكة
  8. ماذا بعد


نظام التشغيل وتثبيت برنامج التطبيق


نستخدم أدوات التوزيع CentOS 7.8.2003. نحن بحاجة إلى تثبيت نظام التشغيل في الحد الأدنى من التكوين. من السهل القيام بذلك باستخدام kickstart ، واستنساخ صورة نظام التشغيل المثبتة مسبقًا ، ووسائل أخرى.

بعد التثبيت ، وتعيين عنوان لواجهة الشبكة (وفقًا لشروط المهمة 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="admin@abc.ru"
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 سنوات كبيسة). يجب تعديل هذه القيمة قبل إصدار شهادات المستخدم.

بعد ذلك ، قم بإعداد مرجع مصدق مستقل.

يتضمن التكوين تصدير المتغيرات ، وتهيئة المرجع المصدق ، وإصدار المفتاح الجذر وشهادة المرجع المصدق ، ومفتاح Diffie-Hellman ، ومفتاح TLS ، بالإضافة إلى مفتاح الخادم والشهادة. يجب حماية مفتاح المرجع المصدق بعناية والحفاظ على سريته! يمكن ترك جميع المعلمات عند الطلبات بشكل افتراضي.

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 واحدة أو أكثر ؛
  • آخر سطرين مطلوبان لتنفيذ المصادقة في AD **.

* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .

** AD , , — , auth-user-pass.


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.ru \ myGrp) ؛
  • SearchFilter "(cn = myVPNUsr)" هو اسم المجموعة التي تم حلها.


التشغيل والتشخيص


الآن يمكننا محاولة تشغيل وبدء الخادم الخاص بنا:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

تدقيق الإطلاق:

systemctl status openvpn@server.service
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 ، يتوفر التوزيع على موقع المطور .

في الختام ، نربط خادمنا الجديد بأنظمة المراقبة والأرشفة ، ولا ننسى تثبيت التحديثات بانتظام.

اتصال مستقر!

All Articles