Jak używać argumentów poleceń z Cmnd_Alias ​​w sudoers?

36

Jak określić argumenty polecenia w sudoers? Jako tło, awspolecenie jest w rzeczywistości bramą do całej gamy podsystemów i chcę ograniczyć użytkownika do działaniaaws s3 cp ...any other args...

Kiedy spróbuję wykonać następujące czynności /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

Niestety powłoka prosi o podanie hasła

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

Jeśli usunę argumenty polecenia w Cmnd_Alias, to przepłynie zgodnie z potrzebami (bez pytania o hasło), ale autoryzacja jest zbyt szeroka. Więc jaki jest właściwy sposób ograniczania się tylko do niektórych rodzajów wywołań poleceń .

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

Następnie

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

Wielkie dzięki.

Dinesh
źródło
Dlaczego masz / usr / local / bin / aws, / usr / local / aws / bin / aws? Mam na myśli, że powtórzyłeś polecenie dwa razy w tym samym wierszu?
Mohammed Noureldin

Odpowiedzi:

47

Nie użyłeś żadnych symboli wieloznacznych, ale podałeś dwa argumenty. Dlatego sudoszuka poleceń dokładnie tak, jak napisano (z wyjątkiem wyszukiwania ścieżki) (z 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).

Wypróbuj coś takiego:

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

Uwaga:

 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. 

Tak więc potrzebna jest tylko jedna karta wieloznaczna na polecenie.

muru
źródło
1
+1 za zwięzłe wyjaśnienie i dzielenie się wiedzą, dzięki.
Dinesh
1
Zauważ, że sudo nie przestrzega właściwie separacji argumentów, które w niektórych przypadkach mogą być użyte w exploitach, patrz unix.stackexchange.com/a/279142/43920 . Zamiast więc określać /usr/local/bin/aws s3 cpsudoers, bezpieczniej jest zastąpić go skryptem (zapisywalnym tylko przez root).
pcworld,
6

To samo co @muru, ale dla tych, którzy lubią pełny przykład pracy:

# 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

Chociaż /sbin/cmd1, /sbin/cmd2może być żadnych innych poleceń.

Celem ECHO_CMDjest przedstawienie, sudo echo X Aktóre poprosi o hasło, a sudo echo A Xnie, i pozwoli ci zdobyć zaufanie dzięki tak prostemu eksperymentowi.

(Założono, że echo zatrzymuje się /bin/echo, aby sprawdzić, gdzie jest w twoim systemie, spróbuj whereis echo)

Grzegorz Wierzowiecki
źródło
Tak, jest /bin/echoplik binarny, ale większość powłok ma również wbudowaną funkcję, echoktóra będzie używana zamiast tego pliku binarnego, jeśli nie podasz pełnej ścieżki.
Marki555