Запуск ненадежного Python кода в AWS -LAMBDA с использованием Exe c или Eval - PullRequest
2 голосов
/ 10 июля 2020

Провел тонну исследований. Я простой падаван, однако у меня есть проект, в котором я должен запустить ненадежный 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 сейчас

1 Ответ

0 голосов
/ 13 августа 2020

Интересный пост, я также смотрю на использование существующей инфраструктуры AWS для запуска ненадежного python кода вместо использования docker контейнеров, которые могут быстро стать дорогостоящими. Я только начал изучать это, но я предпочел использовать ограниченный Python, чтобы добавить некоторые меры безопасности.

Я новичок как в python dev, так и в лямбдах, но вы упомянули об ограниченном Python не доступен из коробки, все, что вам нужно сделать, это включить его как зависимость в zip-архив и загрузить в лямбду? Если я чего-то не упустил?

Также не уверен, видели ли вы это, но я нашел этот видеоролик очень полезным: https://www.youtube.com/watch?v=sL_syMmRkoU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...