Ограничение доступа к файлам в Java - PullRequest
20 голосов
/ 03 апреля 2011

Проблема:
В моем приложении Java (не апплете) я хочу ограничить некоторые файловые операции всеми классами, кроме списка / группы / пакета классов, которые не должны быть ограничены.

В частности, я хотел бы ограничить ...

  • Чтение файлов
  • Запись файлов
  • Создание файлов
  • Удаление файлов

... так, что они могут быть выполнены только в текущем рабочем каталоге для всех, кроме неограниченных классов.

Попытка SecurityManager:
У меня естьпопытался реализовать подкласс класса SecurityManager, который реализует это поведение, однако, похоже, что при выполнении проверок предоставленная информация file не дает больше, чем просто имя файла (если я что-то упустил?).

Кроме того, я не совсем понимаю, как в этом случае я мог узнать класс, из которого выполняется вызов, чтобы я мог определить, разрешить ли операцию или вызвать исключение.Можно ли как-нибудь получить всю информацию, необходимую для работы этого подхода?

Попытка на основе политики:
Я также знаю, что политики Java предназначены для ограничениядействия классов, включая такие вещи, как файловые операции.Однако я действительно изо всех сил пытался найти хороший ресурс, чтобы узнать, как я могу решить свои проблемы, используя файл .policy .

Обобщение вопроса:

1) Существуют ли альтернативные подходы, которые могут быть предпочтительнее тех, о которых я упоминал?

2) Возможно ли это с помощью SecurityManager?Я пропускаю то, как я должен фактически реализовать такой подход?

3) Возможно ли это с помощью файла политики?Есть ли какие-то хорошие ресурсы, которые я пропустил на этом фронте?

Я действительно не слишком увлечен какой-либо тяжелой работой, которую мне нужно вкладывать в достижение этой цели - я просто не уверен, какЯ должен подходить к этому правильно.Мне также очень не хватает хороших ресурсов, чтобы достаточно подробно рассказать о двух возможных подходах, которые я упомянул, и позволить мне реализовать их самостоятельно.Прежде всего, я не боюсь значительного чтения там, где это необходимо!

Спасибо за любую помощь, которую вы можете оказать заранее.

1 Ответ

15 голосов
/ 03 апреля 2011

Вот как вы можете сделать это, используя файл политики.

Создайте файл Java, который может работать с привилегиями:

package egPriv;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;

public class PrivCat {
    /** Cat a file with no privileges */
    public void cat(String file) throws IOException {
        cat(new FileReader(file));
    }

    private void cat(Reader r) throws IOException {
        int c;
        while( (c = r.read()) != -1 ) {
            System.out.print((char) c);
        }
        r.close();
    }

    /** Cat a file WITH privileges */
    public void catPriv(final String file) throws IOException {
        Reader r;
        try {
            r = AccessController.doPrivileged(new PrivilegedExceptionAction<Reader>() {
                public Reader run() throws IOException {
                    return new FileReader(file);
                }
            });
        } catch (PrivilegedActionException e) {
            throw (IOException) e.getCause();
        }
        cat(r);
    }
}

Создать обычный файл для демонстрации

package eg;

import egPriv.PrivCat;

import java.io.IOException;

public class Cat extends PrivCat {
    public static void main(String[] args) throws IOException {
        Cat eg2 = new Cat();
        System.out.println("Processing with privilege:");
        eg2.catPriv(args[0]);

        System.out.println("Processing normally");
        eg2.cat(args[0]);
    }
}

Создать файл sample.policy:

/* anyone can read write and execute within current working dir */
grant {
  permission java.io.FilePermission "${user.dir}", "read,write,execute";
};

grant {
  permission java.io.FilePermission "${user.dir}/*", "read,write,execute,delete";
};


/* Only code from this jar can work outside of CWD */
grant codebase "file:egPriv.jar" {
  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
};

Скомпилируйте, а затем протестируйте:

jar cvf egPriv.jar egPriv
jar cvf eg.jar eg


echo 'Restricted' > ..\file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat ..\file.txt

echo 'Open' > file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat file.txt
...