Tổ chức làm việc từ xa của tổ chức SMB trên OpenVPN

Báo cáo sự cố

Bài viết mô tả việc tổ chức truy cập từ xa cho nhân viên trên các sản phẩm nguồn mở và có thể được sử dụng vừa để xây dựng một hệ thống hoàn toàn tự chủ, vừa sẽ hữu ích cho việc mở rộng khi hệ thống thương mại hiện tại thiếu giấy phép hoặc hiệu suất của nó không đủ.

Mục tiêu của bài viết là triển khai một hệ thống hoàn chỉnh để cung cấp quyền truy cập từ xa cho một tổ chức, không khác gì “cài đặt OpenVPN trong 10 phút”.

Kết quả là, chúng ta sẽ có một hệ thống trong đó các chứng chỉ và (tùy chọn) Active Directory của công ty sẽ được sử dụng để xác thực người dùng. Cái đó. chúng tôi sẽ nhận được một hệ thống có hai yếu tố xác minh - những gì tôi có (chứng chỉ) và những gì tôi biết (mật khẩu).

Dấu hiệu cho thấy người dùng được phép kết nối là tư cách thành viên của họ trong nhóm myVPNUsr. Cơ quan cấp chứng chỉ sẽ được sử dụng ngoại tuyến.

Chi phí thực hiện giải pháp chỉ là tài nguyên phần cứng nhỏ và 1 giờ làm việc của người quản trị hệ thống.

Chúng tôi sẽ sử dụng máy ảo có OpenVPN và Easy-RSA phiên bản 3 trên CetntOS 7, được phân bổ 100 vCPU và 4 GiB RAM trên 4 kết nối.

Trong ví dụ, mạng của tổ chức chúng tôi là 172.16.0.0/16, trong đó máy chủ VPN có địa chỉ 172.16.19.123 nằm trong phân đoạn 172.16.19.0/24, máy chủ DNS 172.16.16.16 và 172.16.17.17 và mạng con 172.16.20.0 .23/XNUMX được phân bổ cho các máy khách VPN .

Để kết nối từ bên ngoài, kết nối qua cổng 1194/udp sẽ được sử dụng và bản ghi A gw.abc.ru đã được tạo trong DNS cho máy chủ của chúng tôi.

Tuyệt đối không nên tắt SELinux! OpenVPN hoạt động mà không vô hiệu hóa các chính sách bảo mật.

nội dung

  1. Cài đặt hệ điều hành và phần mềm ứng dụng
  2. Thiết lập mật mã
  3. Thiết lập OpenVPN
  4. Xác thực QUẢNG CÁO
  5. Khởi động và chẩn đoán
  6. Cấp và thu hồi chứng chỉ
  7. Cấu hình mạng
  8. những gì tiếp theo

Cài đặt hệ điều hành và phần mềm ứng dụng

Chúng tôi sử dụng bản phân phối CentOS 7.8.2003. Chúng ta cần cài đặt hệ điều hành ở cấu hình tối thiểu. Thật thuận tiện để làm điều này bằng cách sử dụng khởi động, sao chép hình ảnh hệ điều hành đã cài đặt trước đó và các phương tiện khác.

Sau khi cài đặt, gán địa chỉ cho giao diện mạng (theo điều khoản của nhiệm vụ 172.16.19.123), chúng ta cập nhật HĐH:

$ sudo yum update -y && reboot

Chúng tôi cũng cần đảm bảo rằng việc đồng bộ hóa thời gian được thực hiện trên máy của chúng tôi.
Để cài đặt phần mềm ứng dụng, bạn cần có các gói openvpn, openvpn-auth-ldap, easy-rsa và vim làm trình chỉnh sửa chính (bạn sẽ cần kho lưu trữ EPEL).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Việc cài đặt một tác nhân khách cho máy ảo rất hữu ích:

$ sudo yum install open-vm-tools

cho máy chủ VMware ESXi hoặc cho oVirt

$ sudo yum install ovirt-guest-agent

Thiết lập mật mã

Chuyển đến thư mục easy-rsa:

$ cd /usr/share/easy-rsa/3/

Tạo một tập tin biến:

$ sudo vim vars

nội dung sau:

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

