องค์กรการทำงานระยะไกลขององค์กร SMB บน OpenVPN

คำแถลงปัญหา

บทความนี้อธิบายถึงองค์กรของการเข้าถึงระยะไกลสำหรับพนักงานในผลิตภัณฑ์โอเพ่นซอร์ส และสามารถใช้ทั้งเพื่อสร้างระบบอัตโนมัติโดยสมบูรณ์ และจะเป็นประโยชน์สำหรับการขยายเมื่อขาดใบอนุญาตในระบบเชิงพาณิชย์ที่มีอยู่หรือประสิทธิภาพไม่เพียงพอ

เป้าหมายของบทความนี้คือการใช้ระบบที่สมบูรณ์ในการให้การเข้าถึงระยะไกลแก่องค์กร ซึ่งน้อยกว่า “การติดตั้ง 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 ทำงานได้โดยไม่ต้องปิดการใช้งานนโยบายความปลอดภัย

Содержание

  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

การติดตั้ง 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

เพิ่มความคิดเห็น