Linux, su mit Passwortübergabe

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Linux, su mit Passwortübergabe

Beitrag von six1 »

Hi,
Ich benötige den Auruf einer Shell mit su Rechten und Passwort Übergabe. SUDO ist keine Option!
Leider scheint das keineswegs trivial und ich bin mit Ansätzen aus dem Netz bisher gescheitert.
Kann mir dabei jemand weiterhelfen?

Also etwas in dieser Art, wobei ich weiß das su in einer Shell laufen muss und diese spawnt...
echo <password> | su -c whoami
Obiges funktioniert natürlich nicht bei Aufruf von runcommand und soll nur die Aufgabe darstellen...

Schonmal Danke fürs Lesen...
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Linux, su mit Passwortübergabe

Beitrag von af0815 »

six1 hat geschrieben: Fr 25. Okt 2024, 09:30 Obiges funktioniert natürlich nicht bei Aufruf von runcommand und soll nur die Aufgabe darstellen...
Krücke, die ich kenne, mit runncommand ein Scriptaufrufen, das eine (volle) Bash mit dem Script aufruft, was die höhere Rechte vergibt.
Ev. kann man was mit den Capabilities zusätzlich hintricksen.
#!/bin/bash
PASSWD="ToPsEcReT"
echo -e $PASSWD | sudo -S setcap CAP_NET_RAW,CAP_SYS_TIME,CAP_NET_BROADCAST,CAP_NET_BIND_SERVICE,CAP_FOWNER,CAP_IPC_OWNER,CAP_SYS_RAWIO=+ep /home/xx/data/prg
/home/xx/data/prg
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

Hi af0815,
Mein sudo ist wegen sudoers Eintrag nicht berechtigt die von mir benötigte Aktion auszuführen. Es muss also su sein! Ich habe natürlich su Rechte und zugehörigem Passwort! ...also nichts böses im Sinn :wink:

Nur meine Software muss bei Bedarf etwas mit su Rechten im Hintergrund erledigen...
Aber schon mal Danke für deinen Lösungsvorschlag
Gruß, Michael

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Linux, su mit Passwortübergabe

Beitrag von Warf »

Su ist dafür einfach nicht gemacht. Es gibt zwar workarounds wie den script commands, aber wirklich schön ist was anderes.

Das gesagt, du kannst natürlich auch einfach dein eigenes sudo artige Programm für deinen Aufruf bauen. Am Ende ist su und sudo auch nur ein ganz normales Programm bei dem das stuid Bit gesetzt ist

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Linux, su mit Passwortübergabe

Beitrag von af0815 »

Mein eigentlicher Punkt war - rufe eine volle Bash mit runncomand auf. Dort geht dann dein Script.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 376
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Linux, su mit Passwortübergabe

Beitrag von Zvoni »

Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

@af0815 -> jjjjaaaa... script aus Programm usw... ich zögere noch :lol:
@zvoni -> dafür müsste ich noch externe Programme nachinstallieren.... wofür ich su brauche? :mrgreen:

Aber im Moment habe ich es, so glaube ich im Moment!, am Laufen!

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  outputstr:string;
begin
    Memo1.Clear;
    Runcommand('/bin/sh',['-c','echo ''<MyPassword>''  | sudo -S -u root  whoami'],outputstr,[postderrtooutput]);
    Memo1.lines.add(outputstr);
end;

gibt root aus!!!
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Linux, su mit Passwortübergabe

Beitrag von af0815 »

Dein Button1 macht genau das was ich gemeint habe. :D

Sieht ja recht einfach aus, wenn man die Lösung hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

...ich bin noch am Testen... noch ist die Schlacht nicht gewonnen :lol:
Es ist immer das Eine, was mein Entwicklungssystem macht, aber etwas ganz anderes, was ein Produktivclient macht :lol:
Gruß, Michael

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Linux, su mit Passwortübergabe

Beitrag von Warf »

Mit sudo vernünftig über STDIN zu interagieren ist tatsächlich gar nicht mal so einfach. Beginnen wir mal mit deinem Beispiel:

Code: Alles auswählen

Runcommand('/bin/sh',['-c','echo ''<MyPassword>''  | sudo -S -u root  whoami'],outputstr,[postderrtooutput]);
Woher bekommst du MyPassword? Wenns aus einer Nutzereingabe ist, dann kann ich einfach

Code: Alles auswählen

'; rm -rf ~
eintippen und hab den Nutzerordner geschrottet. Du solltest versuchen immer zu vermeiden die Shell (oder irgendenen anderen voll funktionsfähigen Interpreter) mit Nutzerinput aufzurufen. Selbst wenn du den Input gegen ' checkst, darf ich an die Shellshock vulnerability erinnern bei der eine bestimmte Kombination aus zeichen bash so verwirrt hat das man beliebigen code ausführen konnte.

Selbst wenn du das Problem löst, hast du immernoch das Problem mit Robustem Fehlerhandling. Nimm das folgende Beispiel:

Code: Alles auswählen

echo foo | sudo -S false
false als kommand failed immer (exit code <> 0). Woher kann das Programm also wissen ob das Passwort falsch war oder einfach der command gefailed hat? Man muss den output parsen. Der Output von sudo ist in dem Fall:

Code: Alles auswählen

