SSH Zugang mit vollen root-Rechten
Originalbeschreibung von Chris Pea, etwas erweitert von Jan Wachsmuth
Problem
Leider sind nicht alle Parameter des ISGweb, die in der Weboberfläche vorhanden sind, über modbus/TCP auslesbar bzw. änderbar. Die Parameter im Webinterface sind leider nicht gut von Loxone abfragbar, da nur aktive Parameter dort angezeigt werden. Beispiel: Heizkreispumpe wird nur angezeigt, wenn diese aktiv ist. Das Parsen ist daher recht schwierig. Wer die Parameter näher kennenlernen möchte, hat mit dem SSH Zugang eine einfache Möglichkeit, sein ISGweb anzupassen.
ACHTUNG: Die original SD-Karte von Stiebel-Eltron sollte auf keinen Fall direkt modifiziert werden!!! Aus Sicherheitsgründen sollte immer mit einer Kopie gearbeitet werden. Eine SD-Karte kann z.B. unter OS-X mit dem Tool "Apple PI Baker" oder unter Windows mit dem Tool Win32DiskImager geklont werden. Die geklonte Karte kann dann z.B. mit einem Raspberry PI bearbeitet werden, siehe mit ISG web über Modifikation des Webservers
Schritt 1: Anpassen der Datei sshd_config
Der SSH Server verwendet eine Konfigurationsdatei, die man direkt im Root-Verzeichnis der SD-Karte speichern kann. Ich habe die Datei von meinem Raspberry übernommen und lediglich zwei Zeilen angepasst:
AuthorizedKeysFile .ssh/authorized_keys
Subsystem sftp /usr/libexec/sftp-server
Bei der ersten Zeile muss der Kommentar # in der ersten Spalte entfernt werden und bei der zweiten Zeile der Pfad angepasst werden. In diesem Verzeichnis liegt der SFTP-Server, der benötigt wird, wenn man das Dateisystem z.B. mit sshfs mounten möchte. Das ist sehr praktisch, da man dann sehr einfach Dateien zwischen der aktiven SD-Karte und dem PC / Mac kopieren kann und die gewohnten Tools / Editoren verwenden kann.
Hier ist die gesamte Datei:
sshd_config
# Package generated configuration file
# See the sshd_config(5) manpage for details
# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 2048
# Logging
SyslogFacility AUTH
LogLevel INFO
# Authentication:
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes
# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no
#MaxStartups 10:30:60
#Banner /etc/issue.net
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
Subsystem sftp /usr/libexec/sftp-server
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
Schritt 2: Erstellen eines Schlüsselpaares (Public/Private Keys) für SSH
Da das Password für den root-Zugang nicht bekannt ist, kann man im Verzeichnis des Benutzers root einen public Key für SSH hinterlegen. Das ist sehr praktisch, da man das vorhandene Password nicht ändern muss und später sehr einfach einen Zugriff per SSH auf das ISGweb bekommt. Hierfür erstellt man auf dem Client (also dem PC mit Windows, Linux oder Mac) ein Schlüsselpaar, welches man nach dem Server benennen kann:
ssh-keygen
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/myusername/.ssh/id_rsa): /Users/myusername/.ssh/id_rsa_ISGweb
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/myusername/.ssh/id_rsa_ISGweb.
Your public key has been saved in /Users/myusername/.ssh/id_rsa_ISGweb.pub.
The key fingerprint is:
...
Den öffentlichen Schlüssel, also die Datei mit der Endung .pub wird dann auf die SD-Karte kopiert und in dem Verzeichnis /root/.ssh unter dem Namen authorized_keys gespeichert. Der Ordner muss vorher auf der SD-Karte erstellt werden und die Datei kann z.B. über Copy&Paste übertragen werden. Anleitungen für diesen Schritt gibt es viele im Internet.
Schritt 3: Anpassen des Skriptes zum Starten des ISGweb
Es gibt auf der SD-Karte zwei verschiedene Versionen der Software, die in den Unterverzeichnissen /rel_a und /rel_b liegen. Die Datei version enthält die jeweilige Version, so dass man relativ einfach das richtige Unterverzeichnis findet. Zu der Datei /rel_x/etc/init.d/start.sh (x ist ein Platzhalter für a oder b) werden folgende Zeilen hinzugefügt:
#start htpdate daemon #hier kommt der neue code für SSH #script to start sshd with private key access remount rw /dev/mtdblock1 / cp /firmware/sshd_config /etc/ssh/sshd_config #ssh-start remount ro /dev/mtdblock1 / |
---|
In dem Skipt wird die Datei sshd_config, die direkt im Hauptverzeichnis auf de SD-Karte liegt, in das passende Verzeichnis /etc/ssh kopiert. Hierfür muss das Dateisystem vorher als Read-Write neu gemountet werden. Dann wird das Verzeichnis für die SSH Keys für den User root erstellt und die Keys dorthin kopiert. Dann wird der SSH Daemon gestartet und das Dateisystem wieder auf Read-Only gesetzt.
Schritt 4: Zugriff per SSH auf das ISGweb
Mit dem favorisierten SSH Client kann man dann bequem auf das ISGweb ohne Eingabe eines Kennwortes zugreifen:
Man kann sogar die SD-Karte als Dateisystem per sshfs mounten:
sshfs -C -p 22 -o allow_other -o volname=ISGweb root@192.168.1.26:/ ~/Volumes/ISGweb
Das Verzeichnis für den Mount-Point muss vorher einmalig erstellt werden und die IP-Adresse natürlich auf das eigene ISGweb angepasst werden.