Bagaimana cara menggunakan argumen perintah dengan Cmnd_Alias ​​di sudoers?

36

Bagaimana cara menentukan argumen perintah dalam sudoers? Sebagai latar belakang, awsperintah sebenarnya adalah pintu gerbang ke sejumlah besar sub-sistem dan saya ingin membatasi pengguna untuk hanya menjalankanaws s3 cp ...any other args...

Ketika saya mencoba yang berikut ini /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

Sayangnya shell meminta kata sandi

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

Jika saya menghapus perintah args di Cmnd_Alias, maka itu mengalir sesuai keinginan (tanpa kata sandi), tetapi otorisasi terlalu luas. Jadi, apa cara yang benar untuk membatasi hanya jenis perintah tertentu saja .

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

Kemudian

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

Terima kasih banyak.

Dinesh
sumber
Mengapa Anda memiliki / usr / local / bin / aws, / usr / local / aws / bin / aws? Maksud saya Anda mengulangi perintah dua kali di baris yang sama?
Mohammed Noureldin

Jawaban:

47

Anda belum menggunakan wildcard, tetapi telah memberikan dua argumen. Karenanya sudocari perintah persis seperti yang tertulis (kecuali path-lookup) (dari 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).

Coba sesuatu seperti:

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

Perhatikan bahwa:

 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. 

Jadi, hanya satu wildcard yang dibutuhkan per perintah.

muru
sumber
1
+1 untuk penjelasan singkat dan berbagi pengetahuan, terima kasih.
Dinesh
1
Perhatikan bahwa sudo tidak menghargai pemisahan argumen yang dapat digunakan untuk eksploitasi dalam beberapa kasus, lihat unix.stackexchange.com/a/279142/43920 . Jadi daripada menentukan /usr/local/bin/aws s3 cpdalam sudoers, lebih aman untuk menggantinya dengan skrip (hanya dapat ditulis oleh root).
pcworld
6

Sama seperti @muru, tetapi bagi yang suka contoh kerja penuh:

# 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

Sementara /sbin/cmd1, /sbin/cmd2bisa berupa perintah lain.

Tujuannya ECHO_CMDadalah untuk menyajikan yang sudo echo X Aakan meminta frasa sandi, sementara sudo echo A Xtidak, dan untuk memungkinkan Anda mendapatkan kepercayaan diri melalui eksperimen sederhana tersebut.

(Diasumsikan bahwa gema duduk /bin/echo, untuk memeriksa di mana ia berada di sistem Anda coba whereis echo)

Grzegorz Wierzowiecki
sumber
Ya, ada /bin/echobiner, tetapi sebagian besar shell juga memiliki fungsi bawaan echoyang akan digunakan sebagai pengganti biner ini jika Anda tidak menyediakan path lengkap.
Marki555