Написание безопасного кода Java с RMI - PullRequest
3 голосов
/ 20 мая 2010

Это может показаться очень широким вопросом, но любая помощь приветствуется.

У меня есть клиент-серверное решение, написанное на Java, которое использует проект Cajo (который использует RMI). Я просто хочу попытаться сделать свое решение максимально безопасным, учитывая конфиденциальные данные, которые будут передаваться между сервером и клиентом.

До сих пор мои идеи заключались в том, чтобы сделать все мои классы "окончательными", а также вызвать "не сериализуемое" исключение для всех моих классов на сервере (за исключением объекта, связанного в реестре RMI, и любых объектов, которые на самом деле нужно перенести, конечно).

Может кто-нибудь придумать какие-нибудь другие идеи?

Я знаю, что кто-то может написать вредоносный клиент - это не сложно, поскольку вы можете узнать API удаленного объекта, используя отражение. Однако могу ли я что-нибудь сделать для защиты классов / объектов доступа злоумышленника на сервере, к которым они не должны получить доступ?

Большое спасибо

Обновление: Спасибо всем за полезные советы, и извините, что так долго возвращались к вам. Мой текущий ход мыслей - создать безопасную систему:

  • Использовать OpenVPN между клиентами и сервером. Это означает, что вам нужен доступ к физическому клиенту для получения доступа. (Примечание: из-за 2 пунктов ниже, VPN фактически будет между сервером и локальной сетью офиса. Я чувствую, что это достаточно безопасно)
  • Используйте имена пользователей и пароль (возможно, используя JBOSS) для аутентификации между сервером и клиентом. Это означает, что для выполнения любых действий на сервере злоумышленнику потребуются имя пользователя и пароль.
  • Бросить исключение «не подлежит серзанию» для всех объектов, кроме тех, которые фактически должны быть отправлены по сети. Это предотвращает отправку конфиденциальных объектов по сети.

Звучит справедливо? Пожалуйста, поправьте меня, если я что-то упустил.

Дальнейшее обновление : Похоже, что существует некоторая путаница из-за того, что я пытаюсь предотвратить. То, что я пытаюсь предотвратить, это кто-то "взломать" сервер. Таким образом, в основном используется сервер для сброса / удаления всей его базы данных, например.

Спасибо

Ответы [ 4 ]

2 голосов
/ 01 июня 2010

Защита системы, которая соединяется с потенциально скомпрометированными системами через RMI, очень трудна. Первое, что нужно сделать, это отключить функцию динамической загрузки кода RMI с помощью системного свойства java.rmi.server.useCodebaseOnly - больше нет мобильного кода (через этот канал). Как отмечает специалист по RMI Стюарт Маркс, это свойство теперь по умолчанию в соответствии с политикой Oracle.

0 голосов

Позволяет ли Cajo вызывать только методы для экспортируемых объектов? Если это так, просто экспортируйте только объекты «безопасно для вызова». В противном случае вы будете вынуждены использовать песочницу , если хотите, чтобы хосты были в безопасности. Также см. это .

Вам потребуется SSL для предотвращения перехвата / изменения сетевого трафика.

0 голосов
/ 20 мая 2010

Вы упоминаете, что используете VPN, поэтому для того, чтобы злонамеренный клиент мог подключиться к вашему серверу, ему пришлось бы оценить вашу VPN или установить мошенническое программное обеспечение на машине с законным доступом к вашей VPN.

Как только это будет сделано, не существует простого способа отличить мошеннического клиента от вашего авторизованного программного обеспечения. Вы можете предоставить дополнительные учетные данные каждому пользователю вашего клиентского программного обеспечения для дополнительной аутентификации, но они могут быть скомпрометированы, если клиентский компьютер скомпрометирован. Более надежная схема аутентификации заключается в отправке каждому пользователю небольшого «виджета», который вычисляет коды доступа. Мошеннический клиент не будет иметь доступа к этому, и он не может быть оценен одним программным обеспечением, поскольку он физически отделен от клиентского компьютера. Объединение этого с именем пользователя / паролем для каждого пользователя побьет одного пользователя, крадущего виджет другого пользователя.

В зависимости от того, насколько вы хотите этого и сколько усилий вы готовы инвестировать, это может быть излишним. Если вашей главной задачей является защита от автоматической атаки мошеннического клиента против обычного пользователя, использующего программное обеспечение, вы можете реализовать проверку подлинности «Я человек», представив при входе в систему капчу.

0 голосов
/ 20 мая 2010

Я бы использовал фабрику пользовательских сокетов для шифрования всех данных RMI. Например. Использование SSL не позволит просматривать данные, изменять их и воспроизводить атаки.

В этом руководстве описывается, как создать собственную фабрику сокетов RMI, а также общее обсуждение RMI через SSL.

Это может показаться большой работой, но если вам действительно нужно скрыть конфиденциальные данные от посторонних глаз, то окончательная обработка объектов просто не обеспечит реальной безопасности - конфиденциальные данные все еще можно прочитать.

РЕДАКТИРОВАТЬ: Это все в значительной степени спорный вопрос, так как OP, упомянутый в комментариях ниже, что VPN используется.

...