<pwd>Das hat nicht funktioniert, bitte nochmal probieren.
<pwd>
sudo: Es wurde kein Passwort angegeben
sudo: 1 Fehlversuch bei der Passwort-Eingabe
Das ist Fließtext und noch schlimmer, Übersetzter Fließtext. Den stabil zu erkennen kann ein echtes Problem werden.

Normalerweise ist daher die Lösung einfach das Sudo Askpass zu benutzen. Daher die Frage was genau willst du erreichen?
Wenn du nur willst das der Nutzer sein Passwort im GUI eintippt, kannst du einfach ein simples Lazarus Programm bauen was eine Form startet mit einem Feld für das Passwort, und dieses dann über den -A Parameter dem sudo command zu übergeben.

Wenn das Passwort unbedingt von deinem Programm übergeben werden soll, z.B. weil dein Programm das Passwort für mehrere Befehle cached oder (Gott bewahre) speichert, dann wirds zwar auch kompliziert, aber ist trozdem machbar, du kannst einfach ein automatisiertes Askpass programm bereitstellen das z.B. über eine FIFO das passwort aus deinem Programm lädt.

Alles in allem ist das eher der Weg den du gehen solltest statt zu versuchen Multilinguale Konsolenausgaben zu parsen. Denn genau dafür gibt es den -A parameter

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

Danke für die ausführliche Erklärung Warf!
Es ist relativ simpel:
Die Software beinhaltet das Passwort, kann also selbstständig die nötigen Änderungen durchführen.
Es ist also keine Usereingabe notwendig!

Ich habe mich auch zu früh gefreut... auf meinem Entwicklungssystem sind leider abweichende Einstellungen der sudoers und auch ander User.

Mein Beispiel:
Runcommand('/bin/sh',['-c','echo ''<MyPassword>'' | sudo -S -u root whoami'],outputstr,[postderrtooutput]);

verlangt die Eingabe des Passwort des angemeldeten User und NICHT das Passwort für su

Ich benötige aber die Ausführung eines Kommandos unter su mit übergebenem Passwort.... das trifft es wohl
Gruß, Michael

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Linux, su mit Passwortübergabe

Beitrag von Warf »

Was du tun kannst, und ACHTUNG GEFÄHRLICH!!!! aber Grundsätzlich möglich.
Teil deine Anwendung auf in die Hauptanwendung und dann die sachen die als Root ausgeführt werden sollen.
Die anwendung die als root ausgeführt werden soll, setzt du als owner root und setzt das set-uid flag:

Code: Alles auswählen

# Als root ausführen
chown root:root myapp
chmod u+s myapp
Jetzt wird deine app "myapp" immer als root ausgeführt, egal wer sie aufruft. So funktionieren übrigens auch sudo und su.

Dann ruft deine Hauptanwendung deine root anwendung ("myapp" im beispiel oben) einfach via runcommand auf, und deine root anwendung kann dann machen was notwendig ist als root.

Das bedeutet du brauchst nur bei der installation einmal root rechte umd das setuid bit für root zu setzen, und danach brauchst du weder passwort noch su

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

Hallo Warf,
ich habe das mal umgesetzt.
Die neue App, welche Änderungen vornehmen soll heißt "helper".
Hier die Berechtigungen der App:
Screenshot 2024-10-26 065406.png
Screenshot 2024-10-26 065406.png (59.4 KiB) 2925 mal betrachtet
Im Programm wird ausgeführt:

Code: Alles auswählen

Runcommand('/bin/sh',['-c','whoami'],outputstr,[postderrtooutput]);
  writeln( outputstr);                                            
Nennen wir den normalen User am Zielsystem mal UserA.

UserA startet die App. Die Ausgabe ist: UserA

Hier hätte ich jetzt root erwartet, oder? Was habe ich noch nicht verstanden?
Die Rechte werden nicht delegiert :(

Hier der Code der App "helper"

Code: Alles auswählen

program helper;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes, SysUtils, CustApp, Process
  { you can add units after this };

type

  { cpHelper }

  cpHelper = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;

{ cpHelper }

procedure cpHelper.DoRun;
var
  ErrorMsg, outputstr: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h', 'help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h', 'help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

  Runcommand('/bin/sh',['-c','whoami'],outputstr,[postderrtooutput]);
  writeln( outputstr);


  // stop program loop
  Terminate;
end;

constructor cpHelper.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

destructor cpHelper.Destroy;
begin
  inherited Destroy;
end;

procedure cpHelper.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ', ExeName, ' -h');
end;

var
  Application: cpHelper;
begin
  Application:=cpHelper.Create(nil);
  Application.Title:='cpHelper';
  Application.Run;
  Application.Free;
end.          
Gruß, Michael

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Linux, su mit Passwortübergabe

Beitrag von Warf »

Was sagt denn ls -l? Wenn du das chmod u+s gemacht hast sollte da in den Zugriffsberechtigungen ein "s" stehen (so wie auch bei sudo executable)

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: Linux, su mit Passwortübergabe

Beitrag von six1 »

sieht OK aus für mich...
Screenshot 2024-10-26 113836.png
Screenshot 2024-10-26 113836.png (6.76 KiB) 2893 mal betrachtet
Gruß, Michael

Antworten