Ograniczanie dostępu do plików w Javie

Problem:
W mojej aplikacji Java (nie apletu) chcę ograniczyć pewne operacje na plikach do wszystkich klas z wyjątkiem listy/grupy / pakietu klas, które nie powinny być ograniczone.

W szczególności, chciałbym ograniczyć...

  • plik czyta
  • plik zapisuje
  • Tworzenie pliku
  • usuwanie pliku

...takie, że mogą one być wykonywane tylko w bieżącym katalogu roboczym dla wszystkich, z wyjątkiem nieograniczonych klasy.

Próba SecurityManager:
Próbowałem zaimplementować podklasę klasy SecurityManager, która implementuje to zachowanie, jednak wygląda na to, że po sprawdzeniu plik podany plik nie daje więcej niż tylko nazwę pliku (chyba, że czegoś mi brakuje?).

Poza tym nie do końca rozumiem, jak w tym przypadku mogłem znaleźć klasę, z której wykonywane jest wywołanie, aby umożliwić mi ustalenie, czy zezwolić na operację, czy wyrzuć wyjątek. Czy jest jakiś sposób, aby uzyskać wszystkie informacje potrzebne do tego podejścia do pracy?

Próba oparta na zasadach:
Zdaję sobie również sprawę, że zasady Javy mają na celu ograniczanie działań klas, w tym takich rzeczy, jak operacje na plikach. Jednak naprawdę trudno mi znaleźć dobry zasób, aby dowiedzieć się, jak mogę rozwiązać moje problemy za pomocą {23]}.Polityka plik.

Podsumowanie pytania:

1) są czy są jakieś alternatywne podejścia, które mogą być lepsze od tych, o których wspomniałem?

2) czy jest to możliwe przy użyciu Menedżera SecurityManager? Czy brakuje mi sposobu, w jaki właściwie powinienem wdrażać takie podejście?

3) czy jest to możliwe przy użyciu pliku zasad? Brakuje mi jakichś dobrych środków?

naprawdę nie jestem przeciwny żadnej ciężkiej pracy, którą muszę zainwestować w osiągnięcie tego celu - po prostu nie jestem pewien, jak powinienem do tego podejść jak należy. Bardzo brakuje mi również dobrych zasobów, aby nauczyć mnie wystarczająco dużo o dwóch możliwych podejściach, o których wspomniałem, aby umożliwić mi wdrożenie go samodzielnie. Przede wszystkim nie boję się znaczących lektur tam, gdzie jest to wymagane!

Z góry dzięki za pomoc.

Author: obfuscation, 2011-04-03

1 answers

Oto jak możesz to zrobić używając pliku zasad.

Utwórz plik Java, który może działać z uprawnieniami:

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);
    }
}

Utwórz zwykły plik do demonstatacji

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]);
    }
}

Utwórz próbkę.plik polityki:

/* 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";
};

Skompilować, a następnie przetestować:

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
 12
Author: Simon G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-03 01:26:49