it-swarm-tr.com

Kullanıcının 1024'ten düşük bir bağlantı noktasını dinlemesine izin verme

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ı?

65
peoro

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 .

53
Rohan Monga

(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.

Ayrıntılar için kılavuz sayfasını okuyun .

4

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.

Bununla birlikte, düşük bağlantı noktalarına root olmayan erişimi yetkilendirmek için bir program authbind . selinux ve grsecurity hem de bu tür ince ayarlı kimlik doğrulama için çerçeveler sağlar.

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!

4
Caleb

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.

3
jamespo

İ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).

1
Craig McQueen