Sudo ile find'i güvenle kullanın


10

Bir Linux sunucusunda, bir grup kullanıcıdan kök ayrıcalıklarını kaldırmam gerekiyor. Ancak bu kullanıcıların, dosya adlarına, değişiklik tarihlerine ve diğer meta verilere dayalı olarak dosyaları aramak için "find" yardımcı programını kullanabilmelerinin yasal nedenleri vardır.

Sunucuda, dosya adları hassas değildir, ancak dosya içeriği olabilir.

Kullanıcıların sunucuda herhangi bir yerde dosya aramasına izin vermek için sudo kullanmak istiyorum. "Bul" yardımcı programı harika, ancak keyfi komutları oluşturmak için "-exec" kullanmak gibi her türlü yan etkiye izin verir.

findKısıtlamalarımla çalışabilir miyim ?


14
Genelde yok dosya adı kalıpları için arama sonuçları can not aslında erişim dosyalarını içerecek istiyorum. Bu bağlamda gereksiniminiz biraz tuhaf.
HBruijn

2
Kimse sizi soruya girmeye zorlamaz. Sunucu Hatası'nın amaçlarından birinin garip durumlar için bir forum olarak hizmet etmek olduğunu düşünüyorum.
Troels Arvin

2
Sunucu Hatası bir forum değildir ve ters psikoloji girişimleri HBruijn'in gözleminin geçerliliğini değiştirmez (ki eminim size yardımcı olma girişiminde bulunmuştu).
Yörüngedeki Hafiflik Yarışları

Yanıtlar:


19

Konum bulmaya ne dersiniz ?

locate, updatedb (8) tarafından hazırlanan bir veya daha fazla veritabanını okur ve PATTERN'lerden en az birini standart çıktıya, her satıra bir tane eşleyen dosya adlarını yazar. --Regex belirtilmezse, PATTERN'ler globbing karakterler içerebilir. PATTERN herhangi bir globbing karakteri içermiyorsa, yerini desen PATTERN gibi davranır .

Varsayılan olarak locate, veritabanında bulunan dosyaların hala var olup olmadığını denetlemez. locate hiçbir zaman ilgili veritabanının en son güncellemesinden sonra oluşturulan dosyaları rapor edemez.

Ya da belki de slocate :

Güvenli Konum, sisteminizdeki dosyaları dizine eklemek ve hızlı bir şekilde aramak için güvenli bir yol sağlar. Daha hızlı arama yapmak için veritabanını sıkıştırmak için GNU locate gibi artımlı kodlamayı kullanır, ancak kullanıcıların erişemedikleri dosyaları görmemesi için dosya izinlerini ve sahipliğini de depolar.

Bu kılavuz sayfası, slocate'in GNU sürümünü belgelemektedir. slocate Sistem kullanıcılarının, yetkisiz dosyalar görüntülemeden tüm dosya sistemlerinde arama yapmalarını sağlar.


İyi bir fikir. Bunu neden düşünmediğimi bilmiyorum. Ama sudo kuralları kullanıcının herhangi bir "locate" komutunu çalıştırmasına izin veriyorsa, "-d" parametresinin rasgele dosyaları okumak için bir şekilde kullanılabileceğinden korkuyorum?
Troels Arvin

2
@TroelsArvin: locategerek yok sudo; sadece updatedbişi özel ayrıcalıklar gerektirir. Kullanıcılarınız bu nedenle hiç çalışmamalı veya çalışamamalıdır sudo locate.
jwodder

1
@jwodder: Bir RHEL 7 sunucusunda: Diyelim ki u kullanıcısının / data / foo'ya erişimi yok. / Data / foo'da "somefile.csv" dosyası vardır. Şimdi, u "locate somefile.csv" dosyasını gerçekleştirdiğinde, "locate" öğesinden çıktı /data/foo/somefile.csv içermez - kullanıcı u sudo üzerinden "locate" komutunu çalıştırmazsa. ("--Nofollow" bağımsız değişkenini kullanmak yardımcı olmaz.)
Troels Arvin

1
@TroelsArvin ama -dbayrak sadece veritabanı yolunu ayarlar? Belki seni yanlış anladım.
Lenniey

21

