2013-04-08 12 views
9

Czy jest jakiś sposób użyć AccessController.doPrivileged z nowym AccessControlContext do ograniczenia dostępu do klas/metod? Chciałbym mieć podprogram, który może wywoływać niezaufany kod bez dostępu do systemu plików lub otwartych gniazd.Wykonywanie metody w języku Java z ograniczonymi uprawnieniami

Szczególnym przypadkiem użycia jest umożliwienie użytkownikom końcowym dostarczenia fragmentów kodu lub skryptów (na przykład Javascript lub Groovy), które mogą być wykonywane z ograniczonymi uprawnieniami.

To, czego szukam, jest czymś w rodzaju zwykłego pliku zasad bezpieczeństwa, którego zakres obejmuje kod dostarczany przez użytkownika, a nie całą maszynę JVM.

+0

Bump! Czy dowiedziałeś się czegoś więcej na ten temat? – Lii

Odpowiedz

1

Nie wiem teraz o sposobie AccessController. Ale możliwe jest kontrolowanie sytuacji za pomocą poniższego schematu. Będziesz musiał mieć wiele programów ładujących klasy: najpierw załaduje klasy tak, jak jest. Po drugie (lub idealnie według liczby niezaufanych źródeł kodu), które przekształcą klasy na poprawione lub udostępnią zamiast normalnych klas jego specjalną poprawioną edycję. I ostatni dla System Classloader, który faktycznie robi rutynę.

Nie zapomnij również zabezpieczyć Classloader.getSystemClassLoader. Do transformowania obiektów można użyć interfejsu API java reflection lub biblioteki objectweb asm.

+0

ClassLoader wygląda na to, że może być na dobrej drodze. Nie jest zainteresowany przekształcaniem klas bezpośrednio. – wrschneider

+0

Dlaczego nie? Wygląda jak najprostszy i najczystszy sposób. – cdkrot

+0

Czy to pasuje do twoich potrzeb? [link] (http://stackoverflow.com/questions/17045334/restrict-execution-of-a-metod-with-java-annotations?rq=1) – cdkrot

0

Jeśli jest coś, czego szukasz

@PreAuthorize("hasRole('ROLE_USER')") 
public void create(Contact contact); 

Czasami warto spojrzeć na wiosnę Security Expression-Based Access Control

+0

Nie, nie szukam, kto może wykonać tę metodę - Szukam tego, co może zrobić sama metoda po uruchomieniu. – wrschneider

1

Java-Sandbox jest narzędziem służącym do dokładnie tego. Może być używany do zezwalania na dostęp tylko do zbioru białych klas i zasobów dla metod z ograniczeniami. Do tego celu wykorzystuje system z niestandardowym programem ładującym klasy i menedżerem zabezpieczeń. Nie jest wymagana żadna manipulacja bajtowym kodem ani podobne triki.

Nie użyłem go, ale wygląda dobrze zaprojektowany i dość dobrze udokumentowany.

Przykład kodu z jej stronie internetowej:

class Untrusted extends SandboxedEnvironment<Object>() { 
    @Override 
    public Object execute() { 
     /* untrusted code */ 
     return null; 
    } 
}; 

service.runSandboxed(Untrusted.class, context); 
Powiązane problemy