OpenVPN مع تسلسل هرمي CA من مستويين

صادف مؤخرًا أنني واجهت مهمة إنشاء تسلسل هرمي من مستويين من المرجع المصدق لـ OpenVPN على دبيان. في كثير من الأحيان أتيحت لي الفرصة لرفع OpenVPN مع CA واحد وفهمت تمامًا كيف يجب أن يكون من الناحية النظرية مع اثنين من CAs ، لكن من الناحية العملية واجهت حقيقة أنني لم أفهم ماذا وأين أوقع. لم تعطيني Google إجابات مناسبة لنظام التشغيل Linux (أو لم أقم بذلك على google) وبدأت في اكتشاف ذلك. قدمت أدناه دليلاً قمت بتجميعه في عملية الإنشاء والتكوين.



أود أن أشير على الفور إلى أنني هنا أركز على إعداد CA أكثر من التركيز على OpenVPN.



قبل أن نبدأ ، سأخبر أي شخص يمكنه استخدامه مع مثالي.



كانت لدي مهمة إنشاء نظام لشركة كبيرة بحيث يقوم شخص واحد فقط بالتوقيع على شهادات خادم OpenVPN ، وهناك الكثير من خوادم VPN ، تم تثبيت العديد من خوادم VPN لكل قسم. هناك عدد أكبر من شهادات الموظفين (العملاء) والتحكم (إصدار / إلغاء) في كل مرة يأتي فيها الموظف / يترك عبئًا ثقيلًا للغاية (ناهيك عن الموظفين المؤقتين). يتم الإشراف على موظفي كل قسم من قبل رئيس القسم الذي يصدر أو يلغي شهادات الموظفين الجدد / القدامى على التوالي.



بالنسبة للشهادات والمفاتيح الرقمية المطلوبة ، فقد قيل الكثير ولن أكرر المؤلفين الآخرين ، ولكن باختصار:



  • للتحقق من الموثوقية (تحدث "مصافحة مزدوجة") ، يتأكد العميل والخادم من هويتهم ، وما إذا كان بإمكانهم الوثوق ببعضهم البعض وإنشاء اتصال ؛
  • التشفير فك التشفير؛
  • استثناءات "رجل في الوسط (MITM)" للتأكد من أن شخصًا ما لا يعترض الرسائل / حركة المرور ؛
  • لإنشاء كلمات مرور مشفرة ، مما يزيد من الأمان ويجعل من الصعب على المهاجمين الوصول إلى المضيف.


مبدأ تشغيل التسلسل الهرمي للمرجع المصدق متعدد المستويات هو أن المرجع المصدق (CA) ذو المستوى الأعلى (RootCA) يوقع شهادته لنفسه لفترة طويلة بما فيه الكفاية (ولكن هذه مسألة فردية بحتة) ، وكل واحدة تالية في التسلسل الهرمي للمرجع المصدق (CA) أو الخدمة توقع شهاداتها مع مرجع مصدق متفوق (المعتاد) البيروقراطية) بشرط أن الشهادة ذات المستوى الأدنى يجب أن تكون لها فترة صلاحية لا تزيد عن نصف فترة صلاحية الشهادة ذات المستوى الأعلى.







عند إنشاء مرجع مصدق ، يتم إنشاء ملفين: ca.crt - المفتاح العام والمفتاح ca. - المفتاح الخاص.

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



عندما نحتاج إلى إنشاء مرجع مصدق تابع / توقيع ، نقوم بإنشاء مفتاح خاص عليه وطلب للتوقيع من RootCA.



كيف ستعرف أجهزة الكمبيوتر والمستخدمون في جميع أنحاء العالم أنه يمكنهم الوثوق بخدمة أو موقع ، كما تتساءل؟ إنه أمر بسيط (حسنًا ، من الناحية النظرية) ، يتم وضع المفتاح العام لـ CA (RootCA) على أجهزة كمبيوتر المستخدم وتثق أجهزة الكمبيوتر هذه في جميع الشهادات التي تم إصدارها بواسطة CA هذا من الناحية العملية ، هذا بالتأكيد أكثر صعوبة وليس رخيصًا. ولكن من السهل جدًا القيام بذلك داخل شركتك.



للتنفيذ ، نحتاج إلى ثلاثة خوادم. سنستخدم في هذا البرنامج التعليمي debian 9. وسنسمي الخوادم وفقًا لتطبيقها: OpenVPN و SubCA و RootCA.



يتم تنفيذ جميع الإجراءات تحت المستخدم وليس الجذر.



للقيام بذلك ، يجب أن يكون المستخدم الخاص بك في مجموعة sudo.



