2012-01-19 15 views
12

Konfiguruję Solr za pomocą Mola. Chciałbym ograniczyć dostęp tylko do kilku adresów IP. Nie wydaje się od razu oczywiste, że można to zrobić za pomocą Mola. Czy to możliwe, a jeśli tak, to w jaki sposób?Ograniczanie adresów IP dla Jetty i Solr

+0

I myślę, że nie można bezpośrednio, bez pisania niestandardowego programu obsługi lub filtru. W każdym razie możesz umieścić pomost za innym serwerem sieciowym, takim jak Apache. – Chewie

Odpowiedz

25

Solr 4.2.1 używa Mola 8.1.8. Molo 8 (jak zauważył jonas789) nie obsługuje .htaccess. Zamiast tego używa IPAccessHandler, który nie ma dobrej dostępnej dokumentacji. Musiałem się z tym trochę pogodzić, żeby to działało, więc zamieszczam tutaj zaktualizowane rozwiązanie.

IPAccessHandler zarządza czarną listą i białą listą, akceptuje dowolne zakresy adresów IP oraz obsługuje dołączanie określonych ścieżek URI do każdego wpisu white/black -list. IPAccessHandler również podklasy HandlerWrapper, które okazują się ważne.

Aplikacja solr nadal żyje w WebAppContext (podobnie jak w rozwiązaniu Lyndsaya), ale WebAppContext jest teraz zarządzany przez ContextHandler, który znajduje się w ContextHandlerCollection zajmując gniazdo pierwszego manipulatora na serwerze. Aby powstrzymać żądania od niewłaściwego adresu IP przed dotarciem do aplikacji, musimy umieścić ją wewnątrz IPAccessHandler gdzieś wzdłuż tej ścieżki. IPAccessHandler zachowuje się dziwnie, jeśli jest w niewłaściwym miejscu: Próbowałem wstawić go przed do obsługi kontekstu i dało 403 Zabronione na niewłaściwe maszyny, rzucił napad złości NullPointerException bez dodatkowych komunikatów o błędach, wszelkiego rodzaju nonsens. W końcu udało mi się to osiągnąć poprzez zawinięcie samej ContextHandlerCollection na poziomie serwera.

Przejdź do etc/jetty.xml i przejdź do sekcji obsługi. Następnie zawinąć istniejący element ContextHandlerCollection następująco:

<!-- =========================================================== --> 
<!-- Set handler Collection Structure       --> 
<!-- =========================================================== --> 
<Set name="handler"> 
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> 
    <Set name="handlers"> 
    <Array type="org.eclipse.jetty.server.Handler"> 
    <Item> 

    <!-- here begins the new stuff --> 
    <New class="org.eclipse.jetty.server.handler.IPAccessHandler"> 
     <Call name="addWhite"> 
     <Arg>xxx.xxx.xxx.xxx</Arg> 
     </Call> 
     <Set name="handler"> 
     <!-- here's where you put what was there before: --> 
     <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> 
     </Set> 
    </New> 
    <!-- here ends the new stuff --> 

    </Item> 
     <Item> 
     <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> 
     </Item> 
     <Item> 
     <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/> 
     </Item> 
    </Array> 
    </Set> 
    </New> 
</Set> 

Zasoby:

+0

Próbowałem go i działa idealnie! Blokuje dostęp do 'solr admin' i' client' używanego z innych hostów niż ten, z którego korzystasz. – h4k1m

+0

I niezależnie przybywa do tego samego rozwiązania; Nie znalazłem tego pierwszy. FYI to IPAccessHandler działa tylko z IPv4 - jest to błąd/ograniczenie. Dlatego przy uruchamianiu Java przepuść: '-Djava.net.preferIPv4Stack = true'. A dla tych, którzy szukają sugerowanych zasad, moje wygląda następująco: 127.0.0.1 -.-.-.-// solr/techproducts/select W ten sposób localhost może zrobić wszystko, a wszyscy inni są poważnie ograniczeni do pewnych "core" i/wybierz Solr RequestHandler. –

8

Znalazłem rozwiązanie.

Najpierw wyodrębnij zawartość solr.war w folderze example/webapps. Następnie należy utworzyć plik o nazwie .htaccess i umieścić go na przykład/webapps/folderu solr (ten, który właśnie wyodrębniony) zawierający następujące:

<Limit> 
    satisfy all 
    order deny,allow 
    deny from all 
    allow from xxx.xxx.xxx.xxx 
</Limit> 

Na przykład edytować plik/etc/jetty.xml i komentarz część org.mortbay.jetty.deployer.WebAppDeployer. Wreszcie utworzyć folder na przykład/zwanych kontekstach (jeśli jeszcze nie istnieje) i dodać plik o nazwie solr.xml do niego zawierający:

<Configure id="solr" class="org.mortbay.jetty.webapp.WebAppContext"> 
    <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/solr</Set> 
    <Set name="contextPath">/solr</Set> 
    <Call name="setSecurityHandler"> 
     <Arg> 
      <New class="org.mortbay.jetty.security.HTAccessHandler"> 
       <Set name="protegee"> 
        <Ref id="solr"/> 
       </Set> 
      </New> 
     </Arg> 
    </Call> 
</Configure> 

następnie uruchomić nową bezpieczną Solr!

+3

Dla innych, to nie zadziała w nowszych wersjach Jetty hostowanych na Eclipse. Zasadniczo nie ma już HTAccessHandler. Odniesienia: http://jetty.4.n6.nabble.com/jira-Created-JETTY-962-Clean-room-implementation-of-org-mortbay-jetty-securtiy-HTAccessHandler-td41205.html – jonas789

Powiązane problemy