2009-05-28 35 views
16

Chúng tôi có một số ứng dụng đôi khi gặp phải tình trạng xấu, nhưng chỉ trong sản xuất (tất nhiên!). Trong khi lấy một đống lưu trữ có thể giúp thu thập thông tin trạng thái, nó thường dễ dàng hơn để sử dụng một trình gỡ lỗi từ xa. Thiết lập này là dễ dàng - chúng ta chỉ cần thêm video này vào dòng của ông lệnh:Gỡ lỗi an toàn cho các JVM sản xuất

-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, địa chỉ = PORT

Có vẻ là không có cơ chế bảo mật có sẵn, vì vậy việc bật gỡ lỗi trong sản xuất sẽ cho phép thực thi mã tùy ý một cách hiệu quả (thông qua hotswap).

Chúng tôi có sự kết hợp của 1.4.2 và 1.5 Sun JVM chạy trên Solaris 9 và Linux (Redhat Enterprise 4). Làm cách nào chúng tôi có thể bật gỡ lỗi an toàn? Bất kỳ cách nào khác để đạt được mục tiêu kiểm tra máy chủ sản xuất của chúng tôi?

Cập nhật: Đối với JDK 1.5+ JVM, người ta có thể chỉ định giao diện và cổng mà trình gỡ lỗi sẽ ràng buộc. Vì vậy, đề xuất của KarlP ràng buộc để loopback và chỉ sử dụng một đường hầm SSH đến một hộp phát triển địa phương nên làm việc cho SSH được thiết lập đúng trên các máy chủ.

Tuy nhiên, có vẻ như JDK1.4x không cho phép giao diện được chỉ định cho cổng gỡ lỗi. Vì vậy, chúng tôi có thể chặn truy cập vào cổng gỡ lỗi ở đâu đó trong mạng hoặc thực hiện một số chặn hệ thống cụ thể trong chính hệ điều hành (IPChains như Jared được đề xuất, v.v.)?

Cập nhật # 2: Đây là một hack mà sẽ cho phép chúng ta hạn chế rủi ro của chúng tôi, ngay cả trên 1.4.2 JVM:

lệnh params dòng:

-Xdebug 
-Xrunjdwp: 
    transport=dt_socket, 
    server=y, 
    suspend=n, 
    address=9001, 
    onthrow=com.whatever.TurnOnDebuggerException, 
    launch=nothing 

Java Code để bật gỡ lỗi:

try { 
    throw new TurnOnDebuggerException(); 
} catch (TurnOnDebugger td) { 
    //Nothing 
} 

TurnOnDebuggerCó thể có bất kỳ ngoại lệ nào được đảm bảo không được ném bất kỳ nơi nào khác.

Tôi đã thử nghiệm trên hộp Windows để chứng minh rằng (1) cổng trình gỡ lỗi không nhận kết nối ban đầu và (2) ném ngoại lệ TurnOnDebugger như được hiển thị ở trên khiến trình gỡ lỗi trở nên sống động. Tham số khởi chạy được yêu cầu (ít nhất là trên JDK1.4.2), nhưng một giá trị rác đã được JVM xử lý một cách duyên dáng.

Chúng tôi đang lập kế hoạch tạo một servlet nhỏ, sau bảo mật thích hợp, có thể cho phép chúng tôi bật trình gỡ rối. Tất nhiên, người ta không thể tắt nó đi sau đó, và trình gỡ rối vẫn lắng nghe một cách bế tắc khi nó bật lên. Tuy nhiên, đây là những hạn chế mà chúng tôi sẵn sàng chấp nhận khi gỡ lỗi hệ thống sản xuất sẽ luôn dẫn đến việc khởi động lại sau đó.

Cập nhật # 3: Tôi đã kết thúc viết ba lớp: (1) TurnOnDebuggerException, một ngoại lệ 'ol Java exception, (2) DebuggerPoller, một chủ đề nền kiểm tra sự tồn tại của một tệp được chỉ định trên hệ thống tệp, và (3) DebuggerMainWrapper, một lớp khởi động chủ đề bỏ phiếu và sau đó gọi một cách phản xạ phương thức chính của một lớp được chỉ định khác.

