Belirli bir ip: bağlantı noktasında bir web sunucusu başlatmak için sudo neden gereklidir?


9

Debian kutumda Python tabanlı bir web sunucusu kuruyorum.

Kurmak:

  • Debian işletim sistemi VM tabanlıdır, ancak VirtualBox'ı NAT'tan Bridged'a değiştirdim.
  • VM kurulumunun IP'si = 192.168.1.7(yönlendiricimin yönetici ekranına veya ifconfig).
  • Hem ssh hem de HTTP için yönlendiricimin bağlantı noktası yönlendirmesini başarıyla ayarladım.
  • Başarıyla yönlendiricimin dinamik dns dyndns.com kullanarak kurdum.

Kullandığım belirli Python web sunucusu ne olursa olsun (Django, CherryPy, standart kütüphane), kullanarak web sunucusu @ 192.168.1.7:80 başlatmak zorunda sudo. Aksi takdirde, bağlantı noktasına erişim iznine sahip olmamakla ilgili bir hata alıyorum. Web sunucusu öğreticilerinin hiçbiri sudobir ip: bağlantı noktası belirtirken kullanılması gerektiğini belirtmez.

Soru: sudoBu web sunucularını başlatmak için neden kullanmalıyım ? Kullanmamam gerektiğinin bir göstergesi 192.168.1.7mi? Yoksa bir yerde bir yapılandırma dosyası düzgün ayarlamıyor musunuz?

Yanıtlar:


11

Yalnızca kök izinleri olan işlemler ayrıcalıklı bağlantı noktalarını dinleyebilir. Bu standart bir Unix güvenlik kuralıdır.


Web sunucularını 80'de sudo kullanarak başlatmak yaygın mıdır? Ya da 1024'ten büyük bir bağlantı noktası kullanmak için başka bir strateji var mı (örneğin 8000, 8080)?
Begbie00

@ Begbie00 Evet, web sunucularını daha yüksek bağlantı noktalarında çalıştırmak oldukça yaygındır. Ancak çoğunlukla internette herkese açık olarak erişilemeyen veya kullanıcıların kök izinlerine sahip olmadığı makinelerde çalışan web sunucuları için kullanılır. Geliştirme ve test için kullanılan web sunucuları neredeyse tamamen ayrıcalıklı olmayan bağlantı noktalarında çalışır.
Šimon Tóth

2
Ne yazık ki bu ifade modern unix sistemleri için tam olarak doğru değildir. Ayrıntılar için cevabımı görün, ancak modern Linux örneğin CAPABILITIES kullanarak daha ayrıntılı izin denetimine izin verir. Solaris ayrıca RBAC adı verilen hassas bir güvenlik sistemine sahiptir. Bu mekanizmalar, belirli kullanıcılara veya programlara ayrıcalıklı bağlantı noktalarına bağlanma gibi izinler atanmasına izin verir.
SkyBeam

14

Ayrıcalıklı olmayan kullanıcıların ayrıcalıklı bağlantı noktalarına (1024'ün altındaki bağlantı noktası numaraları) bağlanmasına izin verilmemesi standart davranıştır. Bu nedenle, örneğin bağlantı noktası 80'e bağlanmak isteyen bir uygulamanın, bu bağlantı noktasına bağlanmak için ayrıcalıklı (genellikle bu, kök olarak çalıştırmak anlamına gelir) çalışması gerekir.

Ortak bir yaklaşım, bağlantıyı kabul eden ve daha sonra isteği işlemek için ayrıcalıklı olmayan bir süreç oluşturan ayrıcalıklı kullanıcıyla küçük bir "dinleyici" süreci çalıştırmaktır. Güvenlik nedeniyle istek işleme için bırakma ayrıcalıkları yapılır. Birisi isteği işleyen işlemden yararlanabiliyorsa, genellikle davetsiz misafirin işleme işlemiyle aynı ayrıcalıkları kullanarak komutları yürütmesine izin verir. Bu nedenle, tüm isteği ayrıcalıklı bir işlem kullanarak ele almak kötü olur.

Bununla birlikte, birçok uygulama için günümüzde kök olmayan olarak çalışmak yaygındır; ancak bu tür işlemler elbette ayrıcalıklı bağlantı noktalarına daha sonra standart yapılandırmada bağlanamaz. Bu yüzden Tomcat veya JBoss gibi sunucular 8080 gibi yüksek bağlantı noktalarına bağlanırdı, böylece ayrıcalıklı bir dinleyiciye ihtiyaç duymazlar.

Elbette böyle bir işlemi internete maruz bırakırsanız, her tarayıcı ilk önce HTTP protokolü kullanıldığında 80 numaralı bağlantı noktasına bağlanmaya çalışacağı için muhtemelen 80 numaralı bağlantı noktasına erişim sağlarsınız. Bunu sağlamak için yaygın olarak kullanılan çözüm, uygulama ve genel internet arasında bir güvenlik duvarı veya bağlantı noktası çevirmeni kullanmaktır. Bu nedenle, istekler güvenlik duvarı 80 numaralı bağlantı noktasını isteyen güvenlik duvarına çarptı, ancak güvenlik duvarı isteği 8080 numaralı bağlantı noktasında bir iç ana bilgisayara iletir. Bu şekilde, gerçek web sunucusu 80 numaralı bağlantı noktasında halka açıkken yüksek bağlantı noktalarında çalışabilir.

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

Bazen bu yönlendirme basitçe iptablesNAT kuralı kullanılarak yapılır :

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Bu, 8080 numaralı bağlantı noktasını dinlerken ayrıcalıklı olmayan bir uygulamanın çalıştırılmasına izin verirken, 80 numaralı bağlantı noktasına gelen tüm istekler yalnızca 8080 numaralı bağlantı noktasına yeniden yönlendirilir.

Ancak modern Linux çekirdekleri kullanmanın başka bir olasılığı daha var: Kullanım yetenekleri.

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

Bu, binaryroot olmayan kullanıcıdan başlatılmış olsa bile ayrıcalıklı bağlantı noktalarına bağlanmaya izin verir . Daha man capabilitiesfazla bilgi için bakınız.


Yetenekler POSIX'in bir parçası mı yoksa sadece Linux'a özgü mü?
Šimon Tóth

@Let_Me_Be en.wikipedia.org/wiki/Capability-based_security'den anladığım kadarıyla POSIX, yetenek tabanlı bir kavram tanımladı, ancak Linux'ta uygulanandan farklı. Bu yüzden CAP_NET_BIND_SERVICE gibi Linux yeteneklerinin yalnızca Linux'a özgü olduğunu düşünüyorum.
SkyBeam
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.