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.

ACHTUNGDie 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
bin/htpdate -d -t -s servicewelt.stiebel-eltron.de



#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
mkdir /home/root/.ssh
chmod -R 700 /home/root
cp /firmware/root/.ssh/authorized_keys /home/root/.ssh/authorized_keys
chmod 600 /home/root/.ssh/authorized_keys

#ssh-start
sh /etc/init.d/sshd start

remount ro /dev/mtdblock1 /

#start htpdate daemon
bin/htpdate -d -t -s servicewelt.stiebel-eltron.de



#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
mkdir /home/root/.ssh
chmod -R 700 /home/root
cp /firmware/root/.ssh/authorized_keys /home/root/.ssh/authorized_keys
chmod 600 /home/root/.ssh/authorized_keys

#ssh-start
sh /etc/init.d/sshd 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.