80 ve 443 sistem bağlantı noktaları olmasına rağmen, çoğu web sunucusu bunlara nasıl bağlanabiliyor?


18

80 numaralı bağlantı noktasına bağlanan bir web hizmeti çalıştırmak genellikle sudoer ayrıcalıkları gerektirmez. 80/443 numaralı bağlantı noktaları sistem bağlantı noktaları olduğundan, yalnızca ayrıcalıklı kullanıcılar tarafından kullanılabildikleri için, bu hizmetler nasıl bu bağlantı noktalarına hala bağlanabilir?



1
"genellikle sudoer ayrıcalıkları gerektirmez" yanlış.
tedder42

Yanıtlar:


29

Temel olarak iki farklı yaklaşım vardır:

  1. Başlangıçta root olarak çalışmaya başlayın, ayrıcalıklı bağlantı noktasına bağlanın ve ardından ayrıcalıksız bir kullanıcıya bırakın.

  2. inetd veya xinetd ayrıcalıklı çalışır ve istekleri ayrıcalıksız çalışan web sunucusuna iletir.


3
Linux'ta ayrıca CAP_NET_BIND_SERVICE özelliğini programa uygulayabilir veya bir sistem bağlantı noktasını normal bir bağlantı noktasına yeniden yönlendirmek için iptables kullanabilirsiniz.
Zan Lynx

10
ve sadece OP için açıklığa kavuşturmak için: # 1 seçeneğinin çalışmasının nedeni, işlemler ayrıcalık bıraktığında, dosyaların ikinci kez açılmasına izin verilmeseler bile açık dosya tanımlayıcılarını korumalarına izin verilmesidir.
strugee


5

80/443 numaralı bağlantı noktası sistem bağlantı noktaları olduğundan, bunlar yalnızca ayrıcalıklı kullanıcılar tarafından kullanılabilir

Bence yanlış anladın. Herkes bu bağlantı noktalarını kullanabilir. Onlara bağlanmak ayrıcalıklı bir işlemdir.

Buradaki mantık, bazı Joe kullanıcılarının kötü amaçlı bir web sunucusu yazamaması ve ardından herhangi bir yönetici haklarına sahip olmadığı bir ana bilgisayar yapmaması gerektiğidir. Tabii ki bu oldukça zayıf bir model, genellikle Joe'nun kendi bilgisayarını ağa koymasını engelleyen hiçbir şey yoktur ve fiziksel erişimi olan herhangi bir makineye yönetici haklarına sahip olabilir.

Netcat ile bir gösteri yapacağım.

Sıradan bir kullanıcı olarak, bağlantı noktası 80'e bağlanamıyorum:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

8080 numaralı bağlantı noktasına bağlanabilirim:

$ nc -l -p 8080

Bu arada başka bir terminalde, 80 numaralı bağlantı noktasına bağlanabilir ve bazı veriler gönderebilirim ve yeni başladığım sunucu sonunda görüyorum:

$ nc 127.0.0.1 8080 <<<"Hello world"

Bağlantı noktası 80'e bağlanmak istiyorsanız, kök olmalıyım:

$ sudo nc -l -p 80

Ya da ben ikiliğe CAP_NET_BIND_SERVICEyeteneği atayabilir nc:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

Başka bir seçenek, sunucu programını, çağrıldıktan sonra listen()kök ayrıcalıklarını düşürecek şekilde yazmaktır . Bu oldukça yaygın bir çözümdür ve bunu pek çok cin ile göreceksiniz. Örneğin Apache, init'ten root olarak başlar ve daha sonra root ayrıcalıklarını bırakır ve www-data80 numaralı bağlantı noktasına bağlandıktan sonra kullanıcı veya benzeri bir şey haline gelir /etc/init.d/apache start.


Soru "bu portlara bağlan" diyor. Neden yanlış olduğunu düşünüyorsun?
Barmar
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.