توضح المقالة تنظيم الوصول عن بعد للموظفين إلى المنتجات مفتوحة المصدر ويمكن استخدامها لبناء نظام مستقل تمامًا، وستكون مفيدة للتوسع عندما يكون هناك نقص في التراخيص في النظام التجاري الحالي أو يكون أدائه غير كافٍ.
الهدف من هذه المقالة هو تنفيذ نظام كامل لتوفير الوصول عن بعد إلى مؤسسة ما، وهو ما يزيد قليلًا عن "تثبيت 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 دون تعطيل سياسات الأمان.
نحن نستخدم توزيع CentOS 7.8.2003. نحن بحاجة إلى تثبيت نظام التشغيل في الحد الأدنى من التكوين. أنها مريحة للقيام بذلك باستخدام ركلة البدايةواستنساخ صورة نظام التشغيل المثبتة مسبقًا ووسائل أخرى.
بعد التثبيت، وتعيين عنوان لواجهة الشبكة (وفقًا لشروط المهمة 172.16.19.123)، نقوم بتحديث نظام التشغيل:
$ sudo yum update -y && reboot
نحتاج أيضًا إلى التأكد من إجراء مزامنة الوقت على أجهزتنا.
لتثبيت البرنامج التطبيقي، تحتاج إلى حزم openvpn وopenvpn-auth-ldap وeasy-rsa وvim كمحرر رئيسي (ستحتاج إلى مستودع EPEL).
تم وصف المعلمات الخاصة بالمؤسسة الشرطية ABC LLC هنا، ويمكنك تصحيحها إلى المعلمات الحقيقية أو تركها من المثال. أهم شيء في المعلمات هو السطر الأخير الذي يحدد مدة صلاحية الشهادة بالأيام. يستخدم المثال القيمة 10 سنوات (365*10+2 سنة كبيسة). يجب تعديل هذه القيمة قبل إصدار شهادات المستخدم.
بعد ذلك، نقوم بتكوين مرجع مصدق مستقل.
يتضمن الإعداد تصدير المتغيرات، وتهيئة المرجع المصدق (CA)، وإصدار مفتاح جذر المرجع المصدق (CA) والشهادة، ومفتاح Diffie-Hellman، ومفتاح TLS، ومفتاح الخادم والشهادة. يجب حماية مفتاح CA بعناية وإبقائه سريًا! يمكن ترك كافة معلمات الاستعلام كإعداد افتراضي.
انتقل إلى دليل 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، قم بالتعليق عليها، وتخطي القسم التالي، وفي القالب قم بإزالة سطر مصادقة المستخدم.
المصادقة الإعلانية
لدعم العامل الثاني، سوف نستخدم التحقق من الحساب في م.
نحتاج إلى حساب في المجال يتمتع بحقوق المستخدم العادي ومجموعة، حيث ستحدد العضوية القدرة على الاتصال.
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 (تم إبطاله) - تم التذكير به.
تكوين شبكة
تتمثل الخطوات الأخيرة في تكوين شبكة النقل - التوجيه وجدران الحماية.
في بيئة الشركة، من المحتمل أن تكون هناك شبكات فرعية ونحتاج إلى إخبار جهاز التوجيه (أجهزة التوجيه) بكيفية إرسال الحزم الموجهة لعملاء 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. يمكن العثور على التكوين الحالي للقواعد على النحو التالي: