Aktionen

SSH-VPN

Aus freie Dokumentation

Warum ein SSH-VPN

Zabbix bietet keine Möglichkeiten, den Datenaustausch zwischen Zabbix-Server und den Zabbix-Proxys zu verschlüsseln. Wenn die Daten außerhalb eines privaten und geschützten Netzes transportiert werden, ist eine Verschlüsselung aber dringend angeraten. Je nachdem, was ein Zabbix-Proxy überwacht, können sehr sensible und teilweise personenbezogene Daten vom Proxy zum Server geschickt werden. Denken Sie beispielsweise an eine Logfile-Überwachung von Diensten wie Web- oder IMAP-Servern. Je nach Konfiguration können die Logfiles die Benutzernamen und Kennwörter im Klartext enthalten. Und wenn Sie solche Logfiles mit Zabbix überwachen, werden diese hoch sensiblen Daten unverschlüsselt an den Zabbix-Server gesendet.

Der Aufbau eines VPNs, egal mit welcher Software, bietet neben der Verschlüsselung aber noch einen entscheidenden Vorteil. Server und Proxy können in einem privaten Netz mit festen IP-Adressen kommunizieren, auch wenn der Proxy über keine feste öffentliche IP-Adresse verfügt.

Da der Fokus dieses Wikis auf der Installation und Konfiguration von Zabbix liegt, kann das Thema VPN nur schlaglichtartig beleuchtet werden. Im Internet oder im Buchhandel gibt es zahlreiche Anleitungen, wie man VPNs aufbaut. Wenn Sie mehr als fünf Proxys betreiben möchten, ist es ratsam, sich mit dem Thema VPN ausführlicher zu beschäftigen.

Wenn Sie nur wenige Proxys einsetzen, hilft Ihnen vielleicht die nachfolgende Kurzanleitung zum Aufbau eines simplen aber sehr sicheren VPNs mit SSH. Ein SSH-VPN hat den Vorteil, dass die Software auf den Systemen schon installiert ist, und die Authentifizierung wie gewohnt über den Austausch von öffentlichen Schlüsseln erfolgt.
Die Nachteile von SSH als VPN-Lösung liegt in den sehr bescheidenen Funktionen des SSH-Klienten. Dieser kann abgebrochene Verbindungen nicht wieder aufbauen. Dieses Manko können Upstart und AutoSSH aber ausgleichen. Der SSH-Server verfügt anders als der Open-VPN-Server über keinen DHCP-Server, so dass die IP-Adressen der Tunnel-Verbindungen manuell gepflegt werden müssen.

Open-SSH kann den kompletten Datenverkehr zwischen zwei Hosts verschlüsseln. Dazu wird auf beiden Seiten eine Pseudo-Netzwerkkarte erzeugt, das sogenannte Tunnel-Device. Wenn Sie beispielsweise auf dem Zabbix-Proxy mit dem Kommando ssh -w0:0 root@zabbix-server.example.com eine SSH-Verbindung zum Server aufbauen, erhalten beide Seiten nach erfolgreicher Authentifizierung das neue Gerät tun0. Dieses hat noch keine IP-Adresse, aber ein VPN-Tunnel „steht“ schon einmal.

Der Trick mit dem Tunnel.

Installation

Auf fast allen Distributionen ist die VPN-Funktion von Open-SSH per Standard deaktiviert. SSH-Klienten müssen nicht angepasst werden. Lediglich auf dem Server müssen Sie die VPN-Option in der Datei /etc/ssh/sshd_config aktivieren, indem Sie die nachfolgende Zeile hinzufügen, und anschließend den SSH-Serverdienst neu starten:

PermitTunnel point-to-point

Erzeugen Sie anschließend auf dem Klienten für den Benutzer root eine SSH-Schlüsselpaar, welches nicht mit einem Passwort geschützt ist und kopieren Sie anschließend den öffentlichen Schlüssel auf den Server:

ssh-keygen -t rsa
ssh-copy-id root@zabbix-server.example.com

Testen Sie das VPN das erste mal. Bauen Sie vom Klienten, sprich vom Zabbix-Proxy eine SSH-Verbindung zum Zabbix-Server auf und prüfen Sie, ob beide Seiten über das neue Tunnel-Device tun0 verfügen:

root@zabbix-proxy:~# ssh -w0:0 root@zabbix-server.example.com
root@zabbix-proxy:~# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00

root@zabbix-server:~# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00

IP-Adressen für den Tunnel festlegen

Vergeben Sie auf dem Zabbix-Server und dem Zabbix-Proxy für die Tunnel-Geräte feste IP-Adressen. Der Klient verwendet in diesem Beispiel immer tun0.
Unter Debian und Ubuntu tragen Sie folgenden Block in die Datei /etc/network/interfaces ein:

auto tun0
iface tun0 inet static
	address 172.16.1.2
	netmask 255.255.255.0

Unter Ubuntu und CentOS in legen Sie eine neue Datei /etc/sysconfig/network-scripts/ifcfg-tun0 mit folgendem Inhalt an:

DEVICE='tun0'
TYPE=Ethernet
BOOTPROTO=none
ONBOOT='yes'
IPADDR=172.16.1.2
NETMASK=255.255.255.0
NM_CONTROLLED='no'
LINKDELAY=3

