سازماندهی کار از راه دور یک سازمان SMB در OpenVPN

بیانیه مشکل

این مقاله سازماندهی دسترسی از راه دور را برای کارکنان در محصولات منبع باز توصیف می کند و می تواند هم برای ساخت یک سیستم کاملاً مستقل مورد استفاده قرار گیرد و هم برای توسعه زمانی که کمبود مجوز در سیستم تجاری موجود وجود دارد یا عملکرد آن کافی نیست مفید خواهد بود.

هدف این مقاله پیاده سازی یک سیستم کامل برای ارائه دسترسی از راه دور به یک سازمان است که کمی بیشتر از "نصب OpenVPN در 10 دقیقه" است.

در نتیجه، سیستمی دریافت خواهیم کرد که در آن از گواهینامه ها و (به صورت اختیاری) اکتیو دایرکتوری شرکتی برای احراز هویت کاربران استفاده می شود. که ما یک سیستم با دو فاکتور تأیید دریافت خواهیم کرد - آنچه من دارم (گواهینامه) و آنچه می دانم (رمز عبور).

نشانه ای که یک کاربر مجاز به اتصال است، عضویت او در گروه myVPNUsr است. مرجع گواهی آفلاین استفاده خواهد شد.

هزینه اجرای راه حل فقط منابع سخت افزاری کم و 1 ساعت کار مدیر سیستم است.

ما از یک ماشین مجازی با OpenVPN و Easy-RSA نسخه 3 در CetntOS 7 استفاده خواهیم کرد که به ازای هر 100 اتصال، 4 vCPU و 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/XNUMX برای مشتریان VPN اختصاص داده شده است.

برای اتصال از خارج، از اتصال از طریق پورت 1194/udp استفاده می شود و یک A-record gw.abc.ru در DNS برای سرور ما ایجاد شده است.

اکیداً توصیه نمی شود SELinux را غیرفعال کنید! OpenVPN بدون غیرفعال کردن سیاست های امنیتی کار می کند.

مقدار

  1. نصب سیستم عامل و نرم افزارهای کاربردی
  2. راه اندازی رمزنگاری
  3. راه اندازی OpenVPN
  4. احراز هویت AD
  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 وجود داشته باشد.
  • 2 خط آخر برای اجرای احراز هویت در AD** مورد نیاز است.

*محدوده آدرس های انتخاب شده در مثال به 127 کلاینت امکان اتصال همزمان را می دهد، زیرا شبکه 23/ انتخاب می شود و OpenVPN با استفاده از ماسک 30/ برای هر مشتری یک زیرشبکه ایجاد می کند.
در صورت لزوم، پورت و پروتکل را می توان تغییر داد، با این حال، باید در نظر داشت که تغییر شماره پورت مستلزم پیکربندی SELinux است و استفاده از پروتکل tcp باعث افزایش سربار می شود، زیرا کنترل تحویل بسته TCP در حال حاضر در سطح بسته های محصور شده در تونل انجام می شود.

**اگر احراز هویت در AD مورد نیاز نیست، آنها را نظر دهید، بخش بعدی و در قالب را نادیده بگیرید خط auth-user-pass را حذف کنید.

احراز هویت AD

برای حمایت از عامل دوم، از تأیید حساب در 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 ما پیکربندی شود. به نظر من، بیشترین انعطاف‌پذیری با راه‌اندازی زنجیره‌های 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

بعدی چیست؟

این راه اندازی را کامل می کند!

تنها چیزی که باقی می ماند این است که نرم افزار مشتری را در سمت مشتری نصب کنید، پروفایل را وارد کنید و متصل شوید. برای سیستم عامل های ویندوز، کیت توزیع بر روی آن قرار دارد سایت توسعه دهنده.

در نهایت، ما سرور جدید خود را به سیستم های نظارت و بایگانی متصل می کنیم و فراموش نمی کنیم که به طور منظم به روز رسانی ها را نصب کنیم.

اتصال پایدار!

منبع: www.habr.com

اضافه کردن نظر