Обеспечение безопасности моей Java-программы

У меня есть проект Java, в котором используется библиотека Bluecove. Эта библиотека требует привилегий root для выполнения определенных действий, которые мне требуются в моей проект. Здесь я должен отметить, что, несмотря на то, что проект основан на Java, он предназначен только для Linux.

В проекте будет много функций, не требующих привилегий root, некоторые из которых должны будут взаимодействовать с функциями привилегий root, а некоторые — нет.

Кроме того, проект будет выполнять такие программы, как hciconfig, используя данные, введенные пользователем с привилегиями root.

Вся эта корневая активность заставила меня задуматься о безопасности моей системы. Целевой машиной будет собственный компьютер пользователя, и нет намерения запускать эту систему на каком-либо общедоступном терминале, но безопасность по-прежнему важна, поскольку неизвестные внешние устройства Bluetooth смогут взаимодействовать с этой системой.

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

Что люди порекомендуют? Можно было бы разделить систему на два или три модуля, один из которых содержит графический интерфейс и некорневую серверную часть, другой содержит корневой сервер Bluecove и, возможно, корневую оболочку для hciconfig и других используемых инструментов.

Я заметил, что некоторые программы, например Apache, после запуска «сбрасывают» свои привилегии. Как это достигается и эффективно ли это?


person Andy Smith    schedule 02.02.2010    source источник


Ответы (1)


Какой apache выполняет системный вызов setuid (в libc), который, как вы заметили, эффективно снижает привилегии процесса. Вы можете сделать вызов libc через JNI или JNA.

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

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

person Kohsuke Kawaguchi    schedule 02.02.2010