Auf dem Zabbix-Server müssen Sie für jeden Klienten, der einen Tunnel aufbauen darf, ein gesondertes Tunnel-Device konfigurieren. Der erste Klient verwendet tun0 der Zweite tun1 usw..
Für vier Klienten könnte das Netzwerksetup wie folgt aussehen:

Klient Server
Tunnel-Device IP-Adresse Tunnel-Device IP-Adresse
tun0 172.16.1.1 tun0 172.16.1.2
tun0 172.16.1.5 tun1 172.16.1.6
tun0 172.16.1.9 tun2 172.16.1.10
tun0 172.16.1.13 tun3 172.16.1.14

Die Netzmaske für diese sogenannten Point-To-Point-Verbindungen ist immer 255.255.255.252.

Wenn Sie auf Klient und Server die statische IP-Adresse-Konfiguration angelegt haben, sollten Sie das Setup testen. Bauen Sie wie zuvor beschrieben die SSH-Verbindung auf und „starten“ Sie anschließend die Tunnel-Geräte.

root@zbx-proxy:~# ssh -w0:0 root@zabbix-proxy.example.com
root@zbx-proxy:~# ifup tun0
root@zbx-proxy:~# ping 172.16.1.2

root@zbx-server:~# ifup tun0
root@zbx-server:~# ping 172.16.1.1

Automatischer Tunnelaufbau

Das Hilfsprogramm AutoSSH und Upstart sorgen dafür, dass der Tunnel beim Systemstart aufgebaut und in Betrieb gehalten wird. Benutzer von CentOS finden Autossh im sogenannten RPMforge-Repository.
Unter Ubuntu und CentOS 6 auf dem Client die Datei /etc/init/vpn-zabbix-master.conf wie folgt anlegen:

description "SSH VPN to Zabbix-Server"

start on runlevel [2345]
stop on runlevel  [2345]

respawn
respawn limit 99 20

env REMOTE_TUN=2             # tun on server, place only the number
env LOCAL_TUN=0              # tun on client, place only the number
env REMOTE_SERVER=zbx-master # Server you want to connect to
env REMOTE_USER=root         # User for ssh connection

pre-start exec logger -t upstart \
               "$0 Starting SSH VPN to $REMOTE_SERVER with tun$LOCAL_TUN:tun$REMOTE_TUN"

exec autossh -M "2000"$[REMOTE_TUN*2] -nT -w$LOCAL_TUN:$REMOTE_TUN \
     -o "LocalCommand /sbin/ifdown tun$LOCAL_TUN;/sbin/ifup tun$LOCAL_TUN" \
     -o "PermitLocalCommand yes" \
     $REMOTE_SERVER -l $REMOTE_USER \
     "ifdown tun$REMOTE_TUN&&ifup tun$REMOTE_TUN"
pre-stop exec ifdown $LOCAL_TUN
post-stop exec sleep 15

Nun kann der Tunnel mit initctl stop vpn-zabbix-master vom Klienten aus gestartet werden. Auf dem Server müssen keine Einstellungen vorgenommen werden.

CentOS bzw. Red Hat 7 verwenden kein Upstart mehr. Mit Systemd legen Sie eine Datei /etc/systemd/system/ssh-vpn.service an mit folgendem Inhalt:

[Unit]
Description=SSH VPN to Zabbix-Server

[Service]
ExecStart=autossh -nNT -o ServerAliveInterval=15 -w0:0 zabbix-server.example.com
Restart=always

[Install]
WantedBy=multi-user.target

Den VPN-Tunnel überwachen

Richten Sie ein Item von Typ „Zabbix Agent“ ein, welches überwacht, ob auf Client- und Serverseite die Tunnel-Geräte „gestartet“ sind. Dazu prüfen Sie mit dem Key vfs.file.exists[/proc/sys/net/ipv4/conf/tun0/medium_id], ob das Tunnel-Device vorhanden ist.

Auf dem Klienten sollten Sie mit dem Item-Key proc.num[autossh] überwachen, ob der Auto-SSH-Prozess läuft.

Zabbix-Proxy anpassen

Wenn der Zabbix-Proxy über eine SSH-VPN-Verbindung mit dem Zabbix-Server kommuniziert, ist ein von Zabbix geöffneter TCP-Port auf der öffentlichen Netzwerkschnittstelle ein unnötiges Sicherheitsrisiko. Eliminieren Sie dieses Risiko und „binden“ Sie Zabbix nur an die geschützten privaten Schnittstellen. Öffnen Sie die Datei /etc/zabbix/zabbix-proxy.conf und nehmen Sie beispielsweise die nachfolgende Änderung vor, damit der Zabbix-Trapper nur im internen Netz und per VPN-Tunnel erreichbar ist. Starten Sie nach den Änderungen den Zabbix-Proxy-Dienst neu:

### Option: ListenIP
#       List of comma delimited IP addresses that the trapper should listen on.
#       Trapper will listen on all network interfaces if this parameter is missing.
#
# Mandatory: no
# Default: 0.0.0.0
ListenIP=172.16.1.10,192.168.17.6
Der Zabbix-Proxy lauscht nur noch in privaten Netzen.