2011-01-23 13 views
7

Wszystko,SecurityManager dla „sandbox” chmura usług

pracuję nad projektem usługi chmurowej, który zapewni możliwość wykonania jakiegoś „wtyczki” Kod przedłożony przez klientów. Aby to działało, konieczne jest, aby wtyczki nie zagrażały integralności systemu ani nie miały dostępu do danych innych klientów.

Idealnie chciałbym, aby klienci mogli przesłać prosty plik jar (zawierający klasę zgodną z pewnym wstępnie zdefiniowanym interfejsem), który następnie byłby uruchamiany w piaskownicy.

Kod klient powinien mieć możliwość:

  • Weź tyle czasu procesora, ile potrzebuje na jednym wątku
  • wykonać żadnych obliczeń, korzystając ze standardowych klas Javy (np java.lang.Math, Jawa. util.Random itp)
  • wywołać dowolną biblioteki dołączane w słoiku (ale które muszą podlegać takim samym ograniczeniom)

ale chciałbym konkretnie trzeba zabronić następujące:

  • tarła nowych wątków (tak, że zasób serwer może być dość udało!)
  • Wszelkie dostępu do systemu plików/IO/network
  • Wszelkie dostęp do kodu natywnego
  • żadnego dostępu do danych w JVM innych niż przekazane/stworzony przez kod klienta
  • Wszelkie dostęp do refleksji na klas innych niż te, w .jar piaskownicy
  • Wszelkie zdolność do wywołania metody na obiektach poza piaskownicą, inne niż standardowych bibliotek Javy

Czy można to osiągnąć przy użyciu niestandardowej konfiguracji ClassLoader/SecurityManager? Czy muszę zacząć szukać bardziej wyrafinowanego rozwiązania (na przykład uruchamiania wielu maszyn JVM?)

+0

@M postęp w raporcie? –

Odpowiedz

4

Zarządzanie zasobami i ograniczanie zasobów nie jest możliwe w java. Można zapobiec złośliwego kodu do zasobów systemowych dostępu (dysk/sieci i SO) lub samego JVM ALE: ...

Tarło nowych tematów (tak, że zasób serwer może być dość udało!)

  • Jeśli chcę być złośliwy ja zrobię wszystko mój kod w wątku finalizatora i po prostu zablokować VM. To samo robi protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}} do widzenia nowych wątków.
  • Spożywanie całej pamięci, spożywanie wszelkiej pamięci bezpośredniej i tak dalej.
  • Dostęp do plików zip w moim słoiku i oczekiwać „em coraz odsunięte, więc awarie JVM (z powodu błędu (ów) w zlib)

Jeśli ktoś celowo chce zaprzeczyć zasobów, to jest po prostu nie jest wykonalnym zadaniem, aby spróbować złapać hakera. Musisz wiedzieć, czego szukać i dynamicznie sprawdzać/ulepszać klasy w czasie wykonywania, aby uniemożliwić działanie.

Wszelkie zdolność do wywołania metody na obiektach poza piaskownicą, inne niż standardowych bibliotek Javy

Jakie są standardowe biblioteki? Czy wiesz, czy/kiedy muszą ewentualnie wykonać jakiś kod w uprzywilejowanej metody.


Każdy klient - oddzielna maszyna wirtualna z pełną restrykcją, powinowactwo/priorytet procesu, włącznie z maksymalną pamięcią/stosem i tak dalej.

+0

To prawie dalvik model –

+0

@ Chris Thompson: Jak radzi sobie z awarią kodu natywnego? – bestsss

+0

Wiesz, to doskonałe pytanie i nie jestem pewien. Spróbuję go znaleźć i tu zamieściłem inny komentarz. BTW miałem na myśli twoją sugestię oddzielnych instancji VM, co robi Dalvik w przypadku, który nie był jasny. –

1

Myślę, że wszystko, co chcesz osiągnąć, można wykonać za pomocą niestandardowego SecurityManager. W rzeczywistości jest to całkiem proste, wystarczy utworzyć klasę, która rozszerza SecurityManager, zaimplementuj dwie metody checkPermission(..) iw pierwszej iteracji po prostu wyślij SecurityException dla wszystkiego, co wchodzi (i zapisz to, co właśnie zaprzeczyłeś). Następnie zezwalasz na wykonanie specyficznych operacji, dopóki nie znajdziesz się w sytuacji, w której można utworzyć przydatne wtyczki i pozwolić swoim klientom na zabawę. Oni narzekają na. Następnie musisz ocenić, czy pozwolić im zrobić wszystko, o co poprosili, czy też chcesz przestrzegać zasad. Tutaj trudna część zaczyna się ...

Powiązane problemy