Ist es möglich, sshd als normaler Benutzer auszuführen?

39

Ich möchte eine zweite sshdInstanz auf einem nicht privilegierten Port (z. B. 2222) mit meiner eigenen Konfigurationsdatei starten .

Offensichtlich sshdist es nicht möglich setuid, sich als Benutzer anzumelden, die nicht den sshdDaemon ausführen.

Ist es jedoch möglich, einen funktionierenden sshdDaemon zu haben , der für den aktuell ausgeführten Benutzer funktioniert? Für meinen Anwendungsfall wäre dies in Ordnung.

Ich habe versucht, eine sshdInstanz mit meiner eigenen Konfigurationsdatei und meinem Hostschlüssel zu booten, und der sshdProzess wird gestartet (keine Beschwerden, dass ich nicht root bin, wie bei einigen Befehlen). Wenn ich jedoch versuche, eine Verbindung zu diesem Port herzustellen, wird der sshdProzess abgebrochen.

$ /usr/sbin/sshd -dD -h .ssh/id_rsa -p 2222 
debug1: sshd version OpenSSH_5.6p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: setgroups() failed: Operation not permitted
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-dD'
debug1: rexec_argv[2]='-h'
debug1: rexec_argv[3]='.ssh/id_rsa'
debug1: rexec_argv[4]='-p'
debug1: rexec_argv[5]='2222'
debug1: Bind to port 2222 on 0.0.0.0.
Server listening on 0.0.0.0 port 2222.
debug1: Bind to port 2222 on ::.
Server listening on :: port 2222.
debug1: fd 6 clearing O_NONBLOCK
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 6 out 6 newsock 6 pipe -1 sock 9
debug1: inetd sockets after dupping: 5, 5
Connection from ::1 port 57670
debug1: Client protocol version 2.0; client software version OpenSSH_5.6
debug1: match: OpenSSH_5.6 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.6
debug1: list_hostkey_types: 
No supported key exchange algorithms
debug1: do_cleanup
debug1: do_cleanup
debug1: audit_event: unhandled event 12

Die debug1: setgroups() failed: Operation not permittedLinie ragt offensichtlich heraus, stirbt aber erst, wenn versucht wird, eine Verbindung zu akzeptieren.

Bo Jeanes
quelle

Antworten:

35

Nachdem ich ein bisschen herumgebuddelt hatte, fand ich es heraus.

Beginnen Sie den Vorgang mit der sshd -f ~/.ssh/sshd_configPosition /.ssh/sshd_configeiner neuen Datei, die Sie erstellt haben. Unter anderen Optionen (z. B. ein anderer Hostschlüssel, ein anderer Port usw.) müssen Sie die Leitung hinzufügen UsePrivilegeSeparation no. Auf diese Weise wird verhindert, dass der sshdProzess versucht, einen setuidoder setgidmehrere Anrufe auszuführen, und er kann weiterhin als Benutzer ausgeführt werden und Verbindungen als Benutzer akzeptieren.

BEARBEITEN: Ein paar Momente nachdem ich herausgefunden hatte, dass jemand anderes mir diesen Link getwittert hat, der bestätigt, dass dies der richtige Weg ist, dies zu tun: http://cygwin.com/ml/cygwin/2008-04/msg00363.html

Bo Jeanes
quelle
1
Sie könnten auch durch Einstellung deaktivieren PAM müssen UsePamzu no.
haridsv
@bjeanes funktioniert es bei dir? Können Sie Ihre sshd_config-Datei freigeben? "Set" ist kein gültiger Befehl für mich, wenn ich Ubuntu anprobiere.
Jojo
@jojo Ich führe diese Konfiguration nicht aus, daher muss ich keine Datei freigeben. Sie müssen mit einer bekannten Arbeitsdatei beginnen und sich an Ihre Bedürfnisse anpassen.
Bo Jeanes
1
Das Deaktivieren von PAM ist nur für bestimmte Fälle. Funktioniert für mich auf Fedora, ohne die Pam-Einstellungen zu verändern. In der verknüpften E-Mail-Nachricht in der Antwort finden Sie weitere Vorschläge, was Sie sonst noch ändern müssen, um alles in Ordnung zu bringen. Ich werde in Kürze meine Notizen aktualisieren, wie ich es für Docker gemacht habe: hub.docker.com/r/aosqe/ssh-git-server (bitte erlauben Sie ein paar Tage, bevor Sie es lesen)
akostadinov
6

