Speichern von Datein die "Root" gehören

Speichern von Datein die "Root" gehören

Beitragvon Reinhard » 22. Okt 2017, 09:05 Speichern von Datein die "Root" gehören

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 ?
Reinhard
 
Beiträge: 46
Registriert: 26. Sep 2008, 15:56

Beitragvon Mathias » 22. Okt 2017, 15:41 Re: Speichern von Datein die "Root" gehören

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 23. Okt 2017, 18:00 Re: Speichern von Datein die "Root" gehören

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
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Timm Thaler » 23. Okt 2017, 18:21 Re: Speichern von Datein die "Root" gehören

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?
Timm Thaler
 
Beiträge: 725
Registriert: 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
Nach oben

Beitragvon compmgmt » 23. Okt 2017, 18:40 Re: Speichern von Datein die "Root" gehören

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.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 312
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Warf » 24. Okt 2017, 01:52 Re: Speichern von Datein die "Root" gehören

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.
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •

Zurück zu Linux



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried