Nur bestimmte Schlüssel in der Agentenweiterleitung zulassen?

7

Ist es möglich, die Agentenweiterleitung zu verwenden, bei der alle Schlüssel von der Weiterleitung ausgeschlossen werden, mit Ausnahme der speziell angegebenen? Gibt es alternativ Möglichkeiten, die Reihenfolge anzugeben, in der die Schlüssel pro Sitzung ausprobiert werden?

Für die Verwendung ssh-agentmüssen verschiedene Sockets verwaltet werden: /superuser/357602/use-a-specified-key-from-ssh-agent/401737#comment396923_358604

Gibt es alternative Agenten, die einfacher zu konfigurieren sind?

Zum Beispiel:

Client A -->  ssh/agent-forwarding --> Server B -->  Server C 
                                            | 
                                            ------>  Server D 

Ich möchte nur einen Schlüssel für die Agentenweiterleitung zulassen, und zwar: A -> B -> Cund nicht A -> B -> D. Oder geben Sie zumindest die Reihenfolge an, in der die Schlüssel ausprobiert werden.

(Aus Gründen der Übersichtlichkeit nach der Antwort von @ jeff-ferland bearbeitet.)

dgo.a.
quelle

Antworten:

1

Mir sind keine Agenten bekannt, die die selektive Weiterleitung von Schlüsseln ermöglichen, wie Sie es dargestellt haben. Sobald ein Schlüssel an einen Host weitergeleitet wurde, ist er so, als wäre er lokal gespeichert und kann zur Authentifizierung bei jedem Host von dort aus verwendet werden.

Wenn ich Ihre Frage auf einer anderen Ebene betrachte, habe ich zwei Ideen, was Sie möglicherweise versuchen:

  • Verhindern Sie, dass sich jemand bei bestimmten Hosts ohne physische Präsenz an einem Standort authentifiziert.

Wenn dies Ihr Ziel ist, können Sie es nicht durch die Kontrolle der Authentifizierungsschlüssel erreichen. Sie müssen den Zugriff über Architektur- und Hosteinschränkungen steuern, sodass kein Host, auf den remote zugegriffen werden kann, auf einen "sicheren" Host zugreifen kann.

  • Bestimmte Schlüssel "schützen", damit sie nicht freigelegt werden.

Wenn dies Ihr Ziel ist, ist es ein Missverständnis darüber, wie Schlüssel geschützt werden. Schlüssel selbst werden niemals weitergeleitet. Die Möglichkeit, auf den SSH-Agenten zuzugreifen, um sich gegen einen Schlüssel zu authentifizieren, wird weitergeleitet. Diese Weiterleitung kann jedoch nur während der Weiterleitung genutzt werden und nur dann, wenn der Computer, an den Sie Ihren Agenten weitergeleitet haben, von einem nicht vertrauenswürdigen Administrator ausgeführt wird (freiwillig oder durch Kompromisse). Wenn Sie in Ihrem Diagramm nicht erfolgreich von Computer B -> D aus protokollieren und die Weiterleitung von A -> B -> D exportieren, besteht daher kein Risiko, dass Sie Ihre Anmeldeinformationen offenlegen. Sie können sicher von A -> B weiterleiten, wenn Sie B vertrauen.

Ich schlage vor, Sie lesen eine sehr ausführliche Erklärung, wie die Weiterleitung mit Diagrammen funktioniert, wenn Sie sich über das Konzept noch nicht sicher sind.

Jeff Ferland
quelle
Das Ziel war eigentlich, die Tatsache zu umgehen, dass die Reihenfolge, in der die Schlüssel auf "Server B" verwendet werden, während der Agentenweiterleitung nicht einfach angepasst werden kann. Alles funktioniert mit einer regulären .ssh-Sitzung mit .ssh / config. Während der Weiterleitung des Agenten haben Sie jedoch anscheinend keine Kontrolle über die Reihenfolge der versuchten Schlüssel. Die Frage war eher aus Neugier als aus praktischen / Sicherheitsgründen. Vielen Dank für die ausführliche Antwort und entschuldigen Sie die Verwirrung.
dgo.a
Es erscheint völlig legitim, B nur für eine bestimmte Aufgabe zu vertrauen und daher nur Schlüssel weiterzuleiten, die B-ish-Aufgaben an B authentifizieren können. Sie scheinen also falsch zu verstehen, warum "Schützen Sie bestimmte Schlüssel, damit sie nicht verfügbar gemacht werden" ein vernünftiges Ziel ist. Wenn der Schlüssel zur Authentifizierung verwendet werden kann, kann der Zugriff auf alles, was er schützt, verloren gehen, und es ist irrelevant, ob der Schlüssel offen gelegt wurde oder nicht.
user239558
Dieser Kommentar scheint ziemlich verwirrt. Wenn Hosts unterschiedlich vertrauenswürdig sind, sollte es offensichtlich nicht möglich sein, von einem Host mit geringerem Vertrauen zu einem Host mit höherem Vertrauen zu gelangen!
user239558
2

Eine Funktion wie die angeforderte würde zum ssh-Client gehören.

Für den SSH-Agenten wäre es zu schwierig herauszufinden, wann er über eine Weiterleitung kommuniziert und wann er mit einem lokalen SSH-Client kommuniziert. Es wäre eine Sicherheitslücke, wenn der Server die Einschränkung anwenden würde. Damit bleibt der SSH-Client der einzige Ort, an dem eine solche Funktion vernünftigerweise existieren könnte.

Ein kurzer Blick durch die openssh-Quelle führte mich zur Funktion client_request_agent in clientloop.c. Von dem, was ich dort sehe, habe ich den Eindruck, dass der SSH-Client den Rohbyte-Stream einfach weiterleitet, ohne zu verstehen, welche Schlüssel verwendet werden. Dies bedeutet, dass das Hinzufügen dieser Funktion zum Client einen erheblichen Aufwand erfordern würde.

Eine weitere verwandte Funktion, die mit weniger Arbeit hinzugefügt werden könnte, wäre die Option, zwei verschiedene Agenten zu verwenden. Ein Agent kann zur Authentifizierung beim Server verwendet werden, während ein anderer Agent an den Server weitergeleitet werden kann.

Beides wären nützliche Funktionen, die ich ebenfalls nutzen würde, aber leider scheint es (noch) nicht in openssh zu geben.

Kasperd
quelle
1

Wenn dieses Problem ausschließlich bei der App-Bereitstellung mit verschiedenen privaten Repos auftritt, für die unterschiedliche Schlüssel erforderlich sind:

Sie können die Agentenweiterleitung insgesamt überspringen. Kopieren Sie die Dateien auf den Computer mit den verschiedenen Schlüsseln und synchronisieren Sie die geklonten Repos auf den Server, auf dem die Bereitstellung erfolgt.

Client A
    |
* private keys
* `git clone ...` private repos 
* /tmp/repos
      | 
      |  ------------> rsync/scp -----------> Server B

Sie können den Prozess mit Alias, Shell-Skripten usw. automatisieren. In Capistrano ist dies sogar integriert. Dies wird als Kopierstrategie bezeichnet: http://rubydoc.info/github/capistrano/capistrano/master/Capistrano/Deploy/Strategy/Copy

dgo.a.
quelle