Bir kullanıcının (root'tan farklı) 80 numaralı bağlantı noktasını dinleyen bir sunucuyu çalıştırmasına izin vermem gerekiyor.
Bunu yapmanın bir yolu var mı?
Bir kullanıcının (root'tan farklı) 80 numaralı bağlantı noktasını dinleyen bir sunucuyu çalıştırmasına izin vermem gerekiyor.
Bunu yapmanın bir yolu var mı?
Yanıtlar:
setcap 'cap_net_bind_service=+ep' /path/to/program
bu belirli süreçler 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'lara eklemeniz gerekir.
Daha fazla bilgi için bu tartışmaya bir göz atın .
(Bu yöntemlerden bazıları diğer cevaplarda da belirtilmiştir; Ben kaba tercih sırasına göre birkaç olası seçenek veriyorum.)
Düşük bağlantı noktasını yüksek 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
Ayrıcalıklı bağlantı noktasını dinlemeye başladıktan sonra sunucunuzu kök olarak atabilir ve ayrıcalık olarak bırakabilirsiniz. Tercihen, kendiniz kodlamak yerine, sunucunuzu sizin için işi yapan bir paketleyiciden başlatın. Sunucunuz bağlantı başına bir örnek başlatırsa, onu başlatın inetd
(veya benzeri bir programdan xinetd
). Bunun için aşağıdaki inetd
gibi bir satır kullanın /etc/inetd.conf
:
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
Sunucunuz tek bir durumda dinliyorsa, onu gibi bir programdan başlatın authbind
. Ya boş bir dosya oluşturun /etc/authbind/byport/80
ve sunucuyu çalıştıran kullanıcı tarafından çalıştırılabilir hale getirin; veya /etc/authbind/byuid/1234
1234 sunucuyu çalıştıran UID'nin olduğu, satırı içeren oluşturma 0.0.0.0/0:80,80
.
Sunucu yürütülebilir özelliklerini destekleyen dosya sistemi üzerinde saklanıyorsa, bunu verebilir yeteneği . Yeteneklerin hala göreceli olarak yeni olduklarını ve hala birkaç sorun yaşadıklarını unutmayın .cap_net_bind_service
setcap cap_net_bind_service=ep /path/to/server/executable
-A INPUT -p tcp --dport 1080 -j ACCEPT
işe yaramadığı gibi bir filtre kuralı da eklemek zorunda kaldım (aynı zamanda -j DROP
hepsini yakaladım.) Bu yüzden iki dinleme soketi ile ayrıldım.
Kısa cevap, bunun tasarım tarafından mümkün olmadığıdır.
Uzun cevap, açık kaynak dünyalarında, tasarıma oynayan ve alternatif yöntemlerle ortaya çıkan birçok insan var. Genel olarak, bunun mümkün olmaması gerektiği yaygın olarak kabul gören bir uygulamadır. Muhtemelen denediğiniz gerçeği, sisteminizde başka bir tasarım hatası olduğunu ve tüm sistem mimarinizi * nix en iyi uygulamalar ve güvenlik uygulamaları ışığında yeniden gözden geçirmeniz gerektiği anlamına gelir.
Bununla birlikte, düşük bağlantı noktalarına root dışı erişim yetkisi veren bir program authbind'dir . Hem selinux hem de grsecurity ayrıca bu gibi ince ayarlanmış kimlik doğrulama için çerçeveler sağlar.
Son olarak, belirli kullanıcıların belirli programları root olarak çalıştırmasını istiyorsanız ve gerçekte ihtiyacınız olan şey sadece bir kullanıcının apache'yi veya benzer bir şeyi yeniden başlatmasına izin vermek sudo
, arkadaşınız!
Sen kullanabilirsiniz Netcat'i veya Xinetd veya iptables port yönlendirme veya bir ön uç proxy gibi apache kullanmak ve ayrıcalıklı olmayan bağlantı noktasında işlemini çalıştırın.
Authbind , @Gilles zaten ondan bahsetti, ama biraz genişletmek istiyorum.
Elverişli erişim kontrolüne sahiptir (man sayfasındaki detaylar): girişi port, arayüz adresi, kullanıcı adı, adres veya port aralığına ve bunların birleşimine göre filtreleyebilirsiniz.
Çok faydalı bir parametresi var --depth
:
- seviye seviyeleri
Authbind'in, çağıran grafikte derin olan programları etkilemesine neden olur. Varsayılan 1'dir.
"Derinlik seviyeleri", bir komut dosyasının (veya programın) başka bir komut dosyasını çalıştırdığında, bir seviyeye indiği anlamına gelir. Öyleyse --depth 5
, 5 üzerinden seviye 1 (veya 0 mı?) Anlamına gelirse , bağlama izniniz vardır, oysa seviye 6 ve üzeri ise, bunu yapamazsınız. Bir komut dosyasının erişime sahip olmasını istediğinizde, ancak sizin bilginizle veya habersiz çalıştığı programları kullanmamanız durumunda kullanışlıdır.
Açıklamak gerekirse, bunun gibi bir şeye sahip olabilirsiniz: güvenlik uğruna, java
yalnızca java çalıştıracak bir kullanıcınız var ve ona 80 numaralı bağlantı noktasına erişmesine izin vermek istiyorsunuz:
echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80
Oluşturduğum ../byport/80 file
, bunu verilen java
kullanıcılar grubuna (her kullanıcının kendi grubu vardır) ve bu tarafından çalıştırılabilir demektir grup tarafından çalıştırılabilir yapılan java
kullanıcı. Bağlantı noktasına göre erişim veriyorsanız, dosyanın erişimi olması gereken kullanıcı tarafından çalıştırılabilir olması gerekir, bu yüzden bunu yaptık.
Bu ortalama Joe için yeterli olabilir, ancak nasıl kullanılacağını biliyorum çünkü --depth
parametre, siz (olarak çalıştırmak java
kullanıcı) authbind --depth [depth] my_web_app's_start_script
başlayan --depth 1
ve çalışır en küçük derinlik bulacak ve kullanana kadar yol kadar çalışan.
İptables PREROUTING REDIRECT yöntemini denedim, ancak bunun iletilen paketleri de etkilediğini gördüm. Diğer bir deyişle, makine arabirimler arasında da paketleri iletiyorsa (örneğin, bir Ethernet ağına bağlı bir Wi-Fi erişim noktası görevi görüyorsa), iptables kuralı ayrıca bağlı müşterilerin İnternet hedeflerine olan bağlantılarını yakalar ve yönlendirir. makine. İstediğim bu değildi; sadece makineye yönlendirilen bağlantıları yönlendirmek istemiştim.
Bir olasılık, TCP portu yönlendirmeyi kullanmaktır. Örneğin socat
:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
Bununla birlikte, bu yöntemin bir dezavantajı, 8080 nolu 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).