systemd-Dienst, der das Kennwort .ssh / id_dsa benötigt

8

Ich habe einen systemctl-Dienst, der einen Prozess smd-loopin einer screenSitzung startet . Dieser Prozess erfordert den Zugriff auf entfernte SSH-Quellen (zu Synchronisierungszwecken) und muss daher auf meinen id_dsaprivaten Schlüssel zugreifen können .

Wie kann ich den systemd-Dienst so einrichten, dass er funktioniert? Der folgende Dienst startet den Vorgang korrekt, erfordert jedoch, dass ich eine Verbindung zur Bildschirmsitzung herstelle und das id_dsaKennwort manuell eingebe.

[Unit]
Description=smd loop
After=local-fs.target network.target

[Service]
User=%i
Group=users
Type=Forking
ExecStart=/usr/bin/screen -S smd-loop-win -md "smd-loop"
RemainAfterExit=yes

Wenn ich smd-loopdas id_dsaPasswort manuell starte, ist es nicht erforderlich, da ich das pam_sshModul installiert habe ssh-agent, das ein Passwort startet , das das Passwort bei der Anmeldung enthält.

Romeovs
quelle
Ich nehme an, Sie meinen, dass es nicht auf Ihren öffentlichen, sondern auf Ihren privaten Schlüssel zugreifen muss. Hab ich recht?
Serge
ah ja es braucht den privaten Schlüssel. Lassen Sie mich das beheben
Romeovs

Antworten:

3

Sie müssen die Identitätsdateien mit dem nicht verschlüsselten privaten Schlüssel in das ~/.sshVerzeichnis des Benutzers stellen, den der Dienst ausführt. Außerdem müssen Sie die Umgebungsvariable HOME dafür festlegen, z. B. wenn sie als root ausgeführt wird:

ExecStart=/usr/bin/env HOME=/root /usr/bin/screen -S smd-loop-win -md "smd-loop"

Wenn Sie die Steuerung der smd-loopAufrufe steuern sshkönnen, können Sie alternativ eine -IOption hinzufügen , um die sshzu verwendende Identitätsdatei anzuweisen.

In jedem Fall muss die Identitätsdatei diesem Benutzer gehören und nur diesem Benutzer zugänglich sein ( chmod 0400 ~/.ssh/id*).

Serge
quelle
Vielen Dank! Um richtig zu sein, envsollte /usr/bin/envsystemd nicht wissen, wo es envist. auch tatsächlich der Befehl smd-loop, smd-loop-winist der Name der Bildschirms Instanz erstellt.
Romeovs
6

Wenn der Dienst nur funktionieren muss, während Sie angemeldet sind, stellen Sie eine Verbindung zu dem Dienst her ssh-agent, den Sie mit Ihrer Sitzung beginnen. Der einfachste Weg, dies zu tun, besteht darin, einen festen Pfad für den Agent-Socket zu verwenden. Setzen Sie die SSH_AUTH_SOCKUmgebungsvariable /home/romeovs/.ssh/darkstar.agent.socketsowohl im systemd-Job als auch in Ihrem auf so etwas wie .profile. Beachten Sie, dass Sie, wenn Ihre Distribution einen ssh-agentProzess für Sie startet , ihn möglicherweise beenden oder unbenutzt lassen und durch Ihren eigenen ersetzen müssen. Wenn die SSH_AUTH_SOCKVariable in der Umgebung vorhanden ist, ssh-agentwird der darin enthaltene Pfad für ihren Socket verwendet. Wenn Sie sich dann anmelden, führen Sie ssh-addIhren privaten Schlüssel aus, und der Job kann ihn verwenden.

Wenn der Job ständig ausgeführt werden muss, empfehle ich, zu diesem Zweck einen bestimmten kennwortlosen Schlüssel zu erstellen ( ssh-keygen -t rsa -f ~/.ssh/smd.id_rsa -N '') und ihn nur zu autorisieren, einen bestimmten Befehl auf dem Server auszuführen, indem Sie a command=und from=Einschränkungen in der ~/.ssh/authorized_keysDatei auf dem Server verwenden. Die from=Option bedeutet, dass der Schlüssel nur für Anmeldeversuche von einem bestimmten Host gültig ist und command=einen Befehl angibt, der anstelle des vom Client angegebenen Befehls ausgeführt wird.

ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="[email protected]" command="somecommand --foo"

Der Befehl wird von Ihrer Login-Shell ausgeführt. Wenn Sie Parameter an diesen Befehl übergeben müssen, haben Sie zwei Möglichkeiten:

  • Der ursprüngliche Befehl, den der Client versucht, befindet sich in der SSH_ORIGINAL_COMMANDUmgebungsvariablen. Achten Sie darauf, Probleme nicht zu zitieren, wenn Sie versuchen, sie zu analysieren.
  • Einige Umgebungsvariablen werden vom Client übergeben. Die genaue Menge hängt von der Serverkonfiguration ab ( AcceptEnvDirektive in der sshd_configDatei).
Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich würde einen eigenen SSH-Schlüssel ohne Passphrase für diesen Dienst generieren.

Auf den Zielsystemen würde ich dann "command =" in den autorisierten Schlüsseln verwenden, um die Verwendung dieses Schlüssels auf einen einzelnen Befehl zu beschränken.

Danach müssen Sie zum Auslösen des Zielbefehls nur noch eine Verbindung zum Server herstellen - Sie müssen nichts mehr angeben (den Befehl nicht mehr ausführen).

Nils
quelle