Sicherheit bei Remote-Verbindung über libssh

daemotron

New Member
Vorweg gleich ein Hinweis: das ist ein Cross-Post zu [1] und [2]. Ich hoffe auf ein möglichst breites Meinungsbild, daher hoffe ich, das wird ausnahmsweise toleriert :)

Zum Thema: ich bin gerade dabei, mir ein Tool zu schnitzen, mit dem ich mehrere FreeBSD-Server und Jails bequem vom heimischen Rechner aus konfigurieren und verwalten kann [1]. Der Zugang zum entfernten System soll dabei über SSH erfolgen (ich nutze dafür libssh); allerdings stellt sich hier jetzt die Frage nach der Sicherheit eines solchen Zugangs.

Bisher gibt es auf meinen Servern einen "normalen" User, und nur dieser darf sich per SSH einloggen. root-Rechte erwirbt dieser normalerweise, indem er su nutzt. Aus praktischen Erwägungen heraus lässt sich diese Vorgehensweise nicht ohne weiteres nachbilden, was auch mit dem Aufbau des SSH-Protokolls zusammenhängt: Jeder Befehl wird in einem neuen Channel abgefeuert; der Kontext bleibt also nur erhalten, wenn gleich der erste Befehl selbst einen Kontext herstellt, in dem dann alles weitere geschieht (z. B. eine Shell, was sich dann von außen nur schwer bis gar nicht skripten lässt).

Ich sehe daher drei theoretisch mögliche Vorgehensweisen:
  • a. Anders als bisher darf root sich doch direkt per SSH einloggen, natürlich beschränkt auf Public Key Authentication
  • b. Es darf sich weiterhin nur ein normaler User einloggen; dieser darf aber sudo ohne Passworteingabe nutzen
  • c. Es darf sich weiterhin nur ein normaler User einloggen; dieser spawnt als erstes eine Shell, in deren Kontext dann alles weitere abläuft.
Meine Pro's und Con's:
Pro a: Einfach umzusetzen, PubKey sehr schwer zu knacken
Contra a: root ist ein bekannter Account => minimaler Vorteil bei einem Brute Force Angriff

Pro b: Immer noch relativ einfach umzusetzen, PubKey sehr schwer zu knacken, kein bekanntes User-Handle
Contra b: sudo ohne Passwort-Schutz => wer in den Account reinkommt, ist faktisch root

Pro c: PubKey sehr schwer zu knacken, kein bekanntes User-Handle, selbst bei erfolgreichem Einbruch noch keine root-Rechte
Contra c: Sehr komplex (und damit fehleranfällig) in der Umsetzung, root-Passwort muss irgendwie lokal gespeichert werden

Momentan tendiere ich zu Variante a., da ich den tatsächlichen Sicherheitsgewinn der Varianten b. und c. als sehr gering einschätze - wie seht Ihr das? Habe ich ggf. etwas übersehen?



[1] https://github.com/daemotron/controlbeast
 
Hast du dir mal Ansible angesehen? Das arbeitet auch via SSH und ist super einfach in der Bedienung. Es arbeitet auch mit Keys.

Aber könntest du nicht einfach einen Benutzer via sudo als root behandeln? Das könnte dann dein Problem lösen.

Ansonsten ist es natürlich gut wenn neue FreeBSD-Tools entwickelt werden :)
 
Ansible kannte ich tatsächlich noch nicht :) Ich kannte bisher nur Puppet, das war mir aber zu generisch und zu aufwändig für meine Zwecke, daher irgendwann der Entschluss, meine Shell-Skripte mal in was ordentlichem zu bündeln :D

Ansible verwendet übrigens Paramiko für den SSH-Zugang; das funktioniert (noch) allerdings nur für Python 2.x.

sudo in Verbindung mit Deployment-Skripten wäre in der Tat eine Möglichkeit, um direkten root-Zugang zu umgehen... Muss ich mir mal in Ruhe anschauen. Man kann sudo scheinbar dazu bekommen, dass Passwort von stdin zu lesen, statt zu prompten.
 
Ich mag Puppet nicht. Kennst du salt?

Aktuell migriere ich alles auf Ansible. Da ich alles aus den Ports hole habe ich ein Skript geschrieben, welches mir auf Basis einer Vorlage alle Ports vorkonfiguriert: https://github.com/curana/makextract

Ich bin gespannt was du baust.
 
Back
Top