này được sử dụng như thế nào của nó:

  1. Thay thế lớp "chính" của bạn với DebuggerMainWrapper trong kịch bản khởi động của bạn
  2. Thêm hai hệ thống (-D) params, một quy định cụ thể các lớp học chính thực, và khác xác định một tập tin trên hệ thống tập tin.
  3. Định cấu hình trình gỡ lỗi trên dòng lệnh với phần onthrow = com.whatever.TurnOnDebuggerException đã thêm
  4. Thêm bình chứa ba lớp được đề cập ở trên vào đường dẫn lớp.

Bây giờ, khi bạn khởi động tất cả mọi thứ JVM của bạn là như nhau ngoại trừ chủ đề nền poller được bắt đầu. Giả sử rằng tập tin (của chúng ta được gọi là TurnOnDebugger) không tồn tại lúc đầu, poller kiểm tra nó cứ sau mỗi giây. Khi poller đầu tiên nhận thấy nó, nó ném và ngay lập tức bắt TurnOnDebuggerException. Sau đó, các đại lý được khởi động.

Bạn không thể tắt nó trở lại, và máy không an toàn khủng khiếp khi bật máy. Mặt khác, tôi không nghĩ rằng trình gỡ rối cho phép nhiều kết nối đồng thời, do đó việc duy trì kết nối gỡ lỗi là cách bảo vệ tốt nhất của bạn. Chúng tôi đã chọn phương thức thông báo tệp vì nó cho phép chúng tôi sử dụng tính năng xác thực của tác giả/tác giả Unix hiện có bằng cách chỉ định tệp trình kích hoạt trong thư mục mà chỉ các quyền sử dụng thích hợp mới có quyền. Bạn có thể dễ dàng xây dựng một tập tin chiến tranh nhỏ đã đạt được cùng một mục đích thông qua một kết nối socket. Tất nhiên, vì chúng tôi không thể tắt trình gỡ lỗi, chúng tôi sẽ chỉ sử dụng nó để thu thập dữ liệu trước khi tiêu diệt một ứng dụng bị bệnh. Nếu có ai muốn mã này, vui lòng cho tôi biết. Tuy nhiên, nó sẽ chỉ đưa bạn một vài phút để ném nó với nhau cho mình.

Trả lời

8

Nếu bạn sử dụng SSH, bạn có thể cho phép đường hầm và hầm một cổng đến máy chủ cục bộ của bạn. Không yêu cầu phát triển, tất cả được thực hiện bằng sshd, ssh và/hoặc putty.

Ổ cắm gỡ lỗi trên máy chủ java của bạn có thể được thiết lập trên giao diện cục bộ 127.0.0.1.

+0

Nếu điều này hoạt động (thử nghiệm ngay bây giờ), nó có vẻ như là lựa chọn tốt nhất cho chúng tôi. Nó không giống như chúng tôi gỡ lỗi thường xuyên, nhưng chúng tôi muốn khả năng bắt JVM ở trạng thái không đúng. – ShabbyDoo

+1

Tôi nghĩ rằng điều này sẽ chỉ hoạt động trên JDK 1.5+: http://java.sun.com/j2se/1.5.0/docs/guide/jpda/enhancements.html Xem "vận chuyển dt_socket đã được sửa đổi thành lấy địa chỉ cục bộ khi chạy ở chế độ máy chủ "trong liên kết ở trên. – ShabbyDoo

+0

