在 OpenVPN 上組織中小企業組織的遠距工作

制定問題

文章介紹了開源產品上員工遠端存取的組織方式,既可以用來建立完全自治的系統,也可以在現有商業系統許可證不足或效能不足時進行擴展。

本文的目標是實現一個完整的系統,為組織提供遠端訪問,這只不過是「在 10 分鐘內安裝 OpenVPN」。

因此,我們將獲得一個系統,其中將使用憑證和(可選)企業 Active Directory 對使用者進行身份驗證。 那。 我們將得到一個具有兩個驗證因素的系統 - 我所擁有的(證書)和我所知道的(密碼)。

使用者被允許連線的標誌是他們在 myVPNUsr 群組中的成員資格。 證書頒發機構將離線使用。

實施此解決方案的成本僅為少量的硬體資源和系統管理員1小時的工作。

我們將在 CetntOS 3 上使用具有 OpenVPN 和 Easy-RSA 版本 7 的虛擬機,為每 100 個連線分配 4 個 vCPU 和 4 GiB RAM。

在範例中,我們組織的網路為 172.16.0.0/16,其中位址為 172.16.19.123 的 VPN 伺服器位於網段 172.16.19.0/24,DNS 伺服器為 172.16.16.16 和 172.16.17.17. /172.16.20.0 分配給VPN 用戶端。

若要從外部連接,請使用透過連接埠 1194/udp 的連接,並且已在我們伺服器的 DNS 中建立了一條 A 記錄 gw.abc.ru。

嚴格不建議禁用 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

為虛擬機安裝訪客代理非常有用:

$ 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伺服器;
  • 最後兩行是在 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 - abc.ru/Users 容器中的 bindUsr);
  • 密碼b1ndP@SS-綁定的使用者密碼;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — 開始搜尋使用者的路徑;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – 允許群組的容器(容器 abc.rumyGrp 中的群組 myVPNUsr);
  • 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(Valid)-有效;
    • 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 規則,在 Firewalld 出現後被打包。

預設的目的介面為tun0,隧道的外部介面可能會有所不同,例如ens192,這取決於所使用的平台。

最後一行用於記錄丟棄的資料包。 為了讓日誌記錄正常運作,您需要變更firewalld配置中的偵錯等級:

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

應用程式設定是重新讀取設定的常用防火牆命令:

$ sudo firewall-cmd --reload

您可以像這樣查看丟棄的資料包:

grep forward_fw /var/log/messages

下一步是什麼

這樣就完成設定了!

剩下的就是在客戶端安裝客戶端軟體、匯入設定檔並連接。 對於 Windows 作業系統,分發工具包位於 開發者網站.

最後,我們將新伺服器連接到監控和歸檔系統,並且不要忘記定期安裝更新。

連接穩定!

來源: www.habr.com

添加評論