Bir kullanıcının (kökten farklı) 80 numaralı bağlantı noktasını dinleyen bir sunucu çalıştırmasına izin vermeliyim.
Bunu yapmanın bir yolu var mı?
setcap 'cap_net_bind_service=+ep' /path/to/program
bu belirli işlemler için işe yarayacaktır. Ancak belirli bir kullanıcının 1024'ün altındaki bağlantı noktalarına bağlanmasına izin vermek için onu sudo kullanıcılarına eklemeniz gerekir.
Daha fazla bilgi için buna bir bakın tartışma .
(Bu yöntemlerden bazıları diğer cevaplarda belirtilmiştir; kabaca tercih sırasına göre birkaç olası seçenek veriyorum.)
Düşük bağlantı noktasını yüksek bir bağlantı noktasına yönlendirebilir ve yüksek bağlantı noktasını dinleyebilirsiniz.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
Sunucunuzu, ayrıcalıklı bağlantı noktasını dinlemeye başladıktan sonra root ve drop ayrıcalıkları olarak başlatabilirsiniz. Tercihen, kendiniz kodlamak yerine, sunucunuzu işi sizin için yapan bir sarıcıdan başlatın. Sunucunuz bağlantı başına bir örnek başlatırsa,
inetd (veya
xinetd gibi benzer bir programla başlatın. .
inetd için,
/etc/inetd.conf:
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
Sunucunuz tek bir örnekte dinliyorsa,
authbind gibi bir programdan başlatın. Boş bir dosya oluşturun
/etc/authbind/byport/80 ve sunucuyu çalıştıran kullanıcı için yürütülebilir hale getirir; veya
/etc/authbind/byuid/1234, burada 1234 sunucuyu çalıştıran ve
0.0.0.0/0:80,80.
Sunucunuzun yürütülebilir dosyası yetenekleri destekleyen bir dosya sisteminde depolanıyorsa, ona
cap_net_bind_serviceyetenek . Yeteneklerin hala nispeten yeni olduğunu ve hala birkaç karışıklığı olduğunu unutmayın .
setcap cap_net_bind_service=ep /path/to/server/executable
Authbind , @Gilles zaten bahsetti, ama biraz daha genişletmek istiyorum.
Uygun erişim kontrolüne sahiptir (man sayfasındaki ayrıntılar): erişimi port, arayüz adresi, uid, adres veya port aralıkları ve bunların kombinasyonuna göre filtreleyebilirsiniz.
Çok kullanışlı bir parametresi vardır
--depth:
--depth seviyeleri
Kimlik doğrulamasının, çağıran grafiğin derinliklerindeki programları etkilemesine neden olur. Varsayılan 1'dir.
"Düzeyler derin", bir komut dosyasının (veya programın) başka bir komut dosyasını çalıştırdığı zaman bir düzeye ineceği anlamına gelir. Eğer
--depth 5 Varsa, seviye 1'de (ya da 0 mı?) 5'e bağlanma izniniz var, oysa seviye 6'da ve üstünde, bunu yapamazsınız. Bir komut dosyasının erişmesini istediğinizde, ancak bilginizle veya bilginiz olmadan çalıştığı programlara sahip olmadığınızda kullanışlıdır.
Örneklemek gerekirse, bunun gibi bir şeye sahip olabilirsiniz: güvenlik nedeniyle, sadece Java) ve bağlantı noktasına erişim izni vermek istediğiniz
Java kullanıcısı var. 80:
echo > /etc/authbind/byport/80 chown root:Java /etc/authbind/byport/80 chmod 710 /etc/authbind/byport/80
Java kullanıcı grubuna (her kullanıcının kendi grubu vardır) verilen
../byport/80 file 'U oluşturdum ve gruba göre yürütülebilir hale getirdim, yani
Java tarafından yürütülebilir kullanıcı. Bağlantı noktasına göre erişim sağlıyorsanız, dosya erişimi olması gereken kullanıcı tarafından yürütülebilir olmalıdır, bu yüzden biz yaptık.
Bu ortalama Joe için yeterli olabilir, ancak
--depth Parametresini nasıl kullanacağınızı bildiğiniz için,
authbind --depth [depth] my_web_app's_start_script 'Dan başlayarak (
Java kullanıcı olarak)
--depth 1 ] ve çalışan en küçük derinliği bulana kadar kullanın.
Kısa cevap, bunun tasarımla mümkün olmadığıdır.
Uzun cevap, açık kaynak dünyalarında, tasarımla oynayan ve alternatif yöntemlerle gelen birçok insanın olmasıdır. Genel olarak, bunun mümkün olmaması yaygın olarak kabul gören bir uygulamadır. Deniyor olmanız büyük olasılıkla sisteminizde başka bir tasarım arızanız olduğu anlamına gelir ve tüm sistem mimarinizi * nix en iyi uygulamaları ve güvenlik sonuçları ışığında yeniden gözden geçirmelidir.
Son olarak, belirli kullanıcıların kök olarak belirli programları çalıştırmasını istiyorsanız ve gerçekten ihtiyacınız olan şey, bir kullanıcının Apache'yi veya bunun gibi bir şeyi yeniden başlatmasına izin vermektir,
Sudo arkadaşınızdır!
netcat veya xinetd veya iptables port yönlendirme kullanabilir veya Apache'yi ön uç proxy'si olarak kullanabilir ve işlemi ayrıcalıksız bir bağlantı noktasında çalıştırabilirsiniz.
İptables PREROUTING REDIRECT yöntemini denedim, ancak iletilen paketleri de etkilediğini buldum. Yani, makine ayrıca arayüzler arasında paketleri de iletiyorsa (örneğin, bir Ethernet ağına bağlı bir Wi-Fi erişim noktası gibi davranıyorsa), iptables kuralı ayrıca bağlı istemcilerin İnternet hedeflerine olan bağlantılarını da yakalayacak ve makine. İstediğim bu değildi - sadece makinenin kendisine yönlendirilen bağlantıları yeniden yönlendirmek istedim.
Bir olasılık TCP port yönlendirme kullanmaktır. Örn.
socat kullanarak:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
Bununla birlikte, bu yöntemin bir dezavantajı, 8080 numaralı bağlantı noktasını dinleyen uygulamanın, gelen bağlantıların kaynak adresini bilmemesidir (örneğin, günlük kaydı veya diğer tanımlama amaçları için).