Kullanıcının bağımsız değişkenlerle (boşluk içeren) bir komut çalıştırmasına izin ver


17

Bir kullanıcı grep (sudo aracılığıyla) çalıştırmak ve belirli bir dosyada belirli bir dize için grep izin vermek istiyorum. Bu kullanıcının grep'i tüm dosyalarda çalıştırabilmesine izin vermek istemiyorum. Kullanıcının dosyaya okuma erişimi yok, bu nedenle sudo kullanma gereksinimi. Ben makinede başka bir hizmetin günlük dosyasını greps nagios kontrol yazmaya çalışıyorum.

Ancak çalışmıyor, sudo sürekli bir şifre istiyor.

Komutum: sudo grep "string I want (" /var/log/thefilename.log(evet, (dizede bir ham ve bazı boşluklar var. Grep)

/etc/sudoers.d/user-can-grep bu içeriğe sahip:

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

Bu sudoers dosyasına ait root:rootve izinleri var-r--r-----

Sunucu Ubuntu güvenilir 14.04.3 LTS.

Bu işi nasıl yapabilirim?


Nagios check, açıkça / bin / grep veya / usr / bin / grep'i çağırıyor mu?
Jeff Schaller

Bunu yapan bir kabuk komut dosyası yazın ve komut dosyasının çalışmasına izin verin sudo.
user253751

@JeffSchaller FYI betiği sadece çağırıyor grepve kullandığını which grepsöylüyor /bin/grep. Sudo dosyasında AFAIK, tam yol olmadan çağırsanız bile, ikilinin tam yolunu belirtmeniz gerekir.
Rory

Yanıtlar:


13

Görünüşe göre sudo, sudoers dosyasındaki bir belirtimle karşılaştırmadan önce komutu bir dizeye yassılaştırır. Yani, sizin durumunuzda, tırnak işaretleri veya başka bir kaçış şekli kullanmanıza gerek yoktur:

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

Düzenleme : @ user23013 yorumlarda belirtildiği gibi, bu herhangi bir dosyada (ve "dize I" ve "dize" için de "dize istiyorum" için grep sömürülebilir.) Lütfen önce dikkatlice düşünün sudo'nun argüman kontrolünü kullanarak!


Ayrıca, aşağıdaki çağrıların eşdeğer olduğunu, yani kullanıcıları belirli bir temsille kısıtlayamayacağınızı unutmayın:

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

Bunun nedeni, tırnak ve kaçmanın kabuk tarafından ele alınması ve asla ulaşmamasıdır sudo.


İlginçtir, bunun sömürülebilir olup olmadığını merak ediyorum, yani sudo(şartnameyle eşleşen) bir şey yazdığınıza ikna edin, ancak yürütme söz konusu olduğunda, tamamen başka bir şeydir.
EightBitTony

4
@EightBitTony Tabii ki öyle! İçinde sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(kullanıcıların "sudoers dosyasını düzenleme" düzenlemesine izin vermek amacıyla) cdiçine girerek /etc/ve çalışarak kullanılabilir sudo vim Editing sudoers file. Herhangi bir makul karmaşıklık komutu için, yorumunuzda önerilen yaklaşımla devam edilmesi gerektiğini söyleyebilirim; kabuk $@, argümanların gruplandırılmasını beklediğiniz şekilde gruplandığını kontrol edebileceğiniz değişken sağlar .
Alexander Batischev

8
( /var/logHer yerde bir yol oluşturun ve thefilename.logherhangi bir dosyaya symlink , kullanıcı string I wantdaha sonra herhangi bir dosyadan grep olabilir .
user23013

2
@ EightBitTony'nin cevabı (bir paket betiği yazın, bu betiğe sudo erişimine izin verin) çok daha iyi ve daha güvenli.
cas

Vay canına, bu güvenlik odaklı bir araç için son derece zayıf bir uygulama.
Sam Watkins

32
  1. Bir komut dosyası yazın (yalnızca kök tarafından yazılabilir)
  2. Bu komut dosyasında, grepihtiyacınız olan
  3. Sudoers yapılandırmasında, yalnızca bu komut dosyasına erişime izin ver
  4. Herhangi bir aracı yapılandırın veya hangi kullanıcıya komut dosyasını sudo üzerinden çalıştırmasını önerin

Hata ayıklamak çok daha kolay, belirli bir dosyaya belirli erişimi kilitlemek daha kolay ve sömürülmesi çok daha zor.


2

Yalnızca dosya erişimi için kök gerektiğinden, kullanmayı düşünün cat, teeya da buna benzer ve boru şey grepihtiyacınız ya da her türlü programı çalıştırmak için. Örneğin sudo cat /file/path | grep …bu şekilde size kesinlikle ihtiyaç yere kök kısıtlar.


0

sudoharika, ama bazen en uygun değil. Bunun için kullanmayı seviyorum super. superyükseltilmiş izinlere de izin verir, ancak karmaşık komut satırlarına izin verirken uygun olan komut diğer adlarını varsayar, çünkü bunlar basit komut satırları olarak kullanılır.

super.tab'iniz şöyle görünür:

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

ve olarak çağrılır super grepcmd.


sudovardır Cmnd_Alias(veya Arg kısıtlama olmadan, bir veya daha fazla komutları içerir olabilir).
cas

Aynı şey değil. Cmnd_Alias, yapılandırma dosyasını basitleştirmek için bir araçtır, süper birincil çalışma modu olan kullanıcıya bir diğer ad göstermez (bu yüzden ya aliasing komutları veya suid komut dosyaları çalıştırmadığımda sudo kullanıyorum (çoğu zaman) ve bu iki kullanım durumu için süper).
Hildred

sarmalayıcı komut dosyalarının amacı budur ve tek satırlarla sınırlı değildir veya can sıkıcı alıntı sorunları vardır.
cas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.