Ermöglichen des Zugriffs auf eine Reihe von Befehlen für Nicht-Root-Benutzer ohne sudo


13

Ich möchte einem Nicht-Root-Benutzer auf meinem Computer Nicht-Sudo-Zugriff gewähren. Es gibt einen DNS-Manager, dessen einzige Rolle darin besteht, alle BIND-Befehle (rndc, dnssec-keygen) usw. auszuführen.

Jedes Mal, wenn er einen Befehl ausführen muss, gibt er Folgendes ein:

sudo rndc reload

Gibt es eine Möglichkeit, dieses Sudo loszuwerden, aber nur mit einem bestimmten Befehlssatz (und nur für DNS-Manager)?


5
Eine diskretionäre Zugangskontrolle wie diese ist so ziemlich das, wofür sie gedacht sudoist. Was sind Ihre geschäftlichen Einwände gegen seine Verwendung sudodafür?
MadHatter

1
@peterh Ich wiederhole meine Frage: Diskretionäre Zugriffskontrolle (dh partielle Sysadm-Delegation) ist die Rolle von sudo. Was sind die Einwände?
MadHatter

3
Wie wäre es dann mit passwortlos sudo? Oder Sie haben sudo mit einem Kennwort versehen , um das DNS-Verwaltungstool auszuführen , das dann je nach Bedarf mit namedGruppen-, Benutzer- oder Rootberechtigungen ausgeführt werden kann.
MadHatter

4
@ Peterh "ein guter Grund, es so zu machen" wäre das fehlende Bit. Normalerweise stellen sich Fragen wie diese als XY-Probleme heraus , und ich finde, dass das Verständnis des zugrunde liegenden Problems der Schlüssel ist, um sie vollständig und professionell zu beantworten.
MadHatter

2
@ Peterh Ich denke, wir sind uns einig. Ich möchte auch, dass das OP seine Frage verbessert. Ein Drilldown funktioniert für mich gut, um dem Autor zu helfen, über den Tellerrand hinaus zu denken, den er um sich herum aufgebaut hat. Vielleicht hat er einen guten Grund, es zu vermeiden sudo. Wenn er versucht, es uns auszudrücken, kann er entweder unsere Verwirrung beseitigen oder seine eigene - oder beides!
MadHatter

Antworten:


31

Wenn ich Ihre Kommentare richtig verstehe, besteht das Problem darin, dass der Befehl über eine Verbindung ausgegeben wird, die nicht in der Lage ist, das Kennwort einzugeben, das sudo standardmäßig anfordert. Außerdem benötigt sudo in vielen Betriebssystemdistributionen standardmäßig ein TTY, über das dieses Programm möglicherweise nicht verfügt.

Sudo verfügt jedoch über eine sehr fein abgestimmte Berechtigungsstruktur, die es einem oder mehreren Benutzern ermöglicht, einen bestimmten Befehl ohne Kennwort und TTY auszugeben. Im Folgenden werden drei Möglichkeiten gezeigt, wie Sie dies für Ihre Anforderungen konfigurieren können. Welchen Sie auch wählen, der Benutzer kann den Befehl jetzt ausführen, sudo rndc reloadohne ein Kennwort eingeben zu müssen.

(Dies kann auch unnötig sein, aber ... Bitte denken Sie daran, vor dem Bearbeiten eine Sicherungskopie Ihrer sudoers-Datei zu erstellen, um eine Shell zu erhalten, in der Sie als Root angemeldet sind, falls Sie zur Sicherung zurückkehren und diese bearbeiten müssen es verwendet visudostatt sudo vi /etc/sudoers. Hoffentlich werden diese Vorsichtsmaßnahmen wird nicht notwendig sein, aber ... besser , sie zu haben und müssen sie nicht als umgekehrt!)

1. Wenn Sie kein TTY für Anfragen benötigen möchten

Der einfachste Weg, die TTY-Anforderungen (sofern vorhanden) zu beseitigen, besteht darin, sicherzustellen, dass die mit Defaultsin beginnende Zeile /etc/sudoersnicht das Wort enthält, requirettysondern es enthalten sollte !requiretty. Wenn Sie dies jedoch tun, bedeutet dies, dass für keinen sudo-Befehl ein tty erforderlich ist!

Sie müssen auch die Zeile hinzufügen

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Wenn Sie ein TTY für alle Benutzer mit Ausnahme dieses Benutzers benötigen möchten

Dies kann durch Festlegen eines Standardwerts für diesen einen Benutzer wie folgt erfolgen:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Wenn Sie ein TTY für alle Befehle außer diesem einen Befehl von diesem einen Benutzer anfordern möchten

