Провел тонну исследований. Я простой падаван, однако у меня есть проект, в котором я должен запустить ненадежный Python3 код пользователя с веб-сайта.
Я также заранее прошу прощения, если в этом вопросе есть движущиеся части.
- Я ищу максимально безопасный подход. Это не обязательно должно быть на 100% идеальным, если нет большого риска утечки чрезвычайно конфиденциальных данных .
Основные вопросы :
- Имеет ли мой план AWS -lambda серьезный риск утечки конфиденциальных данных ?
- Есть ли другие простые меры предосторожности, которые я должен предпринять что могло бы сделать эту работу более безопасной в AWS -lambda ?
- Есть ли способы для exe c () выйти из AWS -lambda и выполняйте любые другие сетевые подключения, если все, что я к нему подключил, - это единственный AWS -api-gateway для вызова REST?
- Могу ли я даже нужно ограничить
__builtins__
и локальных, или достаточно ли AWS -лямбда-контейнеров?
BackGround
Кажется, большинство компаний используют Kubernetes и Docker контейнеры для выполнения ненадежного python кода (например, Leetcode , Programiz или hackerRank ).
См. Полезные ссылки:
Мой план
Я думаю, что могу отправить свой произвольный Python код в AWS лямбда-функцию как микросервис, используя их контейнеризацию / масштабирование вместо того, чтобы создавать свои собственные. В контейнере Lambda я могу просто запустить код с помощью простой функции exe c или eval , возможно, с некоторыми ограничениями вроде этого:
"
safe_list = ['math','acos', 'asin', 'atan', 'print','atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
safe_dict['abs'] = abs
exec(userCode,{"**__builtins__"**:None},safe_dict )
Специальное примечание:
- Меня не слишком беспокоят бесконечные циклы или сбой, потому что я просто отключу тайм-аут и скажу пользователю повторить попытку.
- Все, что мне нужно сделать, это запустить довольно просто python код (обычно меньше нескольких строк) и вернуть исключения, стандартный вывод, распечатать и запустить проверьте результат. Необходимо выполнить:
- Математические операторы, списки, циклы, лямбда-функции, карты, фильтры, объявление методов, объявление классов со свойствами, печать.
- Это не обязательно должен быть идеальный проект для сотен тысяч пользователей. Я просто хочу иметь действующий сайт для поддержки резюме и, возможно, немного заработать на рекламе, чтобы помочь с расходами.
- Если есть серьезные ограничения, со временем я могу реализовать это в Kubernetes ( как в приведенной выше ссылке), но, надеюсь, это решение будет работать достаточно хорошо.
- Я просто хочу, чтобы это работало относительно хорошо и не занимало слишком много времени на сборку или не стоило слишком много денег.
- Я не хочу раскрывать какую-либо конфиденциальную информацию.
Безопасность, которую я уже планирую делать:
- AWS лямбда: ограничение тайм-аут примерно до 1-2 секунды
- AWS лямбда: ограничение использования памяти до 128 МБ
- Мой собственный код: используйте regex , чтобы убедиться, что никто не передает двойное подчеркивание badstuff
- Сохранение этого микросервиса как минимально возможное (подключение только одного AWS -API-шлюза).
Другие примечания:
- Я не думаю, что могу использовать с ограничениями Python или песочница PyPy функция AWS Lambda , потому что у меня нет доступа к этим зависимостям OOB. Я надеюсь, что в этом случае в этом нет необходимости.
- Если это невозможно сделать с помощью exe c () , есть ли безопасные python интерпретаторы на GitHub или в другом месте, которое я могу буквально скопировать и вставить в файлы в AWS -lambda и просто называть их?
- Я планирую разрешить пользователю печатать из exe c примерно так:
"
@contextlib.contextmanager
def stdoutIO(stdout=None):
old = sys.stdout
if stdout is None:
stdout = StringIO()
sys.stdout = stdout
yield stdout
sys.stdout = old
with stdoutIO() as s:
try:
exec(userCode)
except:
print("Something wrong with the code")
print( s.getvalue())
print(i)
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или предложения.
___ Edit ** добавление схемы архитектуры ___
Я думаю, что это почти все, что касается архитектуры fr сейчас