SUDOERS aracılığıyla belirli bir dizindeki komutların çalıştırılması nasıl kısıtlanır?


13

Bir kullanıcının sistemdeki herhangi bir dosya veya dizinde chownve chmodkomutlarını çalıştırmasına izin vermek için sudo (sudoers dosyası aracılığıyla) yapılandırabilirim . Ancak, yalnızca bir kullanıcıya /var/www/htmldizinin altındaki dosyalarda bu komutları çalıştırma izni vermek istiyorum .

Ayrıcalıklı komutları, kullanıcının bunları yalnızca önceden belirlenmiş bir dizinde çalıştırabilecek şekilde nasıl kısıtlayabilirim?

Örneğin: Aşağıdaki komut index.htmldosyaya 777 izin verir .

sudo chmod 777 /var/www/html/index.html

Şimdi iki işlem yapmak istiyorum

  1. sudoKullanıcının yalnızca içinden chmodve chowniçinden çalışabileceği şekilde kısıtla/var/www/html

  2. Kullanıcının bu komutları sistemde başka bir yerde yürütmesine izin verme (örn. Komutlar çalıştırılamaz /var/wwwveya /var/ftp)


1
Lütfen çapraz gönderi yapmayın - superuser.com/questions/456662/…
Ulrich Dangel

7
Bu gerçekten doğru yol mu? Bir www-datagruba chmod/ chownherhangi bir şeye olan ihtiyacı ortadan kaldıracak mısınız?
sr_

Güzel. Bu şekilde kolayca kök elde edebilirsiniz. Vazgeçmek çok kötü bir fikir chown. Bunun dışında neden chmodkök olarak çalıştırılmasının bir gerekçe göremiyorum .
Nils

Yanıtlar:


13

Sorduğunuz şey imkansız olmasa bile zor. Belirli bir dizinin altındaki chownve chmoddosyalarının uygulamasını kısıtlasanız bile, birisi yine de sembolik bir bağlantı iletebilir ve bu nedenle dosyaları istedikleri yerde etkileyebilir.

Neyse ki, yapmaya çalıştığınız şeyin gerçek probleminiz için doğru çözüm olmaması büyük olasılıktır ve çalışan başka bir yöntem vardır.

Genellikle, altında dosya oluşturmak ve değiştirmek için ek izinlere ihtiyaç duyan kullanıcılar /var/wwwbir gruba eklenir (genellikle www-datasitenin farklı bölümleri için farklı gruplarınız olabilir). Grup sahipliğini ve setgid dizinlerini kullanabilirsiniz: gruptaki chgrp www-data /var/www/html; chmod g+ws /var/www/htmlherkesin dizine www-datayazmasına izin verir /var/www/htmlve bu dizinde oluşturulan dosyalar www-data, dosyayı oluşturan kullanıcının birincil grubu yerine gruba ait olur. Ancak, bu çok esnek değil.

Muhtemelen yapmanız gereken, altındaki dosyalar için erişim kontrol listeleri oluşturmaktır /var/www. İlk olarak, ACL'lerin etkinleştirildiğinden emin olun: açık olan dosya sistemi seçeneğe /var/wwwmonte edilmelidir acl. Bu konuda yardım için bkz. Dizindeki tüm yeni dosyaları bir grup için erişilebilir hale getirme . Ayrıca ACL yardımcı programlarını ( getfaclve setfacl) yükleyin . Ardından /var/www/html, onlara sahip olması gereken kullanıcılara altındaki ağaca ekstra izinler verin . Kullanıcı başına EKL'ler belirleyebilirsiniz, ancak aynı haklara sahip olması gereken kullanıcıları bir gruptaki dosya sistemine koymak ve o grup için EKL'leri ayarlamak genellikle daha kolaydır. Örneğin, gruptaki kullanıcıların html-writersaşağıdaki ağaca okuma-yazma erişimi olması gerekiyorsa /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html

Hakkında "Bu çok esnek değil" (Paragraf 3 sonunda) - neden değil mi? İnsanların belirli bir grupta olması gerektiği için mi? (İzinler ve ACL ve ilgili şeyler hakkında neredeyse hiçbir şey bilmiyorum.)
KajMagnus

3
@KajMagnus Kök, grupları yönetmek zorunda olduğu için esnek değildir ve dosyalar yalnızca tek bir gruba ait olabilir. ACL, herhangi bir kullanıcının sahip olduğu dosyalara kimlerin erişebileceğini seçmesine izin verir ve bir ACL'de birden fazla kullanıcı ve gruptan bahsedilebilir.
Gilles 'SO- kötü olmayı kes'

2

"Kullanıcım" tarafından kullanılacak /etc/sudoerskomutu, visudoadd komutuyla dosyadaki tüm bağımsız değişkenlerle kısıtlayabilirsiniz :

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

Her işlem için günlüğe kaydetmeyi etkinleştir:

Defaults logfile=/var/log/sudo.log

örnek çıktı:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Sudo kullandığınızda, "kullanıcım" ın güvenilir bir kişi olması gerekir. Dosya izinlerine dikkat edin, kötü amaçlı bir sudo kullanıcısının bir dosyayı harici bir kaynaktan bağlamasını ve değiştirmesini engellemenin basit bir yolu yoktur.


Daha önce denedim, ama şu şekilde bir hata verdi: Üzgünüm, kullanıcı prashant '/ bin / chmod 777 / var / www / html / a' prashant.xyz.com kök olarak yürütmek için izin verilmiyor.
PrashantB

su - prashantveya ile kullanıcı değiştirdiniz su prashantmi?
tombolinux

Evet, prashant kullanıcısı tarafından komut çalıştırıyorum. Forumları okudum, komutların sistem çapında çalıştığını söylüyorlar. Kimse böyle bir konu hakkında yazmaz.
PrashantB

Ben koşuyorum ooo :). Ancak bu statik komut olacaktır. / Var / www / html altındaki herhangi bir dosyaya izin verebilmem için genel yapabilir miyiz?
PrashantB

3
Bu tamamen güvensizdir: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdVe bunu bir şekilde düzeltirseniz,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'SO- kötü olmayı durdurun'

1

Belirli bir dosya veya dizinde yapılan değişiklikleri kısıtlamak için bir Bash (veya seçtiğiniz kabuk) komut dosyası oluşturarak bunu yapmanın aslında oldukça basit bir yolu var.

Örneğinizde şöyle görünür:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Sonra sudoers dosyasını, www-data'nın / usr / local / bin / mychmod uygulamasına izin verecek şekilde değiştirirsiniz.

Bununla birlikte, bu alana kullanıcı girişinin (örneğin, kullanıcının hangi dosya veya dizinin chmodded olduğunu değiştirmesine izin vermenin) son derece tehlikeli olduğunu ve böyle bir şey yapmak istiyorsanız enjeksiyon saldırılarını nasıl filtreleyeceğinizi bilmeniz gerektiğini unutmayın. söyledi. Saldırgan, sistem güvenliğini etkili bir şekilde tehlikeye atarak herhangi bir komutu root olarak bu şekilde yürütebilir.


Bu son derece tehlikeli ve gerçekten çözümü çözmüyor ...
SomeGuy
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.