Các tham số cho tổ chức có điều kiện ABC LLC được mô tả ở đây; bạn có thể sửa chúng thành tham số thực hoặc bỏ chúng khỏi ví dụ. Điều quan trọng nhất trong các tham số là dòng cuối cùng, xác định thời hạn hiệu lực của chứng chỉ tính bằng ngày. Ví dụ sử dụng giá trị 10 năm (365*10+2 năm nhuận). Giá trị này sẽ cần được điều chỉnh trước khi cấp chứng chỉ người dùng.

Tiếp theo, chúng tôi định cấu hình cơ quan chứng nhận tự trị.

Thiết lập bao gồm xuất các biến, khởi tạo CA, cấp khóa và chứng chỉ gốc CA, khóa Diffie-Hellman, khóa TLS cũng như khóa và chứng chỉ máy chủ. Khóa CA phải được bảo vệ cẩn thận và giữ bí mật! Tất cả các tham số truy vấn có thể được để mặc định.

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

Điều này hoàn thành phần chính của việc thiết lập cơ chế mật mã.

Thiết lập OpenVPN

Đi tới thư mục OpenVPN, tạo thư mục dịch vụ và thêm liên kết đến 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/

Tạo tệp cấu hình OpenVPN chính:

$ sudo vim server.conf

nội dung sau

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

Một số lưu ý về thông số:

  • nếu một tên khác được chỉ định khi cấp chứng chỉ, hãy cho biết tên đó;
  • chỉ định nhóm địa chỉ phù hợp với nhiệm vụ của bạn*;
  • có thể có một hoặc nhiều tuyến và máy chủ DNS;
  • Cần có 2 dòng cuối cùng để triển khai xác thực trong AD**.

*Phạm vi địa chỉ được chọn trong ví dụ sẽ cho phép tối đa 127 máy khách kết nối đồng thời, bởi vì mạng /23 được chọn và OpenVPN tạo mạng con cho mỗi máy khách bằng mặt nạ /30.
Nếu đặc biệt cần thiết, cổng và giao thức có thể được thay đổi, tuy nhiên, cần lưu ý rằng việc thay đổi số cổng sẽ đòi hỏi phải định cấu hình SELinux và việc sử dụng giao thức tcp sẽ tăng chi phí, bởi vì Kiểm soát phân phối gói TCP đã được thực hiện ở cấp độ gói được đóng gói trong đường hầm.

**Nếu không cần xác thực trong AD, hãy nhận xét chúng, bỏ qua phần tiếp theo và trong mẫu xóa dòng auth-user-pass.

Xác thực QUẢNG CÁO

Để hỗ trợ yếu tố thứ hai, chúng tôi sẽ sử dụng xác minh tài khoản trong AD.

Chúng tôi cần một tài khoản trong miền với các quyền của người dùng thông thường và một nhóm, tư cách thành viên trong đó sẽ quyết định khả năng kết nối.

Tạo một tập tin cấu hình:

/etc/openvpn/ldap.conf

nội dung sau

<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” - địa chỉ bộ điều khiển miền;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - tên chuẩn để liên kết với LDAP (UZ - bindUsr trong vùng chứa abc.ru/Users);
  • Mật khẩu b1ndP@SS — mật khẩu người dùng để ràng buộc;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — đường dẫn từ đó bắt đầu tìm kiếm người dùng;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – vùng chứa của nhóm cho phép (nhóm myVPNUsr trong vùng chứa abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" là tên của nhóm cho phép.

Khởi động và chẩn đoán

Bây giờ chúng ta có thể thử kích hoạt và khởi động máy chủ của mình:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Kiểm tra khởi động:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Cấp và thu hồi chứng chỉ

Bởi vì Ngoài bản thân các chứng chỉ, bạn cần có khóa và các cài đặt khác, rất thuận tiện khi gói tất cả những thứ này vào một tệp hồ sơ. Sau đó, tệp này được chuyển đến người dùng và hồ sơ được nhập trên máy khách OpenVPN. Để thực hiện việc này, chúng tôi sẽ tạo mẫu cài đặt và tập lệnh tạo hồ sơ.

Bạn cần thêm nội dung của tệp chứng chỉ gốc (ca.crt) và khóa TLS (ta.key) vào hồ sơ.

Trước khi cấp chứng chỉ người dùng đừng quên đặt thời hạn hiệu lực cần thiết cho chứng chỉ trong tập tin tham số. Bạn không nên kéo dài quá lâu; tôi khuyên bạn nên giới hạn thời gian tối đa là 180 ngày.

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>

Ghi chú:

  • dòng ĐẶT CỦA BẠN... thay đổi nội dung của họ giấy chứng nhận;
  • trong lệnh từ xa, chỉ định tên/địa chỉ cổng của bạn;
  • chỉ thị auth-user-pass được sử dụng để xác thực bổ sung bên ngoài.

Trong thư mục chính (hoặc nơi thuận tiện khác), chúng tôi tạo một tập lệnh để yêu cầu chứng chỉ và tạo hồ sơ:

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 ~

Làm cho tệp có thể thực thi được:

chmod a+x ~/make.profile.sh

Và chúng tôi có thể cấp chứng chỉ đầu tiên của mình.

~/make.profile.sh my-first-user

hồi tưởng

Trường hợp chứng chỉ bị xâm phạm (mất, trộm cắp) cần thu hồi chứng chỉ này:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Xem các chứng chỉ đã cấp và bị thu hồi

Để xem các chứng chỉ đã cấp và bị thu hồi, chỉ cần xem tệp chỉ mục:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Giải thích:

  • dòng đầu tiên là chứng chỉ máy chủ;
  • ký tự đầu tiên
    • V (Hợp lệ) - hợp lệ;
    • R (Thu hồi) - thu hồi.

Cấu hình mạng

Các bước cuối cùng là cấu hình mạng truyền dẫn - định tuyến và tường lửa.

Cho phép kết nối trong tường lửa cục bộ:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Tiếp theo, kích hoạt định tuyến lưu lượng IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

Trong môi trường công ty, có thể sẽ có mạng con và chúng tôi cần thông báo cho (các) bộ định tuyến cách gửi các gói dành cho máy khách VPN của chúng tôi. Trên dòng lệnh, chúng ta thực thi lệnh theo cách thức (tùy thuộc vào thiết bị được sử dụng):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

và lưu cấu hình.

Ngoài ra, trên giao diện bộ định tuyến biên nơi cung cấp địa chỉ bên ngoài gw.abc.ru, cần cho phép các gói udp/1194 đi qua.

Trong trường hợp tổ chức có các quy tắc bảo mật nghiêm ngặt, tường lửa cũng phải được cấu hình trên máy chủ VPN của chúng tôi. Theo tôi, tính linh hoạt lớn nhất được cung cấp bằng cách thiết lập chuỗi iptables FORWARD, mặc dù việc thiết lập chúng ít thuận tiện hơn. Thêm một chút về việc thiết lập chúng. Để làm điều này, cách thuận tiện nhất là sử dụng “quy tắc trực tiếp” - quy tắc trực tiếp, được lưu trữ trong một tệp /etc/firewalld/direct.xml. Cấu hình hiện tại của các quy tắc có thể được tìm thấy như sau:

$ sudo firewall-cmd --direct --get-all-rule

Trước khi thay đổi một tập tin, hãy tạo một bản sao lưu của nó:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Nội dung gần đúng của tập tin là:

<?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>

Giải thích

Về cơ bản, đây là các quy tắc iptables thông thường, nếu không thì được đóng gói sau khi tường lửa ra đời.

Giao diện đích có cài đặt mặc định là tun0 và giao diện bên ngoài cho đường hầm có thể khác, ví dụ: ens192, tùy thuộc vào nền tảng được sử dụng.

Dòng cuối cùng dùng để ghi lại các gói tin bị rơi. Để đăng nhập hoạt động, bạn cần thay đổi mức độ gỡ lỗi trong cấu hình tường lửa:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Áp dụng cài đặt là lệnh tường lửa thông thường để đọc lại cài đặt:

$ sudo firewall-cmd --reload

Bạn có thể xem các gói bị rơi như thế này:

grep forward_fw /var/log/messages

những gì tiếp theo

Điều này hoàn tất việc thiết lập!

Tất cả những gì còn lại là cài đặt phần mềm máy khách ở phía máy khách, nhập hồ sơ và kết nối. Đối với hệ điều hành Windows, bộ phân phối nằm trên trang web dành cho nhà phát triển.

Cuối cùng, chúng tôi kết nối máy chủ mới của mình với hệ thống giám sát và lưu trữ, đồng thời đừng quên thường xuyên cài đặt các bản cập nhật.

Kết nối ổn định!

Nguồn: www.habr.com

Thêm một lời nhận xét