Dies ist aufgrund der Syntax der sudoers-Datei etwas komplexer. Sie müssen einen Befehlsalias für den Befehl erstellen und dann einen Standard für diesen Befehlsalias festlegen, wie folgt:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

Dies kann natürlich mit einem Wrapper-Skript kombiniert werden, das den Befehl mit sudo aufruft, wenn Sie sudo aus irgendeinem Grund nicht direkt verwenden können, auch wenn es kein Passwort enthält.
Jenny D

4

Ja. sudo kann sehr flexibel konfiguriert werden. Trotzdem muss ich erwähnen: Diese Arten von Lösungen sollten nicht als sehr sicher angesehen werden und sie sollten nur in einer kooperativen Umgebung verwendet werden, in der andere Steuerelemente vorhanden sind (daher können Sie Ihrem loyalen Untergebenen diese erweiterten Berechtigungen gewähren, aber sollte dies nicht für einen Kunden tun, den Sie nur aus dem Netz kennen).

Die sudo-Konfiguration ist /etc/sudoersin den meisten Systemen enthalten. Sie können die Syntax durch Googeln oder durch einen man sudoBefehl herausfinden .

Sie sollten diese Datei nicht direkt bearbeiten. dies kann zu rennbedingungen führen. Verwenden Sie stattdessen den visudoBefehl (ein Wrapper um Ihre $EDITORUmgebungsvariable).


Nachdem Sie sudo konfiguriert haben, können Sie dies einfach um die sichtbaren Befehle wickeln. Es ist sehr einfach:

  1. Erstellen Sie ein Verzeichnis für eine Liste Ihrer Sudo-Wrapper-Skripte (zB /usr/local/dnsadmin/bin)
  2. Erstellen Sie ein Wrapper-Skript für die Befehle, die ohne sudo verwendet werden sollen. Es wird ein sehr einfacher Befehl sein, zum Beispiel /usr/local/dnsadmin/bin/rndc:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Holen Sie sich dieses Verzeichnis in ihre PATHUmgebungsvariable (zB von einem systemweiten oder ihrem lokalen .profile).


Aus Neugier - warum sollten Sie execdas Shell-Skript verwenden, anstatt den Befehl direkt aufzurufen? (Ich sage nicht, dass es falsch ist, ich möchte nur wissen, warum Sie es tun, damit ich vielleicht etwas lernen kann)
Jenny D

2
Ich bin mit dem passwortlosen Sudo-Bit fertig, die Idee für Wrapper-Skripte ist großartig.
Anss

2
@JennyD :-) Wegen Stabilität und Leistung. In diesem Fall execwird der aufgerufene Befehl anstelle der Shell eingesetzt. Die Muschel wird verschwinden. Ohne exec startet die Shell diesen Befehl, wartet dann auf seine Beendigung und wird dann beendet. Dieses zweite, ausführungslose Verfahren bedeutet mehrere kooperierende Prozesse, die nicht benötigt werden. Aber es gibt keinen großen Unterschied, ohne exec würde das genauso gut funktionieren wie damit.
Peterh - Wiedereinsetzung von Monica

@ JennyD Mein Plädoyer :-)
peterh - Wiedereinsetzung von Monica

@Snowbody Vielen Dank für das Lektorat! Es ist eine sehr große Ehre.
peterh - Wiedereinsetzung von Monica am

2

Dies ist zwar keine generelle Lösung für den speziellen Fall, dass rndcSie überhaupt nicht benötigen sudo.

rndckann mit jedem namedProzess über einen lokalen Socket oder einen Remote-Port kommunizieren , wobei ein geheimer Schlüssel zur Authentifizierung verwendet wird. Standardmäßig (oder zumindest für debian, die von mir verwendete Distribution) befindet sich diese Datei in /etc/bind/rndc.keyund ist normalerweise nur für Benutzer bindund Gruppen lesbar bind.

Jeder, der Lesezugriff auf diese Schlüsseldatei (oder eine identische Kopie davon) hat, kann rndcden BIND-Server steuern. In diesem speziellen Fall ist es daher am einfachsten, den Benutzer der bindGruppe hinzuzufügen .

Eine überraschend große Anzahl von gewöhnlichen Daemons hat einen ähnlichen Aufbau (ich persönlich finde immer noch heraus, welche Möglichkeiten Power-DNS in dieser Hinsicht bieten, aber es sieht bisher vielversprechend aus). Wenn Sie dies nicht möchten, müssen sudoSie prüfen, ob das, was Sie erreichen möchten, von Fall zu Fall möglich ist.


-1

Sie möchten sudo nicht verwenden, um einigen Befehlen root zuzuweisen. Stattdessen könnten Sie ein bestimmtes Programm [das den Befehl umbrechen kann] chmod 4750, um die Rechte eines normalen Benutzers zu erhöhen, das als root auszuführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.