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

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

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

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

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

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

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

سنستخدم جهازًا افتراضيًا مزودًا بـ OpenVPN وEasy-RSA الإصدار 3 على CetntOS 7، والذي تم تخصيص 100 وحدات معالجة مركزية افتراضية و4 جيجا بايت من ذاكرة الوصول العشوائي لكل 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 لعملاء VPN.

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

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

محتوى

  1. تثبيت نظام التشغيل والبرامج التطبيقية
  2. إعداد التشفير
  3. إعداد برنامج OpenVPN
  4. المصادقة الإعلانية
  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)، وإصدار مفتاح جذر المرجع المصدق (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؛
  • هناك حاجة إلى السطرين الأخيرين لتنفيذ المصادقة في AD**.

*نطاق العناوين المحدد في المثال سيسمح لما يصل إلى 127 عميلًا بالاتصال في وقت واحد، لأنه يتم تحديد شبكة /23، ويقوم OpenVPN بإنشاء شبكة فرعية لكل عميل باستخدام القناع /30.
إذا لزم الأمر بشكل خاص، يمكن تغيير المنفذ والبروتوكول، ومع ذلك، يجب أن يؤخذ في الاعتبار أن تغيير رقم منفذ المنفذ سوف يستلزم تكوين SELinux، واستخدام بروتوكول TCP سيزيد من الحمل، لأن يتم بالفعل تنفيذ التحكم في تسليم حزم TCP على مستوى الحزم المغلفة في النفق.

**إذا لم تكن هناك حاجة إلى المصادقة في 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

التفسير:

  • السطر الأول هو شهادة الخادم؛
  • الشخصية الأولى
    • الخامس (صالح) - صالح؛
    • 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

إضافة تعليق