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:root
dan memiliki izin-r--r-----
Servernya adalah Ubuntu terpercaya 14.04.3 LTS.
Bagaimana saya bisa membuat ini berfungsi?
sudo
.grep
, danwhich grep
memberitahu saya itu menggunakan/bin/grep
. AFAIK dalam file sudo Anda perlu menentukan path lengkap biner, bahkan jika Anda menyebutnya tanpa path lengkap.Jawaban:
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:
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:
Ini karena fakta bahwa kutipan dan pelolosan ditangani oleh shell dan tidak pernah mencapai
sudo
.sumber
sudo
Anda mengetik satu hal (yang cocok dengan spesifikasi) tetapi ketika datang untuk menjalankannya, itu adalah sesuatu yang sepenuhnya berbeda.sudoers
: Andauser host = NOPASSWD: /usr/bin/vim Editing sudoers file
(dengan maksud untuk memungkinkan pengguna mengedit "Mengedit file sudoers") dapat dieksploitasi dengancd
memasukkan/etc/
dan menjalankansudo 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.( /var/log
mana saja dan symlinkthefilename.log
ke file apa pun, lalu pengguna dapat grepstring I want
dari file apa pun.grep
Anda butuhkanJauh lebih mudah untuk di-debug, lebih mudah untuk mengunci akses spesifik ke file tertentu, dan jauh lebih sulit untuk dieksploitasi.
sumber
Karena Anda hanya perlu melakukan root untuk akses file, pertimbangkan untuk menggunakan
cat
,tee
atau sesuatu yang serupa dan mem-pipkannya kegrep
atau program apa pun yang perlu Anda jalankan. Misalnyasudo cat /file/path | grep …
Dengan cara ini Anda membatasi root ke tempat Anda benar-benar membutuhkannya.sumber
sudo
itu bagus, tapi kadang-kadang itu tidak cocok Untuk ini saya suka menggunakansuper
.super
juga 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:
dan akan dipanggil sebagai
super grepcmd
.sumber
sudo
hasCmnd_Alias
(yang dapat berisi satu atau lebih perintah, dengan atau tanpa batasan arg).