Wie verwende ich Befehlsargumente mit Cmnd_Alias ​​in Sudoern?

36

Wie gebe ich Befehlsargumente in sudoers an? Als Hintergrund ist awsBefehl eigentlich ein Gateway zu einer ganzen Reihe von Subsystemen, und ich möchte den Benutzer darauf beschränken, nur ausgeführt zu werdenaws s3 cp ...any other args...

Wenn ich folgendes versuche in /etc/sudoers

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD

Die Shell fordert leider zur Passworteingabe auf

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:

Wenn ich die Befehlsargumente in Cmnd_Alias ​​entferne, fließt es wie gewünscht (ohne Passwortabfrage), aber die Berechtigungen sind viel zu breit. Also, was ist der richtige Weg, um nur bestimmte Arten von Befehlsaufrufen einzuschränken .

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws

Dann

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy

Vielen Dank.

Dinesh
quelle
Warum haben Sie / usr / local / bin / aws, / usr / local / aws / bin / aws? Ich meine, Sie haben den Befehl zweimal in derselben Zeile wiederholt?
Mohammed Noureldin

Antworten:

47

Sie haben keine Platzhalter verwendet, aber zwei Argumente angegeben. Sucht daher sudonach Befehlen genau so, wie sie geschrieben wurden (mit Ausnahme der Pfadsuche) (von man 5 sudoers):

 If a Cmnd has associated command line arguments, then the arguments in
 the Cmnd must match exactly those given by the user on the command line
 (or match the wildcards if there are any).

Versuchen Sie etwas wie:

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *

Beachten Sie, dass:

 Wildcards in command line arguments should be used with care.  Because
 command line arguments are matched as a single, concatenated string, a
 wildcard such as ‘?’ or ‘*’ can match multiple words. 

Pro Befehl wird also nur ein Platzhalter benötigt.

muru
quelle
1
+1 für eine kurze Erklärung und das Teilen von Wissen, danke.
Dinesh
1
Beachten Sie, dass sudo die Trennung von Argumenten, die in einigen Fällen für Exploits verwendet werden können, nicht ordnungsgemäß einhält (siehe unix.stackexchange.com/a/279142/43920) . Anstatt /usr/local/bin/aws s3 cpin sudoers anzugeben , ist es sicherer, dies durch ein Skript zu ersetzen (das nur von root geschrieben werden kann).
pcworld
6

Das gleiche wie @muru, aber für diejenigen, die ein voll funktionsfähiges Beispiel mögen:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *

# Make USER run specific commands on given HOSTNAME
# USER_NAME 

#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD

Während /sbin/cmd1, /sbin/cmd2können andere Befehle sein.

Der Zweck von ECHO_CMDist es, sudo echo X Aeinen Code zu präsentieren, der nach einer Passphrase fragt, während dies sudo echo A Xnicht der Fall ist , und Ihnen zu ermöglichen, durch ein so einfaches Experiment Vertrauen zu gewinnen.

(Es wurde davon ausgegangen, dass Echo vorhanden ist /bin/echo, um zu überprüfen, wo es sich auf Ihrem System befindet. whereis echo)

Grzegorz Wierzowiecki
quelle
Ja, es gibt eine /bin/echoBinärdatei, aber die meisten Shells verfügen auch über eine integrierte Funktion echo, die anstelle dieser Binärdatei verwendet wird, wenn Sie nicht den vollständigen Pfad angeben.
Marki555,