Sudo'lamadan önce sudo yeteneğini kontrol etmek mümkün mü?


11

Küçük bir yardımcı program yazıyorum. sudoGerekirse bir şeyleri çalıştırmayı denemek istiyorum .

Yani: dosya izinleri geçerli kullanıcının belirli bir dosya üzerinde çalışmasına sudoizin vermezse (ve kurallar izin verirse) yardımcı programım sudodosyanın sahibi olarak bir şey çalıştırmak istiyorum .

Bu yeteneği önceden kontrol etmeyi umuyorum, çünkü sistem günlüklerinin başarısız sudodenemelerden kaynaklanan gürültü ile dolmamasını tercih ederim . Gibi sudokendisi başarısızlık üzerine raporlar: "Bu olay rapor edilecektir".

Yani, programlama yoluyla kontrol umuyorum: edebilir user <x>çalıştırmak command <y>yoluyla sudo?.

Sorun şu: /etc/sudoersbu eşlemeyi içerirken , kök sahip ve normal kullanıcılar tarafından okunamıyor.

Çalıştırmak için bir alt işlem yumurtlamayı düşünüyordum sudo -l(mevcut kullanıcının sudo-run komutları çıktı). Sonra bunun çıktısını ayrıştırırdım. Ancak, bu biraz kırılgan görünüyor. Çıktı istediğim bilgiyi içeriyor, ancak görünüşe göre insanlar okumak için tasarlandı (programlı tüketim için değil). Çıktının gelecekte veya farklı platformlarda aynı biçimi izleyeceğine dair herhangi bir garanti olup olmadığını bilmiyorum.

sudo -lÇıktının programlı ayrıştırılması güvenli kabul ediliyor mu? Değilse, bir sudo komutunun başarılı olup olmayacağını önceden belirlemek için daha iyi seçenekler var mı?


(X / Y'de arka plan: Bu yardımcı program sınırlı erişimli bir rol hesabı tarafından kullanılmak içindir. Bazı kullanıcıların etkin bir şekilde sınırlı erişim hesabının sudo kuralları aracılığıyla dosyalarında çalışmasına izin vermesini bekliyorum. Ancak kazandım. önceden diğer kullanıcıların hangi sudo kuralının geçerli olduğunu bilmiyorum)


3
Biraz farklı bir yaklaşım izlemenizi tavsiye ederim. Kullanıcı başına kurallara sahip olmak yerine, yapmasını istediğiniz her şeyi yapmasına izin verilen bir grubunuz neden olmasın. Bu şekilde, kullanıcının grupta olup olmadığını kontrol edebilirsiniz. Bu iyi bir alternatif olabilir mi?
terdon

Yanıtlar:


13

Sudo man sayfasına göre:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

böylece bu

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Muru'nun işaret ettiği gibi , ihtiyacınıza bağlı olarak ya birini -U $USERya -U $USERTOTESTda hiçbir şeyi kullanın .


Eğer amaçlanan ise $USERgeçerli kullanıcı anlamında, sadece yapabileceği sudo -l <command>olmadan -U $USER.
muru

Teşekkürler - bu yararlıdır. Bu yaklaşımı test ederken fark ettiğim bir şey, sudo kuralının belirli istisnalar gibi ALL komutlarına izin vermek için ayarlandığı durumlarla ilgilenmediği gibi (targetUser) ALL, !/usr/bin/foo .. bu durumda sudo -l -u targetUser /usr/bin/foohala çıktı /usr/bin/foove çıkış görünüyor Yine de, basit kontrolüm için yeterlidir ve daha ayrıntılı sudo -lçıktıyı ayrıştırmayı yener .
Peter Martin
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.