إذا لم يتم تثبيت sudo على الخادم ، فقم بتسجيل الدخول باسم الجذر:



# su - root
# apt-get install sudo -y
# usermod -aG sudo username
# exit


نقوم بتثبيت الأدوات المساعدة اللازمة على جميع الخوادم (قد تختلف المرافق حسب المعتقدات والمعتقدات ، تعد wget و ufw و vim إلزامية ، لأنني هنا أعطيت أوامر بهذه الأدوات):



# sudo apt-get update
# sudo apt-get upgrade
# sudo apt-get install wget curl net-tools ufw vim -y
# cd ~
# wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
# tar xvf EasyRSA-3.0.4.tgz


قم بتثبيت Openvpn على خادم OpenVPN:



# sudo apt-get install openvpn -y


انتقل إلى خادم RootCA. هنا نحتاج إلى إنشاء ملف تأخذ easyrsa منه قيم المتغيرات:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


ابحث عن الكتلة ، واحذف # واستبدل قيمنا. من أجل عدم إدخال بياناتنا عند توقيع الشهادات ، سنكتبها هنا:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


بعد ذلك ، ابحث عن الإعدادات التالية ، واحذف # وقم بتعديل قيمها. هذه التوجيهات مسؤولة عن عمر الشهادات (الأول خاص بعمر شهادة المرجع المصدق ، والثاني خاص بعمر الشهادة التي يتم توقيعها):



#set_var EASYRSA_CA_EXPIRE	3650         #-->  3650
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  1825


بالإضافة إلى ذلك:



# ./easyrsa init-pki


سيطلب تشغيل الأمر التالي CN. يمكنك ترك الإعداد الافتراضي ، ولكن من الأفضل إدخال اسم تعريف لاسم مضيف (RootCA). تعني القيمة "nopass" أنك لست بحاجة إلى إنشاء كلمة مرور:



# ./easyrsa build-ca nopass


انتقل إلى خادم SubCA واتبع نفس الخطوات مع تغييرات طفيفة:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


ابحث عن الكتلة ، واحذف # واستبدل قيمنا:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


بعد ذلك ، نجد الإعدادات التالية ، وحذف # وتعديل قيمها:



#set_var EASYRSA_CA_EXPIRE	3650         #-->  1825
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  365


بالإضافة إلى ذلك:



# ./easyrsa init-pki


سيطلب تشغيل الأمر التالي CN. يمكنك ترك الإعداد الافتراضي ، ولكن من الأفضل إدخال اسم معرف مضيف (SubCA). تعني القيمة "subca" أننا نقوم بإنشاء مرجع مصدق ثانوي ونحتاج إلى إنشاء طلب توقيع شهادة:



# ./easyrsa build-ca subca nopass


بعد ذلك ، نجد الملف ~ / easyrsa / pki / reqs / ca.req (هذا هو الطلب ذاته) وننقله إلى خادم RootCA (يمكنك استخدام طريقتين: WinSCP و scp):



# scp ~/easyrsa/pki/reqs/ca.req user@ip_RootCA:/tmp


انتقل إلى خادم RootCA وقم بالتوقيع على الطلب. قبل التوقيع على الطلب ، يجب علينا استيراده إلى دليل العمل. للتوقيع على الشهادة الخاصة بالمرجع المصدق الثانوي ، نستخدم سمة "ca" واسم الشهادة (يمكنك تسميتها ca ، ولكن حتى لا يتم الخلط بيننا ، سنطلق عليها اسم الخادم الذي نوقعه عليه ، وعندما ننقله إلى الخادم ، سنعيد تسميته):



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/ca.req SubCA
# ./easyrsa sign-req ca SubCA


سيتم طلب التأكيد ، يجب إدخال "نعم".

نعيد شهادة SubCA الموقعة.



# scp ~/easyrsa/pki/issued/SubCA.crt user@ip_SubCA:/tmp


انتقل إلى خادم SubCA وانقل الشهادة إلى دليل عمل easyrsa:



# mv /tmp/SubCA.crt ~/easyrsa/pki/ca.crt


في هذه المرحلة ، لدينا بالفعل مرجع مصدق جذر ومرجع مصدق جذر ثانوي موقّع.

الآن دعنا ندخل إلى خادم OpenVPN. في إعداده ، يتم تكرار بعض الخطوات السابقة. انتقل إلى خادم OpenVPN.



# cd ~/easyrsa/
# ./easyrsa init-pki


لنبدأ الآن في إنشاء شهادات للتوقيع. سننشئ مفتاح Diffie-Hellman (dh.pem / dh2048.pem / dh1024.pem) لاستخدامه في تبادل المفاتيح ، وسننشئ توقيع HMAC (ta.key) لتعزيز وظيفة فحص سلامة TLS.