Als Update für diesen Thread hat OpenSSH in Version 7.5 die Option UsePrivilegeSeparation verworfen, sodass die Trennung von Berechtigungen nicht mehr deaktiviert werden kann. Es scheint, dass es jetzt unmöglich ist, SSHD als Benutzer auszuführen.

Siehe https://www.openssh.com/releasenotes.html

Zauberlaterne
quelle
Abhängig von der Serverkonfiguration ist dies möglicherweise nicht der Fall. Ich habe kein Problem damit, sshd als normalen Benutzer auszuführen, während ich in meiner sshd-Konfigurationsdatei "UsePrivilegeSeparation yes" oder "UsePrivilegeSeparation sandbox" anzeige.
A3NM
Nun, ich habe es noch nicht ausprobiert, aber ich denke, das ist jetzt "behoben": "sshd (8): Wenn es ohne Root-Berechtigungen gestartet wird, muss kein Benutzer oder Pfad für die Trennung von Berechtigungen vorhanden sein. Dies erleichtert das Ausführen der Regressionstests ohne das Dateisystem zu berühren. "
Daniel Santos
2

Ich habe die Möglichkeit, den sshd-Dienst als normaler Benutzer auszuführen, eingehend geprüft. Detail der Programmversion:

SSHD-Version OpenSSH_7.4, OpenSSL 1.0.2k

Nachdem ich viele Fehler behoben hatte, kam ich zu einem Punkt, an dem SSHD mit dem folgenden Fehler abgebrochen wurde:

Versuch, Anmeldedatensätze von Nicht-Root-Benutzern zu schreiben (Abbruch)

Ich habe den Quellcode überprüft, um festzustellen, ob es möglich ist, das Problem zu beheben, ohne den Quellcode zu ändern. Sehen Sie den Code hier . Ein Teil des Codes verursacht einen Programmabbruch:

#ifndef HAVE_CYGWIN
    if (geteuid() != 0) {
        logit("Attempt to write login records by non-root user (aborting)");
        return (1);
    }
#endif

Es prüft die Benutzerrechte nach (geteuid() != 0)und verursacht hier das Problem.

Mehrdad Nazmdar
quelle
1

Unter der Annahme, dass @magiclantern oben erwähnt wurde und Sie nicht patchen möchten, funktioniert sshdso etwas wie Dropbear für Sie? Es wird in vielen eingebetteten Geräten verwendet, die einen SSH-Server mit geringerem Platzbedarf (und weniger Funktionen / Konfigurationen) wünschen.

nhed
quelle
1
dropbear -E -F -R -w -g -a -p 2222 -P ./dbearPID # macht den Trick
Dotbit
1

Hier ist ein Userland-Bash-Skript, das auf der Antwort von Bo Jeanes basiert:

  • Erstellen Sie ein Arbeitsverzeichnis zu Hause
  • Generieren Sie Serverschlüssel im Arbeitsverzeichnis
  • Generieren Sie eine grundlegende Konfigurationsdatei mit der PID-Datei im Arbeitsverzeichnis
  • Starten Sie den SSH-Daemon

mkdir ${HOME}/custom_ssh
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa
echo "Port 2222
HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
AuthorizedKeysFile  .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
Subsystem   sftp    /usr/lib/ssh/sftp-server
PidFile ${HOME}/custom_ssh/sshd.pid" > ${HOME}/custom_ssh/sshd_config
/usr/bin/sshd -f ${HOME}/custom_ssh/sshd_config
echo "
--------
Process ID : ${HOME}/custom_ssh/sshd.pid
-------"
  • OpenSSH_7.9p1, OpenSSL 1.1.1a, 20. November 2018
  • pam auth (getestet mit demselben lokalen und entfernten Benutzer)
inattendu
quelle
Ich sehe immer noch: "debug1: setgroups () fehlgeschlagen: Operation nicht erlaubt"
dotbit
Gute Lösung, aber Sie sollten Befehle besser aussehen lassen. Hässlich.
MAChitgarha