SSH erlaubt nicht die Verwendung eines Schlüssels mit gruppenlesbaren Berechtigungen

9

Ich habe einen Entwicklungs-Git-Server, der auf einem Live-Server bereitgestellt wird, wenn der liveZweig an verschoben wird. Jeder Benutzer hat sein eigenes Login und daher wird der post-receiveHook, der die Live-Bereitstellung durchführt, unter seinem eigenen Benutzer ausgeführt.

Da ich nicht möchte, dass die öffentlichen Schlüssel des Benutzers als autorisierte Schlüssel auf dem Remote-Live-Server verwaltet werden, habe ich eine Reihe von Schlüsseln erstellt, die zum Git-System gehören, um sie zu Remote-Live-Servern hinzuzufügen (in dem von post-receivemir verwendeten Hook $GIT_SSHum den privaten Schlüssel mit der -iOption festzulegen).


Mein Problem ist, dass der private Schlüssel des Git-Systems mindestens gruppenlesbar sein muss, da alle Benutzer möglicherweise für die Bereitstellung bereitstellen möchten, und SSH mag dies wirklich nicht.

Hier ist ein Beispiel für den Fehler:

XXXX@XXXX /srv/git/identity % ssh -i id_rsa XXXXX@XXXXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: id_rsa

Ich habe mich umgesehen und erwartet, etwas zu finden, das ssh dazu zwingt, nur die Verbindung herzustellen, aber ich habe nichts als Leute gefunden, die blind gesagt haben, dass Sie nur auf einen einzelnen Benutzer zugreifen dürfen.

Jessie Ross
quelle

Antworten:

5

Hier ist ein schöner einfacher und sicherer Weg.

Erstellen Sie einen neuen Benutzer für die SSH-Übertragung, ich nenne es Git-Sync. Erstellen Sie einen ähnlichen Benutzer auf dem Server mit Gruppenmitgliedschaft für das Git-Repository. Fügen Sie den öffentlichen Schlüssel für den Synchronisierungsbenutzer in die Datei authorized_keys2 des Benutzers ein. Ich gehe davon aus, dass die Git-Benutzer alle Mitglieder der Git-Gruppe sind. Stellen Sie sicher, dass der Benutzer von git-sync auch Mitglied dieser Gruppe ist.

Bearbeiten Sie nun Ihre Datei / etc / sudoers so, dass sie eine Zeile wie folgt enthält:

%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git

Dadurch kann jedes Mitglied der Gitgroup-Gruppe den Befehl / usr / bin / bit als Git-Sync ohne Kennwort ausführen.

Fügen Sie nun so etwas in Ihren Post-Receive-Hook ein:

sudo -u git-sync /usr/bin/git push origin
Kent Hulick
quelle
Das ist besser als das, wonach ich gesucht habe, danke!
Jessie Ross
11

Sie CAN - Gruppe lesbaren Identitätsdateien verwenden, sofern Sie der Besitzer des Schlüssels sind. Stellen Sie also einfach die Identitätsdatei ein, die beispielsweise dem Root-Benutzer gehört, und dann sind alle Benutzer Ihres Git-Repositorys bereit.

Ein schöner Vorteil dabei ist, dass Sie kein Sudo benötigen - die Lösung wird einfacher.

Beachten Sie, dass das ursprüngliche Problem erneut auftritt, wenn Sie root verwenden, um auf Ihr Git-Repo zu pushen.

Linus Swälas
quelle
2
Das ist großartig und viel besser als die Antworten "Tu das nicht". Vielen Dank!
Ian McGowan
2
Permissions 0640 for 'id_rsa' are too open.

Der private Schlüssel muss privat bleiben. Sie sollten niemandem erlauben, es zu lesen.

Da ich nicht möchte, dass die öffentlichen Schlüssel des Benutzers als autorisierte Schlüssel auf dem Remote-Live-Server verwaltet werden, habe ich eine Reihe von Schlüsseln erstellt, die zum Git-System gehören, um sie zu Remote-Live-Servern hinzuzufügen (in dem von post-receivemir verwendeten Hook $GIT_SSHum den privaten Schlüssel mit der -iOption festzulegen).

  1. Richten Sie ein Schlüsselpaar für ssh vom Entwickler zum Produktionsserver ein
  2. post-receiveVersuchen Sie im Hook-Skript Folgendes:

    if [ "live" == "$branch" ]; then
        ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f"
    fi
    
Quanten
quelle
Wie kann ich "ein Schlüsselpaar für ssh vom Entwickler zum Produktionsserver einrichten"? Damit habe ich ein Problem. Ich habe bereits 2 an Ort und Stelle.
Jessie Ross
1
Auf dem Entwickler: ssh-keygen, ssh-copy-id user@prod. Auf dem Produkt: chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys.
Quanten
1
Das Problem ist, dass es mehrere Benutzer gibt, daher muss ich das für jeden Benutzer wiederholen, der die Zeiten für jedes auf dem Server vorhandene Projekt bearbeiten möchte.
Jessie Ross
Nein. Sie müssen nur zwei weitere Benutzer einrichten: einen zum Entwickeln von ssh vom Entwickler zum Produkt und einen anderen zum Ausführen des git checkout...(auf dem Produkt).
Quanten
Der post-receiveHook (Dev-Computer) wird von dem Benutzer ausgeführt, der eine Änderung vornimmt (daher unter der Erlaubnis des Benutzers), sodass alle unterschiedliche Schlüssel haben. Ich kann nicht helfen, welcher Benutzer es sein wird. Es gibt zwei post-receiveHooks auf zwei verschiedenen Servern in Aktion.
Jessie Ross