2013-01-09 19 views
7

Do lo ngại về bảo mật, tôi cần tìm cách hạn chế những tệp JVM sẽ chạy. Tôi có khoảng 5 lọ có thể chạy, và không có gì khác có thể chạy trên JVM. Điều này là do một số hạn chế về miền cụ thể, trong đó các quyền cụ thể phải được gán cho JVM, nhưng các quyền này sẽ không khả dụng cho bất kỳ ai muốn viết và thực thi tệp java.JVM có các tính năng để chỉ thực hiện một danh sách trắng các tệp không?

Tôi cảm thấy có khả năng một số tính năng chỉ chạy mã tin cậy/đã ký trong JVM, nhưng tôi đang gặp khó khăn khi tìm bất kỳ thông tin liên quan nào.

Nếu có ai có ý tưởng nào tuyệt vời!

+1

Bạn có thể cụ thể hơn về những quyền nâng cao mà bạn đã gán cho JVM không? Bạn đang nói về việc thực hiện các setuid thực thi java, hoặc một cái gì đó như thế? – Kenster

+0

Chúng tôi đang sử dụng một chương trình bên ngoài để mã hóa các phần nhạy cảm của hệ thống tệp. Chương trình Java của tôi cần quyền từ chương trình bên ngoài này để đọc các tệp được mã hóa. Vấn đề nằm ở thực tế là việc cấp quyền truy cập JVM vào các tệp này có nghĩa là bất kỳ chương trình java nào cũng có thể đọc các tệp được mã hóa. Vì vậy, tôi muốn nói với JVM, chỉ chạy các JARS này. Hoặc, chỉ chạy các JAR được ký với chứng chỉ này hoặc một cái gì đó tương tự. – Sloppy

Trả lời

5

Nếu bạn không cần đọc mã từ các JAR khác, bạn có thể sử dụng SecurityManager để tránh đọc bất kỳ JAR nào khác hoặc tải lớp học từ một thư mục. Bạn sẽ muốn hạn chế sự phản chiếu và tải các thư viện chia sẻ cũng như ngăn chặn tải các lớp một cách thủ công.

+0

Đây có phải là điều bạn đang tương tác khi tạo tệp 'java.policy' không? – Alex

+0

Người quản lý bảo mật có thể bị ghi đè bằng cách gửi một đối số cho JVM không? – Sloppy

+0

@Sloppy Nếu bạn không thể kiểm soát dòng lệnh, tất cả các cược sẽ bị tắt. Người dùng có thể chạy bất cứ thứ gì từ dòng lệnh (không chỉ java) Tôi sẽ không cấp quyền truy cập dòng lệnh cho người dùng không đáng tin cậy. –

1

Tôi nghĩ rằng nó không phải là đơn giản ... Nếu bạn không kiểm soát trạm người dùng hoàn toàn, bạn không thể bảo vệ java với SM. Ví dụ: Primordial classloader tải các lớp không phải chịu kiểm tra SM và nhiều xác minh khác ... Vì vậy, người dùng có thể thêm một lib trong bootclasspath sẽ có tất cả các đặc quyền .... (Ví dụ: thư mục lớp hoặc thư mục lib trong cài đặt java , ông thậm chí có thể ghi đè java * gói nếu ông sở hữu JVM)

những gì bạn có thể làm là:.

  • xáo trộn mã của bạn
  • Sử dụng ẩn api để ứng dụng java của bạn (không phải là 'java -jar myapp.jar "/ path/to/file/to/encrypt" ')

Và bạn vẫn không an toàn 100% ... tất cả các mã có thể được thiết kế ngược và thuật toán và các phím được trích xuất, tất cả những gì bạn có thể làm là làm cho nó khó đủ để nó không hấp dẫn nữa.

EDIT

Tôi nghĩ rằng bạn có thể có một vấn đề thiết kế lớn. Cụ thể, nếu mã hóa tệp là hướng người dùng thì người dùng biết khóa mã hóa và tất cả bảo mật vẫn nằm trong khóa đó chứ không phải mã của bạn. Bất kỳ ai cũng có thể thử giải mã nó nhưng chỉ người nào đó có khóa hợp lệ mới có thể. Và nếu đó là trường hợp hơn mã của bạn không cần bất kỳ điều trị đặc biệt nào.

Có một khả năng khác mà bạn đã nhúng khóa bí mật trong ứng dụng java của mình ... và khóa này là tĩnh trong tất cả các bản cài đặt của bạn, sau đó khóa này không phải là bí mật nữa, và nó không mã hóa nhưng obfuscation.

+0

Cảm ơn thông tin về tải lớp, tôi sẽ lưu ý ... Mã hóa thực sự không phải do người dùng điều khiển, gói phần mềm của bên thứ ba mã hóa toàn bộ hệ thống tệp và bao gồm hệ thống để gán quyền (đọc/ghi) cho các chương trình cụ thể. Vấn đề ở đây là, tất cả các chương trình Java được chạy bởi JVM, vì vậy chúng tôi không muốn cấp quyền đầy đủ cho JVM, nếu có ai đó chỉ có thể viết đoạn mã Java của riêng họ để tận dụng toàn bộ quyền truy cập. – Sloppy

+0

Vì vậy, bạn không cần phải sửa đổi quyền trong một jvm (đó là những gì SM không) nhưng, quyền trong phần mềm đặc biệt này để chạy chỉ được chọn của jar? Sau đó, nó là khả năng của chương trình nếu nó có thể được thực hiện ... – fatfredyy

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