سنوقع شهادات لخادم OpenVPN على RootCA ، وسنوقع الشهادات للمستخدمين على SubCA. لنقم على الفور بإنشاء دليل حيث سنضيف مفاتيح وشهادات وتكوينات العميل.



# mkdir -p ~/client-configs/files/
# mkdir ~/client-configs/keys/
# chmod 700 ~/client-configs/
# sudo mkdir /etc/openvpn/vpnsrv1/

# ./easyrsa gen-req vpnsrv1 nopass
# ./easyrsa gen-req dumasti nopass
# ./easyrsa gen-dh
# sudo openvpn --genkey --secret ta.key
# cp /home/dumasti/easyrsa/pki/private/dumasti.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/dh.pem /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/private/vpnsrv1.key /etc/openvpn/vpnsrv1/
# scp ~/easyrsa/pki/reqs/vpnsrv1.req user@ip_RootCA:/tmp
# scp ~/easyrsa/pki/reqs/dumasti.req user@ip_SubCA:/tmp


انتقل إلى خادم RootCA وقم بالتوقيع على الشهادة. للتوقيع على شهادة الخادم ، استخدم سمة "server" للعميل "client":



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/vpnsrv1.req vpnsrv1
# ./easyrsa sign-req server vpnsrv1


سيتم طلب التأكيد ، يجب إدخال "نعم".



# scp ~/easyrsa/pki/issued/vpnsrv1.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/RootCA.crt


انتقل إلى خادم SubCA وقم بالتوقيع على الشهادة:



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/dumasti.req dumasti
# ./easyrsa sign-req client dumasti


سيتم طلب التأكيد ، يجب إدخال "نعم".



# scp ~/easyrsa/pki/issued/dumasti.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/SubCA.crt


نعود إلى خادم OpenVPN وننقل الشهادات الموقعة إلى الأدلة المطلوبة:



# cd /tmp


لكي يقبل خادم OpenVPN مفاتيح العميل ، يجب علينا دمج المفاتيح العامة للعميل والمرؤوس / المرجع المصدق في ملف واحد:



# cat dumasti.crt SubCA.crt > ~/client-configs/keys/dumasti.crt
# cp /tmp/RootCA.crt ~/client-configs/keys/ca.crt
# sudo mv /tmp/RootCA.crt /etc/openvpn/vpnsrv1/
# sudo mv /tmp/vpnsrv1.crt /etc/openvpn/vpnsrv1/


لدينا الآن جميع الشهادات المطلوبة في الأماكن الصحيحة. يبقى إنشاء تكوين خادم OpenVPN والعميل (قد يكون لكل منهما معتقداته ووجهات نظره الخاصة في هذا الشأن ، ولكن على سبيل المثال ، سيكون هناك التكوين التالي).



يمكنك استخدام قالب تكوين الخادم والعميل وتحريره بنفسك:



# sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# sudo gzip -d /etc/openvpn/server.conf.gz
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf


لكن أدناه سأقدم محتويات ملفات التكوين الجاهزة (الرموز ؛ و # التعليق خارج السطر):



# sudo cat /etc/openvpn/vpnsrv1.conf

port 1194
proto udp
dev tun
ca vpnsrv1/RootCA.crt
cert vpnsrv1/vpnsrv1.crt
key vpnsrv1/vpnsrv1.key
dh vpnsrv1/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;client-config-dir ccd
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth vpnsrv1/ta.key 0
key-direction 0
cipher AES-256-CBC
auth SHA256
max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
;mute 20
explicit-exit-notify 1

# cat ~/client-configs/base.conf

client
dev tun
proto udp
remote your_server_ip 1194
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
;tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1
verb 3
;mute 20
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf


نحتاج أيضًا إلى تكوين جدار الحماية وإعادة توجيه الحزم. من الممكن ضبط iptables ، لكن هنا سنلقي نظرة على ufw.



أولاً ، دعنا نتعرف على اسم واجهتنا:



# ip addr 


لنفتح المنافذ التالية (لدي ssh في المنفذ 22 ، و openvpn على 1194 ، إذا كان لديك منافذ أخرى ، فتصرف وفقًا لذلك):



# sudo ufw allow 1194
# sudo ufw allow 22


بعد ذلك ، افتح ملف التهيئة ufw والصق التالي قبل بدء سلسلة التصفية (استبدل قيمي بقيمك الخاصة):



# sudo vim /etc/ufw/before.rules

# START OPENVPN RULES

# NAT table rules

*nat

:POSTROUTING ACCEPT [0:0]

# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)

-A POSTROUTING -s 10.8.0.0/8 -o ens192 -j MASQUERADE

COMMIT

# END OPENVPN RULES


قبل ذلك:



# Don't delete these required lines, otherwise there will be errors
*filter


تحتاج إلى تمكين إعادة توجيه UFW للحزم افتراضيًا. ابحث عن السطر المطلوب وقم بتغيير القيمة "DROP" إلى "ACCEPT":



# sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"


تكوين إعادة توجيه الحزمة. ابحث عن السطر # net.ipv4.ip_forward = 0 أو # net.ipv4.ip_forward = 1 ، احذف # ، إذا كانت القيمة 0 ، فقم بتغييرها إلى 1:



# sudo vim /etc/sysctl.conf

net.ipv4.ip_forward=1

# sudo sysctl -p
# sudo ufw enable


بعد ذلك ، أطلقنا VPN الخاص بنا:



# sudo systemctl start openvpn@vpnsrv1


التحقق من الإطلاق:



# ip addr


يجب أن يكون هناك واجهة شبكة tun0 جديدة مع ip 10.8.0.1



# sudo systemctl status openvpn@vpnsrv1


إذا كنت بحاجة إلى أن تبدأ VPN من تلقاء نفسها بعد إعادة التشغيل ، فأضف الخدمة إلى التشغيل التلقائي:



# sudo systemctl enable openvpn@vpnsrv1


بعد ذلك ، نقوم بإنشاء تكوين العميل. في وقت سابق ، وضعنا جميع المفاتيح والشهادات في الدليل ~ / client-configs / keys /.



لنقم بإنشاء نص برمجي يجمع التكوين والمفاتيح والشهادات في ملف واحد user.ovpn:



# cd ~/client-configs/
# vim configs-maker.sh

#!/bin/bash
# First argument: Client identifier
KEY_DIR=/home/dumasti/client-configs/keys
OUTPUT_DIR=/home/dumasti/client-configs/files
BASE_CONFIG=/home/dumasti/client-configs/base.conf
cat ${BASE_CONFIG} \
	<(echo -e '<ca>') \
	${KEY_DIR}/ca.crt \
	<(echo -e '</ca>\n<cert>') \
	${KEY_DIR}/${1}.crt \
	<(echo -e '</cert>\n<key>') \
	${KEY_DIR}/${1}.key \
	<(echo -e '</key>\n<tls-auth>') \
	${KEY_DIR}/ta.key \
	<(echo -e '</tls-auth>') \
	> ${OUTPUT_DIR}/${1}.ovpn


سيأخذ هذا البرنامج النصي الملفات بالاسم الذي أعطيته له أثناء بدء التشغيل وسيقوم بتكوين ملف واحد في دليل الملفات.



لنجعل الملف قابلاً للتنفيذ:



# chmod +x configs-maker.sh


لنقم بتشغيله:



# sudo ./configs-maker.sh dumasti


نقوم الآن بنقل تكوين العميل إلى جهاز الكمبيوتر الخاص بك من الدليل / home / dumasti / client-configs / files /



. قم بتشغيل VPN.



لأسباب تتعلق بالأمان ، يجب إيقاف تشغيل الخوادم التي تستضيف المرجع المصدق وتشغيله فقط لتوقيع الشهادات.



لن نتجاهل إلغاء الشهادات. لإلغاء الشهادة ، نذهب إلى خادم CA الذي تم توقيع الشهادة عليه ونقوم بما يلي (على سبيل المثال ، سنقوم بإلغاء شهادة المستخدم (dumasti) التي وقعناها على خادم SubCA). نذهب إلى خادم SubCA:



# cd ~/easyrsa/
# ./easyrsa revoke dumasti


سيُطلب منك تأكيد الإلغاء ، أدخل "نعم"



# ./easyrsa gen-crl


تم إنشاء ملف crl.pem. نحتاج إلى وضعه على خادم OpenVPN وإضافة التوجيه والمسار إلى الملف في تهيئة الخادم:



# scp ~/easyrsa/pki/crl.pem user@ip_OpenVPN:/tmp


انتقل إلى خادم OpenVPN:



# sudo mv /tmp/crl.pem /etc/openvpn/vpnsrv1/
# sudo vim /etc/openvpn/vpnsrv1.conf


أضف السطر التالي حيث تمت كتابة المفاتيح والشهادات:



crl-verify vpnsrv1/crl.pem


أعد تشغيل openvpn:



# sudo systemctl restart openvpn@vpnsrv1


الآن لن يتمكن عميل dumasti من الاتصال بشبكة VPN.



شكرآ لك على أهتمامك!



All Articles