2012-01-19 47 views
12

Tôi đang thiết lập Solr bằng Jetty. Tôi muốn hạn chế quyền truy cập vào chỉ một vài địa chỉ IP. Nó không có vẻ ngay lập tức rõ ràng rằng điều này có thể được thực hiện bằng cách sử dụng Jetty. Có thể và nếu có, làm thế nào?Hạn chế địa chỉ IP cho Cầu tàu và Solr

+0

tôi nghĩ rằng bạn không thể trực tiếp mà không cần viết trình xử lý hoặc bộ lọc tùy chỉnh. Dù sao, bạn có thể đặt cầu cảng phía sau một máy chủ web khác như Apache. – Chewie

Trả lời

25

Solr 4.2.1 sử dụng Jetty 8.1.8. Cầu cảng 8 (như được ghi chú bởi jonas789) không hỗ trợ .htaccess. Thay vào đó, nó sử dụng IPAccessHandler, không có tài liệu tuyệt vời. Tôi đã phải chơi với nó một chút để có được nó làm việc, vì vậy tôi đăng một giải pháp cập nhật ở đây.

IPAccessHandler quản lý danh sách đen và danh sách trắng, chấp nhận các dải IP tùy ý và hỗ trợ gắn đường dẫn URI cụ thể vào mỗi mục nhập danh sách trắng/đen. IPAccessHandler cũng phân lớp HandlerWrapper, mà hóa ra là quan trọng.

Ứng dụng solr vẫn tồn tại trong WebAppContext (như trong giải pháp của Lyndsay), nhưng WebAppContext hiện được chi phối bởi ContextHandler, nằm trong ContextHandlerCollection chiếm vị trí xử lý đầu tiên trong máy chủ. Để ngăn các yêu cầu từ IP sai khi truy cập vào ứng dụng, chúng ta cần bọc nó bên trong một IPAccessHandler ở đâu đó dọc theo đường dẫn đó. IPAccessHandler cư xử kỳ lạ nếu nó ở vị trí sai: Tôi đã thử chèn nó trước các trình xử lý ngữ cảnh và nó đã cho 403 Cấm cho các máy sai, ném NullPointerException tantrums mà không có thông báo lỗi bổ sung, tất cả các loại vô nghĩa. Cuối cùng tôi đã làm cho nó hoạt động bằng cách gói chính ContextHandlerCollection, ở cấp độ máy chủ.

Đi đến etc/jetty.xml và cuộn đến phần trình xử lý. Sau đó quấn mục ContextHandlerCollection hiện như sau:

<!-- =========================================================== --> 
<!-- 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> 

Resources:

+0

Tôi đã thử nó và nó hoạt động hoàn hảo! Nó chặn truy cập vào 'solr admin' và đối với' client' được sử dụng từ các host khác so với cái được bạn sử dụng. – h4k1m

+0

Tôi độc lập đến cùng một giải pháp này; Tôi không tìm thấy điều này trước. FYI điều này IPAccessHandler chỉ làm việc với IPv4 - đó là một lỗi/giới hạn. Vì vậy, khi bắt đầu Java, vượt qua: '-Djava.net.preferIPv4Stack = true'. Và đối với những người tìm kiếm các quy tắc được đề xuất, tôi trông giống như sau: 127.0.0.1 -.-.-.- |/solr/techproducts/select Do đó, localhost có thể làm bất kỳ điều gì và mọi người khác bị hạn chế nghiêm trọng đối với một số "lõi" và/chọn Solr RequestHandler. –

8

Tôi đã tìm thấy giải pháp.

Thứ nhất, trích xuất nội dung của solr.war trong thư mục ví dụ/webapps. Sau đó, tạo ra một tập tin gọi là .htaccess và đặt nó trong ví dụ/webapps/thư mục Solr (một trong những bạn chỉ cần trích xuất) có chứa những điều sau đây:

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

Trong ví dụ/etc/chỉnh sửa các tập tin jetty.xml và bình luận ra phần org.mortbay.jetty.deployer.WebAppDeployer. Sau đó, cuối cùng tạo ra một thư mục trong ví dụ/gọi là bối cảnh (nếu chưa tồn tại) và thêm một tập tin gọi là solr.xml để nó có chứa:

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

Sau đó khởi động Solr an toàn mới của bạn!

+3

Đối với những người khác, điều này sẽ không hoạt động trong các phiên bản mới hơn của Jetty được lưu trữ vào nhật thực. Về cơ bản không còn HTAccessHandler nữa. Tham khảo: http://jetty.4.n6.nabble.com/jira-Created-JETTY-962-Clean-room-implementation-of-org-mortbay-jetty-securtiy-HTAccessHandler-td41205.html – jonas789

Các vấn đề liên quan