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 ?
Speichern von Datein die "Root" gehören
-
- Beiträge: 6194
- 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
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.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 ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
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:
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
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
-
- 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
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?
-
- 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
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);
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
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 . 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.