คำแถลงปัญหา
บทความนี้อธิบายถึงองค์กรของการเข้าถึงระยะไกลสำหรับพนักงานในผลิตภัณฑ์โอเพ่นซอร์ส และสามารถใช้ทั้งเพื่อสร้างระบบอัตโนมัติโดยสมบูรณ์ และจะเป็นประโยชน์สำหรับการขยายเมื่อขาดใบอนุญาตในระบบเชิงพาณิชย์ที่มีอยู่หรือประสิทธิภาพไม่เพียงพอ
เป้าหมายของบทความนี้คือการใช้ระบบที่สมบูรณ์ในการให้การเข้าถึงระยะไกลแก่องค์กร ซึ่งน้อยกว่า “การติดตั้ง OpenVPN ใน 10 นาที” เพียงเล็กน้อย
เป็นผลให้เราจะได้รับระบบที่จะใช้ใบรับรองและ (เป็นทางเลือก) Active Directory ขององค์กรเพื่อตรวจสอบสิทธิ์ผู้ใช้ ที่. เราจะได้ระบบที่มีปัจจัยการตรวจสอบสองประการ - สิ่งที่ฉันมี (ใบรับรอง) และสิ่งที่ฉันรู้ (รหัสผ่าน)
สัญญาณที่ผู้ใช้ได้รับอนุญาตให้เชื่อมต่อคือการเป็นสมาชิกในกลุ่ม myVPNUsr ผู้ออกใบรับรองจะใช้แบบออฟไลน์
ค่าใช้จ่ายในการปรับใช้โซลูชันเป็นเพียงทรัพยากรฮาร์ดแวร์เพียงเล็กน้อยและผู้ดูแลระบบใช้เวลาทำงาน 1 ชั่วโมง
เราจะใช้เครื่องเสมือนกับ OpenVPN และ Easy-RSA เวอร์ชัน 3 บน CetntOS 7 ซึ่งจัดสรร 100 vCPU และ 4 GiB RAM ต่อการเชื่อมต่อ 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-record gw.abc.ru ใน DNS สำหรับเซิร์ฟเวอร์ของเรา
ไม่แนะนำให้ปิดการใช้งาน SELinux โดยเด็ดขาด! OpenVPN ทำงานได้โดยไม่ต้องปิดการใช้งานนโยบายความปลอดภัย
Содержание
การติดตั้งระบบปฏิบัติการและซอฟต์แวร์แอพพลิเคชั่น การตั้งค่าการเข้ารหัส การกำหนดค่า OpenVPN การรับรองความถูกต้องโฆษณา การเริ่มต้นและการวินิจฉัย การออกใบรับรองและการเพิกถอน การกำหนดค่าเครือข่าย มีอะไรต่อไป
การติดตั้งระบบปฏิบัติการและซอฟต์แวร์แอพพลิเคชั่น
เราใช้การกระจาย 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
การติดตั้ง Guest Agent สำหรับเครื่องเสมือนมีประโยชน์:
$ 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
- จำเป็นต้องใช้ 2 บรรทัดสุดท้ายเพื่อใช้การตรวจสอบสิทธิ์ใน 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.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
คำอธิบาย:
- บรรทัดแรกคือใบรับรองเซิร์ฟเวอร์
- ตัวอักษรตัวแรก
- 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 ของเราด้วย ในความคิดของฉัน การตั้งค่าเครือข่าย FORWARD ของ iptables มีความยืดหยุ่นสูงสุด แม้ว่าการตั้งค่าจะสะดวกน้อยกว่าก็ตาม เพิ่มเติมเล็กน้อยเกี่ยวกับการตั้งค่า ในการทำเช่นนี้จะสะดวกที่สุดในการใช้ "กฎโดยตรง" - กฎโดยตรงที่จัดเก็บไว้ในไฟล์ /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 ชุดการแจกจ่ายจะอยู่ที่
สุดท้ายนี้ เราเชื่อมต่อเซิร์ฟเวอร์ใหม่ของเราเข้ากับระบบการตรวจสอบและจัดเก็บข้อมูล และอย่าลืมติดตั้งการอัปเดตเป็นประจำ
การเชื่อมต่อที่มั่นคง!
ที่มา: will.com