piątek, 31 stycznia 2014

Tomcat - RequestFilterValve

Zabezpieczenie po IP

Czasem trzeba się zabezpieczyć przed dostępem do niektórych zasobów Tomcat-a. Wprawdzie ta metoda nie jest zbyt skuteczna, ale na początek można ją spróbować.

Przykładowa definicja:
<Context>
  ...
  <Valve className="org.apache.catalina.valves.RemoteHostValve"
         allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         deny="192\.168\.1\.\d+"/>
  ...
</Context>
Można powiedzieć że jest w tym przykładzie zdefiniowany łańcuch 2 obiektów Value.
Jak tylko dojdzie do RemoteHostValve to na pewno go wykona jak, nie wywali w tym czasie błędu 403 to wykona również RemoteAddrValve. Wiec to oznacza że do RemoteAddrValve może nie wejść.

Podczas badania jak działa RequestFilterValve wyszły mi następujące wnioski:

Dane do sprawdzania
  • request.getRemoteAddr() - adres IP z requesta
  • request.getRemoteHost() - nazwa hosta


Kolejność sprawdzania
  • denies jak przejdzie idzie dalej
  • allows jak przejdzie idzie dalej
  • jak doszło do tego miejsca i jest ustawione denies i nie ustawione allows to idzie dalej
  • wywala 403

Scenariusz testów

Dodaje definicję w/w value do tomcat/conf/server.xml w sekcji Host tak jak access log
Moja maszyna ma IP 192.168.1.10
Mój Tomcat ma connector https na porcie 443.
Odpalam Tomcat-a 
Z przeglądarki pytam https://192.168.1.10/manager/html/ - powinno mnie wpuścić
Z przeglądarki pytam https://127.0.0.1/manager/html/ - powinno dać komunikat 403
Definicję value przenoszę do tomcat/conf/context.xml - spawdzam działanie
Definicję value przenoszę do tomcat/conf/Catalina/localhost/ap-xxxx.xml - spawdzam działanie

Wnioski:

  • przy ustawionych denies i allows - definicja denies powinna być bardziej szczegółowa niż allows, dlatego że inaczej nie wejdzie do sprawdzenia allow
  • prawdopodobnie lepiej jest zdefiniować kilka value z pojedynczymi definicjami denies albo allows
  • można dla definicji denies i allows podać dowolne wyrażenie regularne przyklady z ip oczywiście są sensowne, ale może to być cokolwiek. Warto zwrócić uwagę na znaki \ 
  • dla definicji denies i allows można podać kilka wartości oddzielonych znakiem "," Zostaną one zamienione na tablicę Pattern[]

Źródła:

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Request_Filters
http://fossies.org/dox/apache-tomcat-6.0.37-src/RequestFilterValve_8java_source.html

Brak komentarzy:

Prześlij komentarz