Göre man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Bu benim için çalıştı. ('#' ile başlayan satırlar köktür, '$' olan satırlar kök değildir) bu durumda root olmayan kullanıcı wheelgruptadır.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Yeteneğin verdiği değer göz önüne alındığında, tam olarak istediğiniz şeye uyuyor. findDosyaların içindeki baytları okumanıza izin veren bir özelliğe sahip olup olmadığını kapsamlı bir şekilde kontrol etmedim , ancak LD_PRELOADLinux'ta setuid kontrollerinin doğası nedeniyle bariz şeyler ve kütüphane şim saldırıları çalışmamalı ve yetenek bitleri alamıyor alt süreçlerden miras alınan (ham setuid'in aksine) başka bir bonus.

Yapmak istediğiniz şeyin geçici dosya oluşturma veya erişimle ilgili olası gizlilik endişelerini artırdığını ve programın bir yarış durumu / ayrıcalık yükseltme girişimini (iyi bilinen dosya adları oluşturan programlara karşı) temel almak için kullanılabileceğini unutmayın. ancak doğru güvenlik kontrollerini yapmayın).

Ayrıca, bazı kötü yazılmış uygulamalar, anlam iletmenin veya verileri gizlemenin bir yolu olarak dosya meta verilerine veya ağaç yapısına güvenebilir. Bu, kısıtlı bilgilerin yayınlanmasına neden olabilir veya başka türlü bilinmeyen ayrıcalıklı belgelerin açığa çıkmasına neden olabilir (bilinmeyen gizlilik yoluyla güvenlik biliyorum, ancak bu, özellikle kapalı kaynaklı satıcıların maalesef yapmaktan hoşlandığı bir şeydir).

Bu nedenle, dikkatli olun ve bunu yapmak konusunda dikkatli olun ve bariz şeyler işe yaramasa bile bununla ilişkili risklerin olduğunu anlayın.

Oh, ve birinin yorumlarda ayrıcalık yükseltme için bir temel olarak bu mekanizmayı kullanan bir kavram saldırısı kanıtı olup olmadığını görmek isterim!


5
Bu gerçekten ilginç görünüyor!
Sven

Bunun gibi? Eh, PoC yok, ama yine de ilginç: forums.grsecurity.net/…
Lenniey

Bu fikri seviyorum, ancak önemli bir dezavantajı var: sudofind şimdi sistemdeki herhangi bir yazılım (örneğin RPM) paketinin bir parçası olmayan bir ikili dosyadır. Eğer dağıtım "find" için bir yama gönderirse, sudofind güncellenmez.
Troels Arvin

2
@TroelsArvin Bu mutlaka kötü bir şey değil. Bu yetenekler için tasarlanmamış mevcut bir yardımcı programa setuid benzeri özellikler ekliyorsanız, güncellenen yardımcı programın standart olmayan cihazınızla güvenle kullanılabileceğini doğrulamadan önce temel yardımcı programda herhangi bir güncelleme istemezsiniz. yetenekleri. Bu durumda, bir güncellemenin, findkullanıcı tarafından sağlanan bazı kodları doğrudan awkyapabileceklerine benzer şekilde yürütme yeteneği verip vermediğini düşünün .
Andrew Henle

4
Bu konuda görebildiğim en büyük sorun, aranamayan dizinlerin altındaki dünya tarafından yazılabilir dizinlerin birdenbire yazılabilmesidir.
Tavian Barnes

2

Kullanıcılara uygun izinleri veririm.

Varsayılan olarak, umask ise 022, dizinler oluşturulur, böylece herkes içindeki dosyaları listeleyebilir ve bunlara istatistik verebilir. Değilse, dizinin iznini bitsel olarak veya eski izinleri olarak el ile değiştirebilirsiniz ve 0555:

chmod +0555 foo

Ve bu kullanıcılar bu dizinin tüm üst öğelerinde (örneğin, başka bir kullanıcının ana dizini) yürütme iznine sahip değilse, muhtemelen ilk dizini başka bir yere koymanız gerektiği anlamına gelir.

Yalnızca bazı kullanıcıların bu dizini okumasına ve yürütmesine izin vermek istiyorsanız, modunu olarak değiştirebilir, 0750bu kullanıcıları bir gruba koyabilir ve dizinin grup sahibini bu gruba değiştirebilirsiniz:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
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.