Izinkan pengguna menjalankan perintah dengan argumen (yang berisi spasi)

17

Saya ingin mengizinkan satu pengguna untuk menjalankan grep (melalui sudo), dan untuk grep untuk satu string spesifik dalam satu file tertentu. Saya tidak ingin mengizinkan pengguna ini untuk dapat menjalankan grep pada semua file. Pengguna tidak memiliki akses baca ke file, karenanya persyaratan untuk menggunakan sudo. Saya mencoba untuk menulis cek nagios yang menangkap file log layanan lain di mesin.

Namun itu tidak berhasil, sudo terus meminta kata sandi.

Perintah saya adalah: sudo grep "string I want (" /var/log/thefilename.log(ya, ada ruang mentah (dan beberapa di string yang saya ingin grep)

/etc/sudoers.d/user-can-grep memiliki konten ini:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

File sudoers ini dimiliki oleh root:rootdan memiliki izin-r--r-----

Servernya adalah Ubuntu terpercaya 14.04.3 LTS.

Bagaimana saya bisa membuat ini berfungsi?

Rory
sumber
Apakah nagios memeriksa secara eksplisit memanggil / bin / grep, atau / usr / bin / grep?
Jeff Schaller
Tulis skrip shell yang melakukan ini, dan kemudian biarkan skrip dijalankan sudo.
user253751
@JeffSchaller FYI skrip hanya memanggil grep, dan which grepmemberitahu saya itu menggunakan /bin/grep. AFAIK dalam file sudo Anda perlu menentukan path lengkap biner, bahkan jika Anda menyebutnya tanpa path lengkap.
Rory

Jawaban:

13

Rupanya, sudo meratakan perintah menjadi string sebelum membandingkannya dengan spesifikasi dalam file sudoers. Jadi, dalam kasus Anda, Anda tidak perlu menggunakan tanda kutip atau bentuk pelarian lainnya:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Sunting : Seperti yang ditunjukkan oleh @ user23013 dalam komentar, ini dapat dieksploitasi untuk menangkap "string yang saya inginkan" dalam file apa pun (dan, dengan ekstensi, juga untuk "string I" dan "string".) Harap pertimbangkan dengan cermat sebelum menggunakan pengecekan argumen sudo!


Perhatikan juga bahwa permintaan berikut ini setara, yaitu Anda tidak akan dapat membatasi pengguna untuk satu representasi spesifik:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Ini karena fakta bahwa kutipan dan pelolosan ditangani oleh shell dan tidak pernah mencapai sudo.

Alexander Batischev
sumber
Menarik, saya bertanya-tanya apakah itu dapat dieksploitasi, yaitu meyakinkan sudoAnda mengetik satu hal (yang cocok dengan spesifikasi) tetapi ketika datang untuk menjalankannya, itu adalah sesuatu yang sepenuhnya berbeda.
EightBitTony
4
@EightBitTony Tentu saja! Di sudoers: Anda user host = NOPASSWD: /usr/bin/vim Editing sudoers file(dengan maksud untuk memungkinkan pengguna mengedit "Mengedit file sudoers") dapat dieksploitasi dengan cdmemasukkan /etc/dan menjalankan sudo vim Editing sudoers file. Saya akan mengatakan bahwa untuk setiap perintah dengan kompleksitas yang masuk akal, seseorang harus menggunakan pendekatan yang disarankan dalam komentar Anda — shell menyediakan $@variabel di mana Anda dapat memeriksa bahwa argumen dikelompokkan seperti yang Anda harapkan dikelompokkan.
Alexander Batischev
8
Buat jalur di ( /var/logmana saja dan symlink thefilename.logke file apa pun, lalu pengguna dapat grep string I wantdari file apa pun.
user23013
2
@ Jawaban EightBitTony (tulis skrip pembungkus, izinkan sudo mengakses skrip itu) jauh lebih baik dan lebih aman.
cas
Wow, itu praktik yang sangat buruk untuk alat yang berfokus pada keamanan.
Sam Watkins
32
  1. Tulis skrip (hanya dapat ditulis oleh root)
  2. Dalam skrip itu, jalankan yang grepAnda butuhkan
  3. Dalam konfigurasi sudoers, izinkan hanya akses ke skrip itu
  4. Mengkonfigurasi alat apa pun atau menyarankan pengguna mana saja untuk menjalankan skrip melalui sudo

Jauh lebih mudah untuk di-debug, lebih mudah untuk mengunci akses spesifik ke file tertentu, dan jauh lebih sulit untuk dieksploitasi.

EightBitTony
sumber
2

Karena Anda hanya perlu melakukan root untuk akses file, pertimbangkan untuk menggunakan cat, teeatau sesuatu yang serupa dan mem-pipkannya ke grepatau program apa pun yang perlu Anda jalankan. Misalnya sudo cat /file/path | grep …Dengan cara ini Anda membatasi root ke tempat Anda benar-benar membutuhkannya.

pengguna167676
sumber
0

sudoitu bagus, tapi kadang-kadang itu tidak cocok Untuk ini saya suka menggunakan super. superjuga memungkinkan izin tinggi, namun mengasumsikan alias perintah, yang nyaman ketika memungkinkan baris perintah yang rumit, karena mereka digunakan sebagai baris perintah sederhana.

tab super Anda akan terlihat seperti:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

dan akan dipanggil sebagai super grepcmd.

Hildred
sumber
sudohas Cmnd_Alias(yang dapat berisi satu atau lebih perintah, dengan atau tanpa batasan arg).
cas
Bukan hal yang sama sekali. Cmnd_Alias ​​adalah alat untuk menyederhanakan file konfigurasi, itu tidak mengekspos alias kepada pengguna yang merupakan mode operasi super utama (itulah sebabnya saya menggunakan sudo ketika saya tidak baik perintah aliasing atau menjalankan skrip suid (sebagian besar waktu) , dan super untuk dua kasus penggunaan ini).
Hildred
itulah gunanya skrip wrapper ... dan tidak terbatas pada satu kalimat atau memiliki masalah kutipan yang mengganggu.
cas