@Shabby - yep - có vẻ như điều này sẽ hoạt động 1,5+ và là một giải pháp tuyệt vời. Thay thế là khóa các cổng gỡ lỗi thông qua tường lửa (phần mềm hoặc phần cứng.) Có thể thanh toán ipchains cho máy chủ Linux của bạn? (http://tldp.org/HOWTO/IPCHAINS-HOWTO.html) – Jared

0

Xuất thông tin/dịch vụ vào JMX và sau đó sử dụng RMI + SSL để truy cập từ xa. Tình hình của bạn là những gì JMX được thiết kế cho (M là viết tắt của Management).

+0

Tôi đồng ý rằng các chỉ số phổ biến phải được hiển thị qua JMX. Chúng tôi đang thực sự sử dụng một hồ sơ sản xuất nhẹ (Wily), nhưng nó không phải là rất tốt tại nắm bắt thông tin nhà nước, và chỉ có thể hoạt động tốt khi bị giới hạn các dấu vết thô. Vấn đề khác là một số ứng dụng này là (một phần) của bên thứ ba, vì vậy chúng tôi sẽ gỡ lỗi với nguồn được giải mã ở mức tốt nhất. – ShabbyDoo

+1

Tôi vẫn duy trì việc kết nối trình gỡ lỗi của bạn với một ứng dụng sản xuất là một ý tưởng tồi. Người dùng sẽ không có ý tưởng gì đang xảy ra khi bạn nhấn một điểm ngắt và dành một chút thời gian grepping thông qua bộ nhớ. Tôi sẽ cố gắng tìm các điểm trong mã của bạn đang gặp sự cố và hiển thị trạng thái hiện tại qua JMX và giữ nhật ký kiểm tra chi tiết về những gì đang xảy ra. – Kevin

+1

Chúng tôi thực sự sẽ lấy trường hợp hoạt động kém ra khỏi cụm cân bằng tải của chúng tôi trước khi gỡ lỗi. Tôi đồng ý rằng gỡ lỗi một ứng dụng w/người dùng hoạt động sẽ là một ý tưởng thực sự tồi tệ. – ShabbyDoo

2

Bạn hoàn toàn đúng: API gỡ lỗi Java vốn không an toàn. Tuy nhiên, bạn có thể giới hạn nó vào các ổ cắm miền UNIX và viết một proxy với SSL/SSH để cho phép bạn có các kết nối bên ngoài được mã hóa và xác thực sau đó được đưa vào ổ cắm miền UNIX. Điều đó ít nhất làm giảm tiếp xúc của bạn với một người có thể nhận được một quá trình vào máy chủ, hoặc một người có thể crack SSL của bạn.

+0

Có thể ánh xạ cổng trên giao diện mặc định tới một ổ cắm miền không? Các vấn đề tôi có (mà tôi phát hiện ra sau khi bài viết ban đầu của tôi) là Sun JVM 1.4.x chỉ có thể liên kết với giao diện mặc định (?). Vì vậy, một số bản đồ phép thuật sẽ được yêu cầu để cổng này sẽ không được tiếp xúc bên ngoài máy ảo. – ShabbyDoo

0

Câu hỏi hay.

Tôi không biết bất kỳ khả năng tích hợp mã hóa kết nối nào vào cổng gỡ lỗi.

Có thể có một giải pháp tốt hơn/dễ dàng hơn, nhưng tôi sẽ làm như sau:

  1. Đặt máy sản xuất đằng sau một bức tường lửa để chặn truy cập vào cổng gỡ lỗi (s).
  2. Chạy quy trình proxy trên chính máy chủ lưu trữ kết nối với cổng và mã hóa đầu vào và đầu ra từ ổ cắm.
  3. Chạy ứng dụng khách proxy trên máy trạm gỡ lỗi cũng mã hóa/giải mã đầu vào. Có điều này kết nối với máy chủ proxy. Giao tiếp giữa chúng sẽ được mã hóa.
  4. Kết nối trình gỡ lỗi của bạn với ứng dụng proxy.
+0

Lưu ý: Các máy chủ sản xuất của chúng tôi nằm sau tường lửa, nhưng chúng được tiếp xúc với một số phân đoạn mạng nội bộ. – ShabbyDoo

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