Frage

Ich entwickle eine Anwendung, die verwaltet Netzwerk-Schnittstellen auf den Namen des Benutzers, und ruft Sie auf, um mehrere externe Programme (wie ifconfig), erfordert root änderungen vornehmen.(Insbesondere bei änderung der IP-Adresse einer lokalen Schnittstelle, etc.) Während der Entwicklung habe ich schon laufen der IDE als root (ugh), und der debugger als root (Doppel-pfui).Ist es ein netter Weg für die Ende-Benutzer zu führen diese unter einem nicht-root-Konto?Ich habe eine starke Abneigung gegen die Größe der Angriffsfläche präsentiert von GTK, wxPython, Python, und meine Anwendung, wenn es als root läuft.

Ich habe mir in Fähigkeiten, aber Sie sehen aus halb gebacken und ich bin mir nicht sicher, ob ich in der Lage sein, Sie zu benutzen in Python, vor allem, wenn Sie auf thread-basis.Die einzige option, die ich noch nicht erforscht ist ein daemon, der hat das setuid-bit gesetzt und alle root-Typ Zeug auf den Namen der UI.Ich bin zögerlich einführen, die Komplexität in der Anfangsphase des Projekts, wie als root läuft nicht ein dealbreaker für die Benutzer.

War es hilfreich?

Lösung

Ihre Idee über den Dämon hat viel Verdienst, trotz der Komplexität es einführt. Solange die Aktionen einige Benutzeroberfläche Interaktion erfordern keine als root , ein Daemon können Sie steuern, welche Vorgänge erlaubt und nicht erlaubt.

Sie können jedoch SUDO verwenden, um einen kontrollierten Kompromiss zwischen ROOT und normale Benutzer zu erstellen ... einfach gewähren SUDO Zugriff auf die Benutzer in Frage für die spezifischen Werkzeuge, die sie benötigen. Das reduziert die Angriffsfläche nur, indem sie „erlaubt“ root gestartet.

Andere Tipps

Was Sie wollen, ist eine "Gruppe"

Sie erstellen eine Gruppe an, dass das Konto will die Aktion gehört zu der Gruppe zu tun, dann geben Sie an, dass die Ressource, die Sie zugreifen möchten, ein Mitglied dieser Gruppe ist.

Manchmal kann Gruppenmanagement Art irritierend sein, aber es sollte Ihnen alles, was Sie tun möchten, ermöglichen, und es ist der Benutzer, der autorisiert ist, nicht das Programm.

(Wenn Sie Ihr Programm autorisiert möchten, können Sie einen bestimmten Benutzer erstellen als laufen und dass Benutzer die richtige Gruppenmitgliedschaft geben, dann su zu dieser Gruppe in Ihrem Programm den Vorgang auszuführen, ohne den laufenden Benutzer die Möglichkeit zu geben. )

Sie könnten eine SELinux-Richtlinie für Ihre Anwendung erstellen und verteilen. SELinux ermöglicht die Art von feinkörnigem Zugang, die Sie benötigen. Wenn Sie nicht können oder nicht SELinux verwenden, dann der Dämon ist der Weg zu gehen.

Ich würde nicht die Anwendung in Vollzeit als root ausführen, aber Sie könnten Ihre Anwendung setuid root oder setuid zu einem gewissen ID erkunden wollen machen, die Wurzel mit so etwas wie sudo für bestimmte Anwendungen werden kann. Sie könnten in der Lage sein, ein Konto einrichten, die sich nicht anmelden können, verwenden setuid Ihr Programm-ID zu ändern (vorübergehend, wenn erforderlich) und sudo auffordern, nicht für Kennwort eingerichtet haben, aber immer Zugriff für bestimmte Aufgaben auf dieses Konto ermöglichen.

Auf diese Weise Ihr Programm keine Sonderrechte hat, wenn sie normal läuft, hebt es nur Privilegien ist, wenn nötig, und durch sudo nur beschränkt, bestimmte Programme ausgeführt werden.

