2012-05-08 15 views
13

Chcę ograniczyć dostęp do niektórych adresów URL w mojej webcapie Tomcat. Tylko 3 znane adresy IP powinny mieć dostęp do adresów URL, które pasują do określonego wzorca.Jak mogę ograniczyć dostęp do niektórych adresów URL przez źródłowy adres IP w Tomcat?

np. http://example.com:1234/abc/personId

Jak mogę to osiągnąć?

+1

Jak ty podejmowaniu decyzji, czy zezwolić lub odmówić dostępu? Według adresu IP? Zalogowany użytkownik? Według regionu geograficznego? Dlaczego masz tam iptables? iptables nie zna adresu URL, który może być używany. Jakiego stosu działa twój serwer sieciowy i od jakiego momentu w architekturze sieciowej chcesz odmówić dostępu? – Cheekysoft

+0

To naprawdę nie jest jasne, o co pytasz. Czy ten komputer jest serwerem WWW i próbujesz ograniczyć dostęp do obsługiwanych adresów URL? A może to urządzenie jest skrzynką NAT? Lub odwróć proxy? –

+0

przez ip. Mam trzy IPS od tylko potrzebuję dostępu. Chcę zakazać wszystkim innym programom za pomocą api. – Randeep

Odpowiedz

0

bym nie ograniczać dostępu na podstawie adresu IP, z następujących powodów:

  • Robi tak dalej powiedzieć adresy wewnętrzne, na przykład 10.0.0.0/24 oznacza, że ​​domyślnie ufasz temu całemu zakresowi. Co się stanie, jeśli zostanie naruszony?
  • Nie wszyscy Twoi klienci mogą lub będą mogli uzyskać statyczne adresy IP - zakładając, że możesz chcieć umożliwić niektórym klientom dostęp.
  • Klienci korzystający z urządzeń bramkowych, w których serwery proxy nie obsługują numerów x-forwarded-for, będą mieć adres IP urządzenia bramy; ufając, że IP zaufa wszystkim za bramą, ponownie zakładając, że możesz chcieć dać niektórym klientom dostęp.

Zamiast tego, jeśli potrzebujesz uruchomić system, w którym niektóre połączenia są dostępne tylko dla określonych użytkowników, użyłbym uwierzytelnienia - certyfikaty po stronie klienta SSL działają całkiem dobrze w tym celu. Alternatywnie możesz użyć czegoś takiego jak OAuth.

+0

Dziękuję za odpowiedź. Chodzi o to, że mój serwer dostarcza informacje do aplikacji mobilnych. Więc mam dużo publicznych api. Nie mogę zablokować ich publicznie. Ale są też prywatne api.To powinno być dostępne tylko z trzech wewnętrznych systemów. I nie mogę dodać dodatkowych mechanizmów uwierzytelniania. – Randeep

4

można zrobić z tym w server.xml:

<Valve 
    className="org.apache.catalina.valves.RemoteAddrValve" 
     deny="117.40.83.*,122.224.95.*,119.255.28.*,218.8.245.*,218.85.139.*,219.117.197.*,124.89.39.*,58.18.172.*,180.153.225.*" 
     /> 

(są to rzeczywiste adresy IP: właściciele, wiesz dlaczego: - |), ale jak widać jest to naprawdę nie bloker włączać. Lepszym rozwiązaniem byłoby umieszczenie przed nim Apache HTTPD za pomocą instrukcji Deny All i Allow From, które pozwolą ci tylko na 3 adresy IP potrzebne do uzyskania dostępu do usługi.

+0

Można dodawać tylko zawory do elementów kontenera (silnik, host, kontekst). Możesz ograniczyć je do podzbioru adresów URL w aplikacji. Do tego potrzebna jest wersja Filter. –

+0

Warto zauważyć, że ta odpowiedź dotyczy Tomcat 6. W Tomcat 7 zmieniła się składnia, ponieważ cały wpis jest wyrażeniem regularnym. –

11

Użyj org.apache.catalina.filters.RemoteAddrFilter i zamapuj go na adres URL, który chcesz chronić. Aby uzyskać szczegółowe informacje na temat konfiguracji, patrz http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_Address_Filter.

+0

mój adres URL zaczyna się od portu! to nie działa dla mnie. I dodaje następujące linie w server.xml Remote Address Filter org.apache.catalina.filters.RemoteAddrFilter pozwalają 122 \ 0,167 \ 0,211 \ 0,31 ## moje ip Remote Address Filter /abc/* ## dla http://example.com:1234/abc/(personId) Randeep

+1

Filtry nie są zdefiniowane w pliku server.xml, są zdefiniowane w pliku web.xml. Traktuj go jak normalny filtr serwletów. –

+0

Przepraszam, ale twój URL zaczyna się od portu ???? A ten port to nie port tomcat? Jak twój api działa na kocura? –

2

Można użyć coś takiego do blokowania adresów IP, a jeśli jesteś za pełnomocnika:

<Context path="/manager" docBase="manager" reloadable="true" privileged="true" > 
    <Valve className="org.apache.catalina.valves.RemoteIpValve"/> 
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="<your IP regex>"/> 
</Context>