Soru 80 ve 443 sistem portları olsa da, çoğu web sunucusu bunlara nasıl bağlanabiliyor?


Bağlantı noktası 80'e bağlanan bir web hizmetini çalıştırmak genellikle sudoer ayrıcalıklarına ihtiyaç duymaz. 80/443 portları sistem portları olduğu için, sadece imtiyazlı kullanıcılar tarafından kullanılabilirler, bu hizmetler bu portlara nasıl bağlanabiliyor?


17
2018-01-18 18:21


Menşei


stackoverflow.com/questions/413807/... - Sam Liao
"genellikle sudoer ayrıcalıklarına ihtiyaç duymaz" yanlıştır. - tedder42


Cevaplar:


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ıklı olmayan bir kullanıcıya bırakın.

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


28
2018-01-18 18:25



Linux'ta CAP_NET_BIND_SERVICE özelliğini programa uygulayabilir veya sistem bağlantı noktasını normal bir bağlantı noktasına yönlendirmek için iptables'leri kullanabilirsiniz. - Zan Lynx
OP'ye açıklık getirmek için: 1. seçeneğin çalışmasının sebebi, süreçler ayrıcalıkları düşürdüğü zaman, açık dosya tanımlayıcılarını - ikinci kez açılmasına izin verilmese bile - saklayabilmeleridir. - strugee
Ayrıca var Authbind. - Boris the Spider


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

Sanırım yanlış anladın. Bu portları herkes kullanabilir. bağlayıcı Onlara ayrıcalıklı bir işlemdir.

Buradaki mantık, bazı kullanıcıların Joe'nun kötü niyetli bir web sunucusu yazamayacağı ve daha sonra herhangi bir yönetici haklarına sahip olmadığı bir ev sahibi yapamaması gerektiğidir. Elbette bu oldukça zayıf bir modeldir, genellikle Joe'nun kendi bilgisayarını ağa koymasını engelleyen hiçbir şey yoktur ve fiziksel erişimi olan herhangi bir makinenin yönetim haklarına sahip olabilir.

Netcat ile bir gösteri yapacağım.

Sıradan bir kullanıcı olarak 80 numaralı bağlantı noktasına 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ı veri gönderebilirim ve yeni başladığım sunucu ucunda görünebilir:

$ nc 127.0.0.1 8080 <<<"Hello world"

Eğer 80 numaralı bağlantı noktasına bağlanmak istersem kök olmalısın:

$ sudo nc -l -p 80

Ya da ben atayabilirim CAP_NET_BIND_SERVICE yeteneği nc ikili:

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

Başka bir seçenek, sunucu programını çağırdıktan sonra yazmaktır. listen() root ayrıcalıklarına düşer. Bu oldukça yaygın bir çözümdür ve onu çoğu daemon ile göreceksiniz. Apache, örneğin, init'ten root olarak başlatılır ve daha sonra root ayrıcalıklarını düşürür ve kullanıcı olur. www-data ya da 80 numaralı bağlantı noktasına bağlı olduğunda benzer bir şey. /etc/init.d/apache start Kök değil ve Apache muhtemelen başlayamaz.


4
2018-01-19 17:16



Soru "bu bağlantı noktalarına bağla" diyor. Neden yanlış olduğunu düşünüyorsun? - Barmar