2012-05-14 4 views
8

나는 내부에 신뢰할 수없는 WSGI-apps가있는 python-projects가있다. 나는 그들을 simlatiously 안전하게 실행해야합니다. 그래서 디렉토리 접근, 파이썬 모듈 사용 및 CPU와 메모리에 대한 제한에 대한 제한이 필요합니다.파이썬 코드 jailing

나는 두 가지 방법을 고려 : 정의 파일의 꼬마 도깨비 모듈 WSGI 객체를 통해

  1. 가져 오기를, 그리고 pysandbox으로 실행. 할 때 지금은 SandboxError: Read only object 있습니다

    self.config = SandboxConfig('stdout') 
    self.sandbox = Sandbox(self.config) 
    self.s = imp.get_suffixes() 
    wsgi_obj = imp.load_module("run", open(path+"/run.py", "r"), path, self.s[2]).app 
    … 
    return self.sandbox.call(wsgi_obj, environ, start_response) 
    
  2. 수정 파이썬 인터프리터, ZMQ/유닉스 소켓을 통해 통신, 병렬 프로세스로 실행 잠재적으로 위험한 모듈을 제외 할 수 있습니다. 심지어 여기서부터 시작해야할지 모르겠다.

추천 하시겠습니까?

+0

프로세스 분리가 좋은 아이디어입니다. 더 나은 가상화를 사용하는 것입니다. pysandbox에 대해서는 잘 모릅니다. 그러나 파이썬 코드를 샌드 박싱하는 기존 솔루션이 그리 좋지 않다고 들었습니다. –

+1

CPython의 샌드 박싱은 좋지 않지만 다른 Python 인터프리터, 특히 PyPy는 더 완벽한 샌드 박스 지원 기능을 제공합니다. –

+0

나는 PyPy 샌드 박싱을 시도했다. 너무 복잡합니다. – sashab

답변

3

각 응용 프로그램에 대해 별도의 프로세스 및 구성과 사용자 수준 권한 (서로 다른 사용자의 각 신뢰할 수없는 응용 프로그램)을 사용하여 응용 프로그램을 gunicorn으로 실행할 것입니다. 각 gunicorn 인스턴스는 사용자 범위 포트의 localhost에서 작동하며 nginx 또는 다른 웹 서버가 웹에 연결하여 라우팅 할 수 있습니다.

Heroku는이 단계를 더 진행하여 가상 머신에서 각 gunicorn 인스턴스 (또는 유니콘 또는 Apache 또는 임의의 다른 서버)를 샌드 박싱합니다. 이것은 아마도 작업을 수행하는 가장 안전한 가능한 방법이며, 확실히 CPU 및 메모리 사용을 안정적으로 제한하기위한 최상의 옵션이지만, 요구 사항에 따라 그다지 멀리 갈 필요는 없습니다.

이러한 접근법의 장점 중 하나는 적절한 경우 각 응용 프로그램을 다른 버전의 Python에서 실행할 수 있다는 것입니다. 가상 시스템 샌드 박스를 사용하면 서로 다른 운영 체제에서 완전히 실행할 수도 있습니다.

편집 : VM 샌드 박스 접근 방식을 사용하지 않고 메모리 사용을 제한하려면 this question을 참조하십시오. CPU 사용을 제한하려면 gunicorn 설정을 조정하십시오. 응용 프로그램에서 사용할 수있는 코어 당 하나의 gevent 스타일 작업자를 위로 올려 놓으십시오.

다시 편집 : 완전히 다른 접근 방식은 PyPy's sandboxing mechanism을 사용하는 것이고 이는 CPython과 샌드 박스 모듈보다 훨씬 안전해야합니다. 그러나 guincorn 또는 gunicorn + 가상 시스템 접근 방식을 선호합니다.

+0

라우팅을위한 솔루션으로 무엇을 권할 수 있습니까? 그것은 빠르고 비동기, 그리고 몇 가지 추가적인 로직 때문에 nginx 솔루션되지 않습니다해야합니다. 폭풍? – sashab

+0

흠, 잘 모르겠다. 나는 gunicorn의 앞면으로 nginx를 사용했고 스택의 그 부분을 많이 실험하지 않았다. 추가 로직을 통해 사용자 정의 코드를 작성해야합니까? 그럴 경우 어쩌면 토네이도가 최고 일 것입니다. Gunicorn에는 일종의 토네이도 지원이 있지만 나는 그것이 당신이 생각하고있는 것보다 다른 목적을 가지고 있다고 믿습니다. –

+0

음, 기본적으로 하위 도메인을 앱에 연결해야하며 동적으로 수행해야합니다 (앱의 수는 변경 될 수 있음). – sashab