Verwendung des Gnomen-Schlüsselbunds ohne x-Sitzung


13

Mein Anwendungsfall ist, dass ich einen Headless-Server habe, auf dem die Softwareentwicklung ausgeführt wird. Normalerweise aktiviere ich die X11-Weiterleitung für die SSH-Verbindungen, nicht jedoch für entfernte Standorte mit langsamen Verbindungen.
Ich benötige eine sichere Speicherung und Zwischenspeicherung für meine git-Anmeldeinformationen, da ich regelmäßig mit 18 bis 20 Repositorys in einem Baum arbeite. Daher verwende ich den git-credential-gnome-Schlüsselring als git credential.helper, der über den libgnome-Schlüsselring kommuniziert zum gnome-keyring-daemon. Um Lösungen zu testen, habe ich einen PC mit einem Monitor eingerichtet, den auf dem System standardmäßig funktionierenden Schlüsselbund bestätigt und ihn dann mit SSH ausprobiert. Es funktioniert mit der X11-Weiterleitung, aber nicht ohne.

Wenn ich ohne X11-Weiterleitung verbunden bin, tritt der folgende Fehler auf, wenn der Schlüsselbund abgefragt wird und das Tool auf die Eingabeaufforderung in der Befehlszeile zurückgreift:

** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon

Untersuchungen haben ergeben, dass das Hauptproblem darin besteht, dass der Gnome-Keyring-Daemon erwartet, dass Verbindungen dbus verwenden, um mit ihm zu kommunizieren. Der dbus wird nicht gestartet, wenn keine X11-Sitzung vorhanden ist. Daher gibt es keinen gemeinsamen dbus-Bus für den Gnome-Keyring-Daemon und den Libgnome-Keyring, zu dem eine Verbindung hergestellt werden kann.

Ich habe zwei Lösungen gefunden, die andere zu diesem Problem gepostet haben, obwohl keine für mich richtig funktioniert.

  1. Rufen Sie einen DBUS-Port aus einer vorhandenen Sitzung ab, die X11 verwendet
  2. Starten Sie manuell einen neuen DBUS-Port

Beim Anschließen an einen vorhandenen DBUS-Port besteht das Basiskonzept darin, die PID einer vorhandenen Anmeldesitzung zu ermitteln, die Umgebung für diese PID aus dem procfs auszulesen, nach der zu suchen DBUS_SESSION_BUS_ADDRESSund in die aktuelle Umgebung zu exportieren. Da dies die Variable ist, die zum Veröffentlichen des DBUS-Busses verwendet wird, der von allen in den Sitzungen verwendeten Daten verwendet wird, sollte diese Einstellung ermöglichen, dass alle Daten in der Sitzung auf einem gemeinsamen DBUS-Bus kommunizieren, obwohl dies der Bus ist, der einer anderen Sitzung zugeordnet ist.
Quellen hier:
https://ubuntuforums.org/showthread.php?t=1059023

https://ask.fedoraproject.org/de/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- session /

Code wurde zu meiner .bashrc hinzugefügt, die bei der ssh-Anmeldung ausgeführt wird:

