Pi remote herunter fahren ohne Passwort

  • Hallo zusammen,

    viellicht kann mir ja jemand auf die Sprünge helfen, auch wenn ich eigentlich einen Banana Pi Pro mit Lubuntu drauf habe,
    glaube aber, dass das für dieses Problem irrelevant ist.

    Ich möchte auf meinem normalen Desktop-Rechner (Xubuntu) ein Script erstellen, damit der Pi beim herunterfahren des Desktop-Rechners automatisch mit herunter gefahren wird.

    Der Befehl dazu soll via:

    Code
    ssh 192.168.0.5 -l -t piuser "sudo poweroff"

    an den Pi übergeben werden.
    Ein Login-Passwort wird dabei nicht abgefragt, weil bereits ssh-Zertifikate eingerichtet sind.
    Da sudo aber ein Passwort verlangt (und ich dieses eben nicht jedes mal eingeben wil), habe ich in /etc/sudoers zusätzliche Nutzerprivilegien für piuser analog zu:

    Code
    # User alias specification
    User_Alias ABSCHALTER = otto, anna, berta
    
    
    # Cmnd alias specification
    Cmnd_Alias DOWN = /sbin/shutdown, /sbin/halt, /sbin/reboot
    
    
    # User privilege specification
    ABSCHALTER ALL = NOPASSWD: DOWN

    (https://wiki.ubuntuusers.de/Herunterfahren/)

    eingefügt.
    Das kuriose Ergebnis ist, dass, wenn ich mich über ssh auf den Pi einlogge, und dann als piuser "sudo poweroff" eingebe, der Pi wie gewollt herunterfährt, ohne nach einem PW zu fragen.
    Sende ich den Befehl aber wie oben beschrieben, verlangt er ein Passwort. Kann mir dieses Verhalten nicht erklären.
    Hat vlt. jemand eine Ahnung, woran das liegt?

    vielen Dank schon mal.

  • Hallo llutz,

    das ging ja schnell.
    Folgendes sagt er dazu:

    Code
    Matching Defaults entries for piuser on lemaker:
        env_reset, mail_badpass,
       secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
    
    
    User piuser may run the following commands on lemaker:
       (ALL) NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff
       (ALL : ALL) ALL
  • Der von Dir via sudoers freigegebene Cmnd_Alias gibt nur die Befehle "shutdown", "halt" und "reboot" frei, du verwendest aber "poweroff" - das wird so also nicht funktionieren :fies:

    Code
    # Cmnd alias specification
    Cmnd_Alias DOWN = /sbin/shutdown, /sbin/halt, /sbin/reboot
    
    
    # User privilege specification
    ABSCHALTER ALL = NOPASSWD: DOWN

    Du musst dann also einen der Cmnd_Alias Befehle nutzen:

    Code
    ssh 192.168.0.5 -l -t piuser "sudo shutdown -h now"


    Oder du erweiterst das:

    Code
    Cmnd_Alias DOWN = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/poweroff

    und nutzt dann wie bisher auch: ssh 192.168.0.5 -l -t piuser "sudo poweroff"

  • Hallo meigrafd,

    das war vlt. nicht gang eindeutig. Der Code-Schippsel in meinem ersten Post ist direkt von wiki.ubuntuusers.de kopiert. Ich hab die Einträge natürlich angepasst, wie dus ja auch beschrieben hast (siehe mein letzter Post).
    Wenn ich via ssh als piuser auf dem pi angemeldet bin, funktioniert es schließlich auch.

    Das wär ja zu einfach gewesen ;) .


  • Hallo llutz,

    das ging ja schnell.
    Folgendes sagt er dazu:

    Code
    Matching Defaults entries for piuser on lemaker:
       env_reset, mail_badpass,
       secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
    
    
    User piuser may run the following commands on lemaker:
       (ALL) NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff
       (ALL : ALL) ALL

    Deine NOPASSWD Zeile in sudoers muss nach der (ALL:ALL) ALL kommen, sonst gilt (ALL:ALL) ALL. Der letzte Eintrag gilt!
    Checke mal die Reihenfolge

    Aus 'man sudoers':
    ".. When multiple entries match for a user, they are applied in order. Where there are multiple matches, the last
    match is used (which is not necessarily the most specific match)..."

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (14. Juni 2016 um 09:45)

  • Hallo llutz, :danke_ATDE:
    das wars. Ich hab diese Zeile nun ans Ende der Datei gepackt.
    Finde es zwar komisch, dass es in der Datei eine "Rubrik" # User privilege specification gibt, und man doch ans Ende der Datei schreiben muss, aber wenigstens funktioniert es jetzt.


  • Hallo llutz, :danke_ATDE:
    das wars. Ich hab diese Zeile nun ans Ende der Datei gepackt.
    Finde es zwar komisch, dass es in der Datei eine "Rubrik" # User privilege specification gibt, und man doch ans Ende der Datei schreiben muss, aber wenigstens funktioniert es jetzt.

    Es hätte mit dem Eintrag unter "User privs..." geklappt, wenn Dein User nicht auch noch Mitglied einer Gruppe wäre, die halt erst anschliessend definiert wird :)
    Mach Dir nichts draus, in die Falle sind schon viele getappt.

    Gruß

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Kann den Thread leider noch nicht auf "erledigt" setzen.

    Nachdem ich die oben erwähnte Änderung in der Sudoers-Datei durchgeführt habe, kann ich den Pi zwar remote über die Shell herunter fahren,

    Wenn ich den selben Befehl aber in ein Script packe und ausführe, fragt er wieder nach dem piuser-Passwort.

    Durch herum probieren bin ich nun darauf gekommen, dass das Script ja als superuser ausgeführt wird, da es in /etc/init.d liegt, und sudo kein gültiges Zertifikat für die ssh-Verbindung besitzt.

    Hat vlt. jemand eine Idee, wie man den Konflikt lösen könnte? :s

  • Hallo Manul,

    Jetzt verlangt er zwar kein PW mehr, dafür aber die SSH-Passphrase für den Desktop-User. Dabei kann ich mich als Desktop-User außerhalb des Scripts problemlos über ssh auf den pi einloggen, ohne die Passwortphrase einzugeben.
    Scheinbar macht er da einen Unterschied, wenn sudo einen befehl als Desktop-User ausführen will.

    Die einzige Lösung, die mir einfäll, wäre, ein neues Schlüsselpaar ohne Passphrase zu erstellen. So richtig gefällt mir das aber nicht, da ja überall davon abgeraten wird.


  • Dabei kann ich mich als Desktop-User außerhalb des Scripts problemlos über ssh auf den pi einloggen, ohne die Passwortphrase einzugeben.

    Das geht aber nur, wenn Du die Passphrase vorher einmal eingegeben hast, damit ssh-agent Deinen privaten Schlüssel einlesen konnte. Die Verbindung zum ssh-agent musst Du Deinem Skript mitgeben. Das geht über die Environmentvariable SSH_AUTH_SOCK. Schau doch mal in die man page zu ssh-agent, da ist das erklärt.

  • Die einzige Lösung, die mir einfäll, wäre, ein neues Schlüsselpaar ohne Passphrase zu erstellen. So richtig gefällt mir das aber nicht, da ja überall davon abgeraten wird.

    Nimm einen ssh-Key ohne Passphrase und diesen Key dann mit forced-command so einschränken, dass nur dein gewünschter Befehl/oder ein Set von befehlen ausgeführt werden kann.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Also die zweite Variante mit den forced comands gefällt mir irgendwie besser.
    Auf die Weise bin ich nicht genötigt, die Passphrase überhaupt einzugeben. Ich will mich ja garn nicht immer über die shell auf dem Pi einloggen, wenn er an ist.

    Ich werde das später mal ausprobieren, aber noch eine Verständnisfrage: Ich muss diesen forced command direkt in die Datei mit dem privaten Schlüssel schreiben?

    So habe ich das zumindest in dieser Beschreibung verstanden (habs nur kurz überflogen, muss gleich nochmal los ;) :

    https://binblog.info/2008/10/20/ope…orced-commands/

    Zitat

    Here’s what a full entry from ~/.ssh/authorized_keys might look like:
    command="/bin/ps -ef",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAp0KMipajKK468mfihpZHqmrMk8w+PmzTnJrZUFYZZNmLkRk+icn+m71DdEHmza2cSf9WdiK7TGibGjZTE/Ez0IEhYRj5RM3dKkfYqitKTKlxVhXNda7az6VqAJ/jtaBXAMTjHeD82xlFoghLZOMkScTdWmu47FyVkv/IM1GjgX/I8s4307ds1M+sICyDUmgxUQyNF3UnAduPn1m8ux3V8/xAqPF+bRuFlB0fbiAEsSu4+AkvfX7ggriBONBR6eFexOvRTBWtriHsCybvd6tOpJHN8JYZLxCRYHOGX+sY+YGE4iIePKVf2H54kS5UlpC/fnWgaHbmu/XsGYjYrAFnVw== Test key
    This is quite nice: We have successfully limited this user to requesting a process list.


  • Ich werde das später mal ausprobieren, aber noch eine Verständnisfrage: Ich muss diesen forced command direkt in die Datei mit dem privaten Schlüssel schreiben?


    Direkt in den key in ~/.ssh/authorized_keys (das ist der pub-key, den du mittels ssh-copy-id auf den Host kopiert hast. Nicht der priv)

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (15. Juni 2016 um 19:03)

  • Nein. In die "authorized_keys", in die ansonsten noch der öffentliche Schlüssel kommt. Der private bleibt, nun ja, privat. ;)

    Und ja, ich finde das auch die bessere Lösung - kannte diese Möglichkeit noch gar nicht.

  • Sorry, aber ich muss noch Mal nachfragen, bevor ich mich vom Pi aussperre.
    Wenn ich nun ein weiteres Schlüsselpaar ohne Passphrase, dafür aber mit forced commands anlege,
    woher weiß ssh beim nächsten Login-Versuch über die Shell, welcher der beiden Schlüssel verwendet werden soll, denn letztendlich liegen ja beide privaten Schlüssel in ~/.ssh/ .
    Kann man überhaupt zwei private SSH-Schlüssel anlegen? Ich meine, die hätten ja dann den selben Namen im selben Verzeichnis.
    Ich hab es so verstanden, dass man nur einen priv. Key anlegt, und dann den öffentl. an alle verteilt, auf die man zugreifen will.

    Noch eine kleine Zusatzfrage: Ist es normal, dass ich nach jedem Neustart des Desktop-PC die Passphrase erneut eingeben muss? Merkt sich der ssh-Agent die denn nicht?


  • Sorry, aber ich muss noch Mal nachfragen, bevor ich mich vom Pi aussperre.
    Wenn ich nun ein weiteres Schlüsselpaar ohne Passphrase, dafür aber mit forced commands anlege,
    woher weiß ssh beim nächsten Login-Versuch über die Shell, welcher der beiden Schlüssel verwendet werden soll, denn letztendlich liegen ja beide privaten Schlüssel in ~/.ssh/ .
    Kann man überhaupt zwei private SSH-Schlüssel anlegen? Ich meine, die hätten ja dann den selben Namen im selben Verzeichnis.
    Ich hab es so verstanden, dass man nur einen priv. Key anlegt, und dann den öffentl. an alle verteilt, auf die man zugreifen will.

    Noch eine kleine Zusatzfrage: Ist es normal, dass ich nach jedem Neustart des Desktop-PC die Passphrase erneut eingeben muss? Merkt sich der ssh-Agent die denn nicht?


    Ich empfehle dir die Lektüre von:
    "man ssh"
    "man ssh-keygen"

    Du legst einen neuen Key mit neuem Namen an (z.B. id_poweroff), dem ssh-Befehl sagst du, dass dieser Key benutzt werden soll ( ssh -i id_poweroff ...). Damit du das Ganze nicht ewig tippen/beachten musst, kannst du es auch in ~/.ssh/config festlegen (noch 'ne man-page: "man ssh_config").

    Wenn du nichts zu sagen hast, sag einfach nichts.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!