Angenommen, ich habe eine Reihe von Maschinen (hier die Maschinen der Kunden genannt), auf die nur eine kleine Liste von Personen (die als Support-Mitarbeiter bezeichnet werden) SSH ausführen kann, wobei nur ein Konto pro Maschine (das Support-Zugriffskonto) verwendet wird.
Das Support-Personal soll sich nur mit Schlüsseln bei den Kunden anmelden. Darüber hinaus kann sich das Support-Personal weiterentwickeln, sodass sich jemand, der das Support-Personal verlässt, nicht bei einem Kundencomputer anmelden darf. Daher ist es Mitarbeitern untersagt, die privaten Schlüssel zu lesen, mit denen sie sich bei den Computern der Kunden anmelden. Es ist auch verboten, die authorized_keys
Datei auf den Computern der Kunden zu ändern .
Um diese Konfiguration zu realisieren, hatte ich die Idee, einen SSH-Proxy zu verwenden, bei dem sich die Support-Mitarbeiter anmelden (mit LDAP-Authentifizierung, aber das ist ein weiteres Problem) und der die privaten Schlüssel enthält.
Die Frage ist: Wie erlaube ich Supportmitarbeitern, den privaten SSH-Schlüssel zu verwenden, ohne ihn lesen zu können?
Ich glaube, dass ich einen Daemon als Root auf dem Proxy-Computer ausführen muss, der die Anforderung eines Benutzers akzeptiert und eine SSH-Sitzung für ihn öffnet, aber ich habe keine Ahnung, wie das geht. Irgendwelche Ideen?
quelle
Antworten:
Ich würde ein paar Optionen vorschlagen.
Schützen Sie den SSH-Schlüssel und fordern Sie die Verwendung
sudo
auf der Seite Ihres Support-Teams. Sie können dies transparent mit einem Wrapper tun. Rufen Sie den Wrapper an/usr/local/bin/ssh-support
und lassen Sie ihn so etwas enthalten (ungetestet):Dies würde einen Eintrag in der
sudoers
Datei erfordern , der es Benutzern in dersupport
Gruppe ermöglicht, das Tool zu verwenden. Mit diesem Befehl können sie dasssh-support
Tool alsssupport
Benutzer ausführen - was Sie erstellen müssen. Es ist nicht verleihen jede Root - Rechte.Wenn Sie zufrieden sind, dass die Support-Benutzer kein eigenes Kennwort angeben müssen, um das Tool auszuführen (wie vom
sudo
Aufruf im Skript selbst angefordert ), können Sie diesudoers
Definition folgendermaßen ändern :Angenommen,
PATH
enthalten/usr/local/bin/
würden Sie es dann mit nennenssh-support clientname
. Angenommen, Sie haben denssupport
Benutzer so erstellt, wie/home/ssupport
Sie ihn erstellen würden,/home/ssupport/.ssh/id_rsa_clientname
und/home/ssupport/.ssh/id_rsa_clientname.pub
als Zertifikatspaar, und einen Hosteintrag/home/ssupport/.ssh/config
fürclientname
den Benutzer, den Host, den Port usw. für den Zielcomputer definiert. Sie würden wahrscheinlich die X11-Weiterleitung, die Portweiterleitung usw. explizit deaktivieren. Wie üblich/home/ssupport/.ssh
müsste das Verzeichnis mit Berechtigungen geschützt werden0700
.Geben Sie jedem Support-Mitglied ein eigenes lokales Benutzerkonto und lassen Sie jede Person ihren eigenen privaten SSH-Schlüssel verwenden, um auf die Server des Clients zuzugreifen. Wenn eine Person die Support-Gruppe verlässt, entfernen Sie ihren SSH-Schlüssel von den Servern des Clients. Dies bedeutet, dass Sie sich nicht mehr darum kümmern müssen, dass Ihre Mitarbeiter den privaten SSH-Schlüssel nicht kennen.
quelle
sudoers
Zeile beschränkt den Zugriff auf den einzelnen Befehl-E
-L,-R,-D
-o PermitLocalCommand=yes -o 'LocalCommand=/bin/bash'
ssh root@somewhere
mit Schlüsseln undssh user@somewhere
dann mit Sudo. Es ist eigentlich ein wirklich guter Punkt. Die einzige Möglichkeit für diesen Fall istssh keyowner@localhost ssh_to_client client.example.org
jedoch eine Alternative zusudo -u keyowner ssh_to_client client.example.org
. Ähnlich wie bei sudo kann SSH die Befehle einschränken, die ein Benutzer ausführen darf. Wir sprechen über passwortloses Sudo für Nicht-Root-Benutzer, nicht für den Anwendungsfall von Galaxy.Was Sie wirklich tun möchten, ist, die SSH-Zertifizierungsstelle zu verwenden und die von jeder Support-Person verwendeten Schlüssel zu signieren (sie sollten ihre eigenen SSH-Schlüssel haben, wie z. B. Pässe) und die Server Ihrer Clients so zu konfigurieren, dass sie die
TrustedUserCAKeys /etc/ssh/users_ca.pub
in der Datei / etc / ssh / sshd_config verwenden. Auf diese Weise akzeptiert der Server alle vom CA-Schlüssel signierten Schlüssel (auf die Sie Zugriff haben) und Sie können Schlüssel von Personen widerrufen, die nicht mehr unterstützt werden, ohne auch nur autorisierte_Tasten zu berühren.Eine schnelle Suche nach "ssh ca" zeigte auf dieses Tutorial: https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with -ubuntu (scrollen Sie nach unten zu "So konfigurieren Sie Benutzerschlüssel") - Obwohl im Lernprogramm Ubuntu erwähnt wird, ist es verteilungsunabhängig, aber Sie benötigen eine neue Version von OpenSSH, die SSH CA unterstützt
Ein weiterer guter Blogeintrag zum Thema ist https://ef.gy/hardening-ssh (scrollen Sie nach unten zu "SSH-Zertifikate").
Achten Sie besonders darauf, dass Sie den Schlüssel für eine begrenzte Zeit unterschreiben können, damit er automatisch abläuft!
quelle
Es gibt verschiedene Antworten, die ein Wrapper-Skript für ssh betreffen, das über sudo oder setuid-executeable (für ein spezielles Nicht-Root- Konto) aufgerufen wird . Wie nkms sagt , kann der Benutzer durch Übergeben aller Argumente an ssh beliebige Dinge mit den ssh-Schlüsseln tun, die wir schützen möchten . Das andere Extrem, das sich einige ausgedacht haben, ist, nur einen Hostnamen zuzulassen.
Das OP sagt, dass Administratoren in der Lage sein müssen, Dinge hochzuladen.
Sie könnten zwei verschiedene Wrapper mit festen Argumenten zu SSH haben. Eine für eine Login-Shell, eine andere für scp. Keine vom Benutzer angegebenen Argumente außer Hostname (und Dateiname zum Hochladen).
Oder ein Wrapper-Skript, das sich
getopt
selbst verwendet, um sehr eingeschränkte Optionen zu analysieren und Dinge in einen meist festen ssh-Befehl einzufügen. Das Ignorieren (oder Fehler) bei nicht erkannten Optionen wäre der richtige Weg.Versuchen Sie nicht, "gefährliche" SSH-Optionen herauszufiltern, sondern schreiben Sie einfach einen Wrapper, der zwei Dinge tun kann: interaktive Anmeldung oder Hochladen einer Datei (lokale und entfernte Dateinamen). Sie müssen dort noch einige Desinfektionsarbeiten durchführen, denke ich.
Eigentlich ist das immer noch leicht falsch zu verstehen. Sie müssen einen Weg finden, um den Benutzer daran zu hindern, die Datei mit den SSH-Schlüsseln als lokale Datei anzugeben. Sie versuchen also immer noch, an alles zu denken, was nicht zugelassen werden muss, anstatt zunächst nichts zuzulassen. Es wäre ein Anfang, um sicherzustellen, dass die Dateinamen keine
@
oder enthalten:
.quelle
Wenn Sie einen SSH-Proxyserver einrichten, können Sie festlegen, dass die Shell (in
/etc/passwd
) Ihrer Mitarbeiter nicht auf eine Shell wie bash festgelegt ist, sondern auf ein einfaches Skript, das keinen Shell-Zugriff zulässt. Stattdessen würde dann nach einem Zielhostnamen (read target
) gefragtexec ssh "support@$target"
.Beachten Sie, dass die Verwendung eines solchen Proxys die Verwendung von Tools wie
scp
das Übertragen von Dateien auf / von den Kundencomputern möglicherweise erschwert . Dies kann ein Problem oder ein Vorteil sein!quelle
sudo
funktionieren aber auch. Seine Antwort schlägt vor, den lokalen Root-Benutzer zu verwenden, aber ein Nicht-Root-Benutzer würde auch funktionieren. Siehe meine Kommentare zu seiner Antwort zur Diskussion darüber. (Meinessh keyowner@localhost
Idee ist die gleiche wie Ihre Idee.)sudo
Setup ohne Rootberechtigung .Ihre Support-Mitarbeiter stellen immer eine Verbindung über diesen Proxy-Computer her und nur von diesem aus, sodass die Clients den Proxy-Computer einfach mithilfe von HostbasedAuthentication authentifizieren können .
Angenommen, der Proxy-Computer ist
supporters.pc
und Sie bieten Unterstützung fürcustomer.pc
customer.pc hat HostbasedAuthentication yes in
/etc/ssh/ssd_config
, Supporters.pc in/etc/ssh/shosts.equiv
und seinen öffentlichen Schlüssel in/etc/ssh/ssh_known_hosts
.Wenn sich Ihre Support-Mitarbeiter bei [email protected] anmelden und ausführen
ssh customer.pc
, wird ssh-keysign (8) (das gesetzt werden muss) erzeugt, das die Schlüsselsignatur mit der Datei behandelt, die Sie nicht lesen können, und Geben Sie den Anhängern den Beweis, dass die Verbindung tatsächlich von den Anhängern stammt . Als customer.pc vertraut supporters.pc , wird Ihr Mitarbeiter angemeldet als Unterstützung .quelle
Verwenden Sie eine Wrapper-Binärdatei
Für diesen speziellen Anwendungsfall (siehe den wichtigen Hinweis unten) besteht eine Möglichkeit darin, einen Benutzer (z. B.
support-ssh
) speziell für diese ausgehenden SSH-Verbindungen zu erstellen und dann eine kleine Wrapper-Binärdatei zu installieren, die ausgeführt wird/usr/bin/ssh
.ssh
Binärdatei selbst nicht + chmod , da Sie nicht daran denken, sie jedes Mal neu zu kopieren, wenn Sie Sicherheitsupdates anwenden.root
als privilegierter Benutzer, da Gründe, denen ich vertraue, offensichtlich sind.Dies ist eine funktional äquivalente Alternative zur Verwendung
sudo
, um die Berechtigungen auf die dessupport-ssh
Kontos mit den folgenden Kompromissen zu erhöhen :sudo
, sodass das Risiko von Konfigurationsfehlern geringer ist als beabsichtigt.sudo
(aber je mehr Code Sie schreiben, desto mehr müssen Sie auf Sicherheit prüfen).Die Wrapper-Binärdatei sollte
HOME
auf dassupport-ssh
Home-Verzeichnis des Benutzers eingestellt sein, damitssh
der entsprechendessh_config
und private Schlüssel abgerufen wird. Dem aufrufenden Benutzer sollte jedoch nicht gestattet werden,~support-ssh/.ssh/
dessen Inhalt zu lesen .Der Wrapper kann so einfach sein wie:
Möglicherweise möchten Sie restriktiver sein und überprüfen, ob sich das Argument
argv[1]
in einer Reihe zulässiger Hostnamen befindet. Oder weniger restriktiv und erlauben (eine Teilmenge von) Optionsargumenten. Vielleicht möchten Sie auf Umgebungsvariablen vollständig ersetzen (aber tigeren halten wieTERM
,LC_*
usw.); Beachten Sie, dassLD_LIBRARY_PATH
undLD_PRELOAD
sind besonders gefährlich.scp
Bei Bedarf kann ein ähnliches Wrapper-Programm bereitgestellt werden.Ein Hinweis zur Anwendbarkeit
Diese Antwort befasst sich mit den besonderen Umständen der Frage, unter denen die Benutzer vertraglich verpflichtet sind, Verfahren einzuhalten, und es gibt Sanktionen (z. B. Entlassung) für Verstöße gegen diese. Es wird davon ausgegangen, dass Sie verhindern möchten, dass die Mitarbeiter zufällig private Schlüssel kopieren, anstatt zu verhindern, dass ein entschlossener Angreifer unbefugten Zugriff erhält.
Ich bin der Ansicht, dass Sicherheit sowohl durch technische als auch durch nichttechnische Abwehrmaßnahmen erreicht wird und dass das hier oder durch Verwendung erzielte Gleichgewicht
sudo
für die dargestellte Situation angemessen ist.quelle