Speichern von Datein die "Root" gehören

Antworten
Reinhard
Beiträge: 46
Registriert: Fr 26. Sep 2008, 16:56

Speichern von Datein die "Root" gehören

Beitrag von Reinhard »

Hallo,

Wie kann ich einen Teil des Programmcodes (welches eine Datei speichert) Systemadminstaror Rechte (Root Rechte) verleihen so dass man eine Datei speichern/laden kann die für den gegenwärtigen benutzer nicht zu öffnen/speichern ist ?

Bisher ist das alles realativ einfach gewesen, programm mittels "sudo" soder andern kdesudo/gksudo gestartet passwort eingeben und fertig.

Jetzt mit diesen Wayland zeugs und den root verboten modus wird das ja nicht mehr funktionieren, da muss man das policykit zeugs fragen, es gibt zwar die möglichkeit "pkexec" was so in der art die kdesudo ist,
erfordert dann aber ein eigenständiges programm was die Daten schreibt/liest und die müssen dann wieder erst in das aufzurufende programm übernommen werden.

Gibt es keine Möglichkeit gleich innerhalb des Programmes nach erhöten Benutzerrechten zu fragen ? und dann nur den "Laden/Speichern" Teil des Progrmmes zu ermöglichen auf die Datei zuzugriefen ?

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Speichern von Datein die "Root" gehören

Beitrag von Mathias »

Gibt es keine Möglichkeit gleich innerhalb des Programmes nach erhöten Benutzerrechten zu fragen ? und dann nur den "Laden/Speichern" Teil des Progrmmes zu ermöglichen auf die Datei zuzugriefen ?
Gehen tut dies auf jeden Fall, nur weis ich leider nicht wie dies geht. Es gibt viele Programm unter Linux, welche erst zur Laufzeit mach dem Root-Passwort fragen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Speichern von Datein die "Root" gehören

Beitrag von Warf »

Mach es doch ganz einfach, verwende cat und echo mit sudo. Somit wird das laden und Speichern von separaten Programmen übernommen die Root berechtigung haben, ohne das dein Programm selbst diese Rechte braucht. Einfaches Beispiel:

Code: Alles auswählen

var filecontent: String;
...
if RunCommand('sudo cat /Path/to/File', FileContent) then // laden
  WriteLn(FileContent);
...
//Schreiben
if Not RunCommand('sudo echo ''' + FileContent + ''' > /path/to/file') then
  raise Exception.Create('Something went wrong');


Oder du schreibst den inhalt in Dateien des Users, und cp'st sie dann mit sudo.

PS: es kann sein das bei RunCommand der volle Pfad angegeben werden muss, also /usr/bin/sudo
Ich habe es nicht getestet

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Speichern von Datein die "Root" gehören

Beitrag von Timm Thaler »

Warf hat geschrieben:Mach es doch ganz einfach, verwende cat und echo mit sudo.....


Sollte es wirklich so einfach sein, unter Linux Adminrechte zu bekommen? Was hindert mich denn dann daran, zwei Programme zu schreiben, von denen das eine mit Userrechten läuft und welches das andere über sudo mit Adminrechte, aufruft?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Speichern von Datein die "Root" gehören

Beitrag von compmgmt »

Oder man schreibt sich einen daemon, der im Hintergrund läuft und mit dem Userprogramm kommunizieren kann. Das kann allerdings zu einem riesigen Sicherheitsproblem werden, wenn man keine sichere Authentifizierung und/oder Verschlüsselung benutzt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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

Re: Speichern von Datein die "Root" gehören

Beitrag von Warf »

Timm Thaler hat geschrieben:
Warf hat geschrieben:Mach es doch ganz einfach, verwende cat und echo mit sudo.....


Sollte es wirklich so einfach sein, unter Linux Adminrechte zu bekommen? Was hindert mich denn dann daran, zwei Programme zu schreiben, von denen das eine mit Userrechten läuft und welches das andere über sudo mit Adminrechte, aufruft?


Die Tatsache das man das Passwort eingeben muss :D. Um das zu umgehen würde ich eine neue Nutzergruppe erstellen, dieser sudo rechte ohne passwortabfrage für cat und echo geben (sudoes eintrag: %gruppenname ALL = (ALL) NOPASSWD:/usr/bin/cat, /usr/bin/echo) und dem Nutzer der dein Programm ausführt dann diese Gruppe zuweisen. Ansonsten musst du Sudo ein Passwort übergeben. Am einfachsten geht das über das Argument -A, wenn die Umgebungsvariable SUDO_ASKPASS auf ein Programm setzt welches das Passwort abfragt, und dieses dann in STDOut schreibst.

Code: Alles auswählen

RunCommand('/bin/bash -c ''SUDO_ASKPASS="/Some/Path/To/askpass" && sudo -A cat /file/toRead''', FileContent)

Akspass könnte z.B. einfach ein bash script sein echo rootpw, könnte aber auch ein GUI programm sein was den User nach einem Passwort fragt. Die beste möglichkeit wäre aber wohl ein shell script welches eine FiFo erstellt in die du dann aus deinem Hauptprogramm das Passwort reinschreibst, welche dann vom Script gelesen wird und via echo an sudo gegeben wird. Somit bleibt die Passwortabfrage (und eventuelles caching des passworts) vollständig im Rahmen deines Hauptprogrammes

Ansonsten könntest du die TProcess Klasse verwenden und das Passwort einfach in dem aufrufenden Programm in den STDIn von sudo schreiben sobald es danach fragt. Das dürfte normalerweise auch kein Problem sein, und erfordert kein separates Programm.

compmgmt hat geschrieben:Oder man schreibt sich einen daemon, der im Hintergrund läuft und mit dem Userprogramm kommunizieren kann. Das kann allerdings zu einem riesigen Sicherheitsproblem werden, wenn man keine sichere Authentifizierung und/oder Verschlüsselung benutzt.


Auch das kann man mit dem Unix Berechtigungsystem lösen. Der Daemon erstellt eine socket zur kommunikation. Da ein Socket auch nur eine Datei ist einfach die berechtigungen so setzen das nur der richtige User/Gruppe rw rechte darauf haben, und tada Verschlüsselung wird überflüssig, da um den Daemon zu exploiten das Nutzerpasswort benötigt wird.

Antworten