SAProuter als systemd Service einrichten

Veröffentlicht am

Der SAProuter ist ein kleines Stück Software, welches von SAP zur Verfügung gestellt wird, um eine Remote-Verbindung zwischen dem Netzwerk eines Kunden und SAP herzustellen.

Mit SAProuter kann man:

  • die Netzwerksicherheit verbessern, indem z. B. ein Passwort verwendet wird oder nur verschlüsselte Verbindungen von bekannten Quellen zugelassen werden
  • Verbindungen zu SAP-Systemen steuern und protokollieren
  • Leistung und Stabilität erhöhen, indem die SAP-Systemauslastung innerhalb eines lokalen Netzwerks (LAN) bei der Kommunikation mit einem Wide Area Networks (WAN) reduziert wird

SAProuter kann sowohl mit klassischen SAP-Produkten als auch mit Analytics-Lösungen verwendet werden. Eine Liste der SAP Business Analytics-Produkte, die von SAProuter-Verbindungen profitieren, werden im SAP-Hinweis 1478974 aufgeführt.

SAProuter steuert den Zugriff auf Ihr Netzwerk auf Anwendungsebene und ist eine sinnvolle Ergänzung zu einem bestehenden Firewall-System (Portfilter).

Der SAProuter ist in jedem Kernel und damit in jedem SAP-System enthalten. Den SAProuter aber mit einem vorhandenen System zu betreiben, ist nicht sinnvoll und sicherheitstechnisch nicht zu empfehlen. Im Folgenden zeige ich, wie man den SAProuter als Service auf einem Linux System einrichten kann.

Benötigte Software

Für die Installation wird vom SAP Software Download Center folgende Software benötigt:

  • SAPCAR
  • SAPROUTER
  • COMMONCRYPTOLIB
  • Optional: SAP HostAgent

Installation

Die Installation bezieht sich im Grunde auf das Entpacken der Dateien. Und im Nachgang der Erstellung eines Services, damit der SAProuter automatisch gestartet wird.

Die Software herunterladen und z. B. mit WinSCP auf den Linux-Server hochladen.

Die Ordnerstruktur erstellen und die Dateien der saprouter*sar und SAPCRYPTOLIB*SAR in das Verzeichnis /usr/sap/saprouter/bin entpacken.

In der saprouttab stehen später die Regeln drin, die den Zugriff auf SAP-Systeme erlauben oder verbieten.

sudo mkdir -p /usr/sap/saprouter/{logs,bin,etc,sec}
sudo ./SAPCAR -xf “saprouter_*.sar” -R /usr/sap/saprouter/bin
sudo ./SAPCAR -xf “SAPCRYPTOLIBP_*.SAR” -R /usr/sap/saprouter/bin
sudo touch /usr/sap/saprouter/etc/saprouttab

Der Service soll später unter einem dedizierten Benutzer laufen. Diesen Benutzer anlegen und anschließend die Berechtigungen auf das zuvor erstellte Verzeichnis anpassen.

sudo useradd  -m -u 3299  -s /bin/bash  saprouter
sudo chown -R saprouter:saprouter /usr/sap/saprouter

Beim Benutzer saprouter werden in der ~/.bashrc noch Variablen hinterlegt, damit die Umgebung passt.

export SECUDIR=/usr/sap/saprouter/sec
export SNC_LIB=/usr/sap/saprouter/bin/libsapcrypto.so
PATH=$PATH:/usr/sap/saprouter/bin

Jetzt ist man fast schon fertig. Es fehlt nur noch der Service Eintrag.

Erstellung des systemd Service Eintrags für den SAProuter

sudo vim /etc/systemd/system/saprouter.service
[Unit]
Description=SAProuter Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/usr/sap/saprouter
User=saprouter

Environment="SECUDIR=/usr/sap/saprouter/sec" 
Environment="SNC_LIB=/usr/sap/saprouter/bin/libsapcrypto.so"

ExecStart=/usr/sap/saprouter/bin/saprouter -r -S 3299 -R /usr/sap/saprouter/etc/saprouttab -E  -G /usr/sap/saprouter/logs/saprouter.log -J 20971520 -T /usr/sap/saprouter/logs/dev_rout

ExecStop=/usr/sap/saprouter/bin/saprouter -s

ExecReload=/usr/sap/saprouter/bin/saprouter -n

Restart=on-failure

[Install]
WantedBy=multi-user.target

Schlüsseln wir den Eintrag mal auf. In der Sektion [Unit] ist wichtig, dass dieser Service gestartet wird, nachdem das Netzwerk gestartet wurde.

In der Sektion [Service] geben wir den Benutzer an, unter dem der Service laufen soll und wir geben auch zwei Umgebungsvariablen mit.

Mit ExecStart, ExecStop und ExecReload geben wir die Parameter an, die wir verwenden wollen.

