Centos

CentOS 7 和 firewalld 上 OpenVPN 的多個使用者類型/訪問規則

  • February 21, 2015

如何在 CentOS 7 伺服器上執行的 OpenVPN 中為使用者和管理員定義單獨的角色? 具體來說,必須只允許使用者使用https,而必須允許管理員同時使用httpsssh

迄今為止的進展:

在翻譯@garethTheRed 建議的連結中的說明時,我定義了以下步驟。我還完成了步驟一、二、三。但我不知道如何完成第四步。 有人可以展示如何將步驟四從 iptables 翻譯成防火牆,並確認其他步驟嗎?

第一步**(完成)**:根據使用者類創建一個虛擬IP地址映射:

   Class            Virtual IP range       Allowed Services  
   employees        10.8.0.0/24            https
   administrator    10.8.1.0/24            ssh, https  

第二步**(完成)**:在 /etc/openvpn/server.conf 中,

   define the Employee IP address pool:
   server 10.8.0.0 255.255.255.0

   Add a route for the System Administrator IP range:
   route 10.8.1.0 255.255.255.0

   Specify client configuration directory to assign a fixed IP forAdministrator:
   client-config-dir ccd

第三步**(完成)**:在新目錄/etc/openvpn/ccd和新配置文件中/etc/openvpn/ccd/sysadmin

   Define the fixed IP address for the Administrator VPN client:

       mkdir ccd
       cd ccd
       nano sysadmin1
       type the following into /etc/openvpn/ccd/sysadmin1:
       ifconfig-push 10.8.1.1 10.8.1.2

第四步**(我如何在防火牆中做到這一點,以便使用者只能https和管理員可以sshhttps?)**:

   First, define a static unit number for our tun interface:

       dev tun0  //where does this go?

   Establish firewall rules for the employees and administrator (convert these to firewalld):
       # Employee rule // MUST ONLY BE ALLOWED TO https
       iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.66.4.4 -j ACCEPT

       # Sysadmin rule //MUST BE ALLOWED TO ssh AND https
       iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 10.66.4.0/24 -j ACCEPT

注意:當我鍵入firewall-cmd --list-all時,到目前為止整個firewalld配置的總和定義如下:

public (default, active)
 interfaces: enp3s0
 sources: 
 services: dhcpv6-client openvpn smtp
 ports: 
 masquerade: yes
 forward-ports: 
 icmp-blocks: 
 rich rules: 

我想以任何所需的方式更改防火牆配置,以便為此案例提供最佳安全性。

如何修改上述內容以使其正常工作?

編輯:

閱讀@garethTheRed 的有用答案後,我有三個問題/意見:

1.) There is no `tun` device on the firewall, but yet I am able  
   to connect to the VPN from the client with  
   `openvpn --config /path/to/client.ovpn` with the firewall  
   configured only as shown by the results of `firewall-cmd --list-all`.
   So why is it necessary to define a `tun` device in the firewall?  

2.) `ip addr` shows that I was logged in as 10.8.0.6.  How can I 
   force being logged in as a fixed address, such as 10.8.1.1 defined  
   in Step Three above?  

3.) What privileges/access does a user really have when they log in to the  
   server via OpenVPN when the firewall is configured as shown in the  
   results of `firewall-cmd --list-all` above?  Are they be able to do  
   anything other than https without a password anyway?  ssh would  
   require knowledge of both a password and a username.  

編輯#2

在@garethTheRed 的非常有用的答案中定義的內部區域中,內部區域的使用者似乎可以訪問以下服務dhcpv6-client、、、、ipp-client和。這篇文章中的案例還包括.mdns``samba-client``ssh``https

因此,該文章的解決方案似乎涉及:

1.) setting up rules blocking the `10.8.0.0/24` ip range from  
   `dhcpv6-client`, `ipp-client`, `mdns`, `samba-client`, and `ssh`,  
   while allowing access to `https`.  

2.) retaining access by the `10.8.1.0/24` ip range to all services  
   defined in the internal zone.  

3.) creating and installing separate client certificates for the  
   two classes of users (administrator and user)? Each class,  
   and therefore each certificate, must have a Canonical Name (CN)  
   that matches the names of config files added to `/etc/openvpn/ccd`.  
   Openvpn should then use the config file whose name matches the CN.  
   This config file should be set to configure the network address  
   that will be allocated to the clients in that class
   @garethTheRed's words are used here in #3.  

但是,完成這個要求還需要這三件事嗎?我如何完成這三件事?

您可以修改該區域並添加一個豐富的規則,該規則阻止ssh除特定範圍之外的所有流量 -員工子網。

tun通過列出所有區域來查找您的界面所在的區域:

firewall-cmd --list-all-zones | less

在輸出中,您應該會看到類似於以下內容的內容:

internal (active)
 interfaces: tun0
 sources: 
 services: dhcpv6-client ipp-client mdns samba-client ssh
 ports: 
 masquerade: no
 forward-ports: 
 icmp-blocks: 
 rich rules:

您可能會發現該tun設備(tun0在上面的範例中)與您的乙太網適配器位於同一區域。雖然這會起作用,但如果將它們分開,管理起來會更容易。

明智的做法是從區域中刪除您不需要的服務internal- 在您的情況下,刪除所有但ssh還添加http

firewall-cmd --zone=internal --permanent --add-service=http
firewall-cmd --zone=internal --permanent --remove-service=dhcpv6-client

對要刪除的其他服務重複上一個命令。確保不要刪除ssh!當您使用它時,external也請從您的區域中刪除冗餘服務。

tun將介面所在區域的區域定義文件複製到/etc/firewalld/zones. 例如,如果tun設備在Internal區域中:

sudo cp /usr/lib/firewalld/zones/internal.xml /etc/firewalld/zones

編輯複製的文件並在關閉之前添加以下內容</zone>

<rule family="ipv4">
   <source invert="True" address="10.8.0.0"/>
   <service name="ssh"/>
   <reject/>
</rule>

最後,執行firewall-cmd --reload以應用規則。

警告:如果這不起作用,您可能會將自己鎖定:-o

替代選項:

另一個更簡單的選擇是配置sshd為僅接受來自給定網路地址的連接 - 10.8.0.0.

一個更簡單的選擇是完全放棄 VPN,只使用防火牆。如果(且僅當)您的員工(或您的外部路由器)擁有靜態 IP 地址,則只需配置豐富規則以僅允許其 IP 地址或網路地址訪問ssh服務,同時拒絕所有其他 IP 地址。

引用自:https://unix.stackexchange.com/questions/185599