if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
    local myPID=`pgrep "(.*session|fluxbox)" | head -n1`
    if [ -n "$myPID" ] ; then
        local myVar=`cat /proc/${myPID}/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=" | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
        if [ -n "$myVar" ] ; then
            export DBUS_SESSION_BUS_ADDRESS=$myVar
        fi
    fi
fi

Die zweite Methode, DBUS für die Sitzung manuell zu starten, besteht dbus-launchdarin, eine neue Sitzung zu erstellen und die DBUS_SESSION_BUS_ADDRESSfür die Umgebung festzulegen. Anschließend wird der Gnome-Keyring-Daemon mit allen erforderlichen Diensten gestartet, damit die von uns erstellte DBUS-Busadresse angezeigt wird anstatt einer leeren Busadresse. Diese Lösung erfordert möglicherweise, dass der gnome-keyring-daemon so geändert wird, dass nur eine Instanz pro Sitzung und nicht eine Instanz pro System ausgeführt wird. Dies ist jedoch nicht klar.
Quellen:
Ab Nummer 8: https://support.wandisco.com/index.php?/Knowledgebase/Article/View/362/17/how-to-setup-encrypted-svn-password-storage-using-gnome- keyring-in-an-ssh-session

So ändern Sie die Exec-Zeile eines dbus-Dienstes, ohne die Änderungen bei einem Upgrade zu verlieren
Code, der zu meiner .bashrc hinzugefügt wurde und bei der ssh-Anmeldung ausgeführt wird:

# then DBUS wasn't started for this session and needs to be
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
    # start a new dbus session and make sure the variables are exported (automatic output)
    eval `dbus-launch --sh-syntax`

    # make sure gnome-keyring-daemon is using all the necessary components (it may not be by default)
    # Capture the output, which is a series of variable setting commands, one on eachline, and
    # export them while setting them
    while read -r LINE
    do
        export $LINE
    done <<< $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
fi

Beide Lösungen führen zu demselben Fehlerergebnis. Anstatt sofort den Fehler zu erzeugen, der darauf hinweist, dass der Gnome-Keyring-Daemon nicht kommuniziert werden kann, bleibt der Prozess eine Weile hängen und erzeugt dann die folgende Ausgabe:

Gkr-Message: secret service operation failed: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

** (process:31155): CRITICAL **: Error communicating with gnome-keyring-daemon

Ich bin nicht sicher, wie der Gnome-Keyring-Daemon mit DBUS interagiert, aber aus der zweiten Fehlermenge geht hervor, dass er nicht über einen neu erstellten DBUS-Bus oder über einen anderen DBUS-Bus prozessübergreifend erreichbar ist. Einige meiner Erkenntnisse legen nahe, dass der Gnome-Keyring-Daemon möglicherweise den DBUS benötigt, bevor er gestartet wird. Es ist jedoch unklar, ob dies für die Verwendung (libgnome-keyring) oder den Daemon der Fall ist.

Wie bekomme ich das zum Laufen?


in der tat muss die dbus- sitzung vor dem benutzerschlüsselbund (daemon) gestartet werden, auch wenn sie die x11-weiterleitung verwenden, verwenden sie den lokalen schlüsselbund, nicht den fernen ...
intika

Wie der erste Ansatz zeigte, habe ich die dbus-Sitzung gestartet, bevor der Keyring-Daemon gestartet wurde. Und wenn ich einen Befehl ausführe, der den Gnome-Key-Ring-Daemon auf meinem Remote-System verwendet, wird über den Socket $ DISPLAY eine Verbindung zu meinem Quellsystem hergestellt, um dort eine Verbindung zur dbus-Sitzung herzustellen? Das scheint äußerst unwahrscheinlich, aber ich weiß nicht genug darüber, um überhaupt nicht einverstanden zu sein. Dbus ist kein grafisches Tool, sondern ein prozessübergreifendes Kommunikationstool, das häufig von grafischen Anwendungen verwendet wird.
Mtalexan

Ich spucke nur hier herum, aber hast du versucht, mit xvfb eine xsession zu "fälschen"? Es könnte funktionieren, wenn Sie die DISPLAY-Variable ausführen (und die Initialisierung beenden) und exportieren, sodass dbus weiß, dass ein X-Server ausgeführt wird
TAAPSogeking,

Antworten:


0

Dies mag eine blöde Antwort sein ... aber der Gnome-Schlüsselbund benötigt Zugriff auf eine X11-Sitzung, zumindest um Sie zur Eingabe des Hauptschlüssels aufzufordern. Also ist es einfach unmöglich, es zum Laufen zu bringen ... oder?

EDIT: Vielleicht nicht das unmöglich. Siehe diesen Beitrag , sieht Ihrem Problem ähnlich:

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.