Czekam na uruchomienie kilku niezrealizowanych skryptów (napisanych w języku, który dopiero zostanie określony, ale musi być oparty na języku Java, więc JRuby, Groovy, Jython, BeanShell itd. są kandydatami). Chcę, aby te skrypty były w stanie robić pewne rzeczy i ograniczać się do robienia innych rzeczy.Bezpieczeństwo przy użyciu skryptów Java (JRuby, Jython, Groovy, BeanShell, itp.)
Zwykle po prostu skorzystam z JavaManager SecurityManager i skończę z tym. To całkiem proste i pozwala mi ograniczyć dostęp do plików i sieci, możliwość wyłączenia JVM itp. I to będzie działać dobrze na rzeczach wysokiego poziomu, które chcę zablokować.
Ale jest kilka rzeczy, na które chcę zezwolić, ale tylko za pośrednictwem mojego niestandardowego interfejsu API/biblioteki, który udostępniam. Na przykład, nie chcę zezwalać na bezpośredni dostęp do sieci, aby otworzyć URLConnection na yahoo.com, ale jestem OK, jeśli odbywa się to za pomocą MyURLConnection. To znaczy - istnieje zestaw metod/klas, na które chcę zezwolić, a następnie wszystko, co chcę, być poza zasięgiem.
Nie wierzę, że tego rodzaju zabezpieczenia można wykonać za pomocą standardowego modelu zabezpieczeń Java, ale być może tak. Nie mam konkretnego wymagania odnośnie wydajności lub elastyczności w samym języku skryptowym (skrypty będą prostymi wywołaniami proceduralnymi do mojego API z podstawową obsługą pętli/rozgałęzień). Więc nawet "duże" obciążenie, które sprawdza kontrolę bezpieczeństwa przy każdym odbiciu, jest w porządku.
Sugestie?
Dzięki - to naprawdę pomocne. Btw - dla mnie jest to, aby umożliwić ludziom przesyłanie skryptów do testów obciążeniowych do uruchomienia na http://browsermob.com. Nie patrzyłem na Rhino, ale wygląda na to, że może działać tak długo, jak nie pozwala na bezpośredni dostęp do interfejsów Java API, takich jak Groovy. –
Tak - masz tam większą kontrolę, co jest dobre z punktu widzenia bezpieczeństwa. Może być konieczne utworzenie wrapperów dla niektórych interfejsów API, a następnie udostępnienie tych obiektów. Na przykład mamy mechanizm przepływu pracy i utworzyliśmy obiekt przepływu pracy, który następnie poddaliśmy JavaScript, który kontroluje, co możesz zrobić. –
Szybka obserwacja: w jaki sposób upewniłeś się, że zmienna Pakiety jest niedostępna? Zobacz http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –