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.


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*).


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="romeovs@darkstar.example.com" 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).

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.