분산 시뮬레이션을 구현하는 프로젝트를 진행 중입니다. 임의의 코드가 여러 노드에서 실행되고 결과가 나중에 수집 및 집계됩니다.
각 노드는 Ubuntu Linux 가상 머신의 인스턴스이며 실행되는 코드를 여러 작업자 프로세스 (각 코어 당 1 개)로 전달하는 마스터 프로세스를 실행합니다.
이 질문은 각 작업자가 가상 컴퓨터 인스턴스를 사용하지 않고 샌드 박스 환경에서 각 작업자를 운영하는 방법에 관한 것입니다. 근로자의 정확한 요구 사항은 다음과 같습니다.
- fs : 쓰기 권한 없음, 단일 디렉토리 (및 하위 폴더)로 제한된 읽기 전용 권한
- net : 로컬 통신 만 허용됨 (IPC, TCP 등)
- mem : 메모리 사용량 제한 (스왑 메모리 없음) mem limit 이상인 경우 kill
- CPU : 1 코어 만 허용, 시간 제한 초과시 킬
작업자는 동적 라이브러리 (읽기 전용 폴더에서)를로드하고, 새 스레드 또는 프로세스를 생성하고, 시스템 기능을 호출하고, ecc ecc를 호출 할 수 있어야하지만, 생성 된 /로드 된 엔터티에 의해 제한이 상속되어야합니다. 합리적으로 적용해야합니다 (예를 들어 작업자가 각각 800MB를 사용하는 두 개의 스레드를 생성 할 수는 없습니다)
노동자가 그 권리를 높일 수있는 방법이 없어야한다는 것은 말할 나위도 없습니다.
필자는 요구 사항을 충족시키는 가장 간단한 솔루션에 대해 사용 가능한 대안 (SELinux, AppArmor, cgroups, ulimit, Linux 네임 스페이스, LXC, Docker 등)을 검토하는 데 상당한 시간을 보냈지 만 현장에서의 경험은 제한적입니다.
현재 이해 : LXC와 Docker는 나의 사용 사례를 위해 무거운 편이며 약간 안전하지 않습니다 1 . 쉬운 구성으로 인해 SELinux보다 선호되는 AppArmor는 fs 및 net 제한에 사용하십시오. 단일 프로세스에서 작동하는 ulimit보다 선호되는 cgroup은 mem 및 cpu 제한에 사용되었습니다.
이것이 내 목표를 달성하는 가장 간단한 방법입니까? AppArmor 또는 cgroup을 독점적으로 사용할 수 있습니까? 내 모델에 확실한 보안 허점이 있습니까? 가이드 라인은 "작업자가 스스로 내려 놓을 수 있지만 그 밖의 다른 것은 허용되지 않아야한다 " .