-r                                       # Starte den SAProuter
-S 3299                                  # Verwende Port 3299
-R /usr/sap/saprouter/conf/saprouttab       # Pfad zu Route Permission Table
-E                                       # Verhindere das Überschreiben von Trace- und Logfiles
-G /usr/sap/saprouter/logs/saprouter.log    # Pfad zur Logdatei
-J 20971520                              # Maximale Größe der Logdatei in Bytes -> 20 MB
-T /usr/sap/saprouter/logs/dev_rout      # Pfad zur Tracedatei

Je nach Bedarf können noch weitere Parameter interessant sein. Wenn wir IPv6 verwenden möchten, kann der Parameter -6 eingestellt werden. Bei größeren Umgebungen kann eine SAProuter Instanz nicht ausreichend sein. Es werden im Standard 800 Clients (-C) bedient. Möchte man zusätzliche Instanzen haben, ist der Parameter -Y n zu verwenden. Dabei gibt n = 0 an, dass jedes Mal, wenn die maximale Anzahl an Clients erreicht ist, automatisch ein neuer SAProuter Prozess gestartet wird.

Der SAProuter gibt einem die Möglichkeit, eine geänderte Konfiguration einzulesen, ohne den Service zu beenden. Daher wird ein Eintrag ExecReload mit dem Parameter -n eingetragen.

Damit die Konfiguration des systemd Service aktiv wird, muss der deamon neu geladen und der Service aktiviert werden.

sudo systemctl daemon-reload
sudo systemctl enable saprouter.service

Jetzt sollte man den Service starten. Wenn Fehler in der Konfiguration vorhanden sind, bricht der Service ab. Man sollte den Fehler erst korrigieren, bevor man die weitere Konfiguration der saprouttab durchführt.

Startet der Service einmal fehlerfrei, dann kann man den Service mittels systemctl wie folgt bedienen:

sudo systemctl status saprouter        # Status des Service anzeigen
sudo systemctl stop saprouter           # SAProuter Service beenden
sudo systemctl start saprouter          # SAProuter Service beenden 
sudo systemctl reload saprouter        # Konfiguration des SAProuter Service neu einlesen

saprouttab pflegen

Jede Zeile in der saprouttab wird als einzelne Regel interpretiert. Die Syntax dieser Regel ist dabei:

# P/S/D    <source-host>    <dest-host>    <dest-service>    <Opt. password>
# P = Permit
# S = Secure 
# D = Deny
# Beispiele
P   147.204.2.5      *      *    # Zugriff von SAP über sapserv3 auf alle Kundensystemen und SAP Services
P   172.16.1.0/22    *      *    # Angenommen 172.16.1.0 ist internes Client-Netz. Zugriff der Clients auf alle SAP-Systeme mit SAP Services
P    <Dienstleister IP>  <sapprod>   3200  # Erlaube einem Dienstleister den Zugriff auf sapprod und den Disp&Work Port 3200 (Dialoginstanz = 00 )
P   147.204.2.5   <WTS>   3389  # Erlaube SAP über sapserv3 den Zugriff auf einen internen Windows Terminal Server mit RDP-Port 3389 
D          *                *      *    # Letzter Eintrag: Deny ALL 

Für die verschiedenen Zugriffsmöglichkeiten von SAP (SNC, VPN, etc.) auf ein Kundensystem, sollte SAP-Hinweis 48243 geprüft werden.

Grundsätzlich gilt bei der saprouttab die First-Match-Regel. Die Zeilen werden von oben nach unten ausgewertet. Der erste Eintrag, bei dem Quelladresse, Zieladresse und Zielport übereinstimmen, bestimmt, ob eine Verbindung zugelassen oder verweigert wird.

Wird kein passender Eintrag gefunden, gilt die Deny-All-Regel.

Prüfen der Verbindungen

Damit die Konfiguration auch fehlerfrei funktioniert und ggf. nicht von einer Firewall geblockt wird, sollte dies mit niping geprüft werden.

Test zu SAP Walldorf

~ PATH=$PATH:/usr/sap/saprouter/bin
~ sudo env PATH=$PATH niping -c -O -H /H/127.0.0.1/H/147.39.131.34/H/localhost
Fri Jun 02 10:34:42 2023
connect to server o.k.
send 10 messages (len 1000)
...

Test zu internem SAP-System sapsrv01 mit Port 3200

~ PATH=$PATH:/usr/sap/saprouter/bin
~ sudo env PATH=$PATH niping -c -O -S 3200 -H sapsrv01 -I 3
Fri Jun 02 10:36:42 2023
connect to server o.k.
send 10 messages (len 1000)
...

Wenn man alle Verbindungen der saprouttab testen möchte, kann man sich mit zwei kleinen Befehlen behelfen.

  1. Hostliste mit Ports erstellen
~ sudo awk -F ' ' '/^P/ && ( $6 != "*" && $7 != "*") { print $6, $7 }' /usr/sap/saprouter/etc/saprouttab > hostlist.txt 
  1. Loop über diese erstellte Datei mit niping laufen lassen
~ while read -r HOST PORT; do sudo env PATH=$PATH niping -O -c -I 3 -S $PORT -H $HOST: done<hostlist.txt