Es ist eine Weile her, dass ich viel Unix Entwicklung getan habe, also bin ich nicht wirklich sicher, ob es möglich ist, sudo einrichten nicht nach einem Kennwort aufgefordert (oder auch wenn es eine API für es ist), sondern als Rückfall Sie könnten setuid- ermöglichen nur zu verankern, wenn nötig.

[EDIT] Sieht aus wie sudo hat einen NOPASSWD-Modus, so denke ich, es sollte arbeiten, da Sie die Programme als externe Befehle ausführen.

Der traditionelle Weg wäre, um das erstellen und verwenden Sie ein setuid-Helfer zu tun, was Sie brauchen.Beachten Sie jedoch, richtig schreiben, ein setuid-Helfer ist schwierig (es gibt mehrere Angriffsmethoden, schützen Sie gegen).

Der moderne Weg wäre, um einen daemon (als root läuft, gestartet auf boot), die überwacht, um Anforderungen aus dem rest der Anwendung.Auf diese Weise werden Ihre Angriffsfläche ist meist begrenzt, je nachdem, was IPC Sie gewählt haben (ich würde vorschlagen, d-bus, der Sie zu sein scheint, der moderne Weg).

Schließlich, wenn Sie die Verwaltung der Netzwerk-Schnittstellen, was Sie tun, ist sehr ähnlich zu dem, was network-manager wird auf einer modernen Verteilung.Es wäre eine gute Idee sein, die entweder versuchen, irgendwie integrieren, was Sie tun, die mit der network-manager (es wird also nicht in Konflikt mit Ihren Manipulationen), oder zumindest sieht wie es funktioniert.

Es gibt keinen einzigen Benutzer, die auf halbem Weg zwischen einem „normalen“ Benutzer und Wurzel ist. Sie haben Wurzel, und dann Benutzer, die Sie haben; Benutzer können unterschiedliche Ebenen der Fähigkeiten haben. Wenn Sie wollen etwas, das mächtiger ist als ein „normaler“ Benutzer aber nicht so mächtig wie root, erstellen Sie einfach einen neuen Benutzer mit den Fähigkeiten wollen Sie, aber geben Sie es nicht die Privilegien Sie es nicht haben wollen.

Ich bin nicht genug, um mit Python vertraut zu sagen, was die notwendigen Befehle in dieser Sprache wären, aber man soll dies zu tun in der Lage durch Forking und mit einem Rohr zwischen den übergeordneten und untergeordneten Prozessen zu kommunizieren. Etwas entlang der Linien von:

  • Führen Sie das Programm als root über sudo oder suid
  • Beim Start des Programm sofort Gabeln und stellt ein Rohr für die Kommunikation zwischen den übergeordneten und untergeordneten Prozessen
  • Das Kind Prozess behält Wurzel Macht, sondern sitzt nur da für die Eingabe wartet aus dem Rohr
  • Der Elternprozess fällt root (UID ändert seine Rückseite zu der der Benutzer sie ausgeführt werden), dann zeigt die GUI interagiert mit dem Benutzer, und behandelt alle Verfahren, die zur Verfügung stehen einem nichtprivilegierten Benutzer
  • Wenn eine Operation durchgeführt werden soll, die Root-Rechte erfordert, die (nicht root) geordneten Prozess sendet einen Befehl auf der Leitung mit dem (root) Kindprozess, die es ausführt, und gegebenenfalls meldet zurück zu dem übergeordneten

Dies ist wahrscheinlich ein bisschen leichter zu sein als unabhängiger Daemon zu schreiben, sowie bequemer zu laufen (da müssen Sie nicht darum kümmern, ob der Daemon läuft oder nicht), während auch die GUI ermöglicht und andere Dinge, die als nicht-root laufen nicht root Kräfte werden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top