制定問題
文章介紹了開源產品上員工遠端存取的組織方式,既可以用來建立完全自治的系統,也可以在現有商業系統許可證不足或效能不足時進行擴展。
本文的目標是實現一個完整的系統,為組織提供遠端訪問,這只不過是「在 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 無需停用安全性原則即可運作。
Содержание
作業系統和應用軟體的安裝
我們使用 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