가장 간단한 보안 샌드박스(제한된 리소스 필요)

가장 간단한 보안 샌드박스(제한된 리소스 필요)

저는 분산 시뮬레이션을 구현하는 프로젝트를 진행 중입니다.평상복코드는 여러 노드에서 실행되며 결과가 수집되고 집계됩니다.

각 노드는 Ubuntu Linux 가상 머신의 인스턴스이며 여러 작업자 프로세스(코어당 1개)에 실행할 코드를 전달하는 마스터 프로세스를 실행합니다.

이 질문은 각 작업자에 대해 가상 머신 인스턴스를 사용하지 않고 각 작업자가 샌드박스 환경에서 실행되도록 하는 방법에 관한 것입니다. 근로자에 대한 구체적인 요구사항은 다음과 같습니다.

  • FS: 쓰기 권한은 없으며 읽기 전용 권한은 단일 디렉터리(및 하위 폴더)로 제한됩니다.
  • 그물: 로컬 통신만 허용(IPC, TCP 등...)
  • 메모리: 메모리 제한을 초과하면 메모리 사용량 제한(스왑 메모리 없음)이 종료됩니다.
  • CPU: 코어는 1개만 허용되며, 제한 시간 초과 시 종료됩니다.

다른 제한 사항은 적용되어서는 안 됩니다. 작업자 스레드는 동적 라이브러리(읽기 전용 폴더에서)를 로드하고, 새 스레드 또는 프로세스를 생성하고, 시스템 함수를 호출하고, ecc ecc할 수 있어야 하지만 제한 사항은 생성/로드된 엔터티에 의해 상속되어야 합니다. 적용 방식으로 합산해야 합니다(예: 작업자 스레드의 메모리 제한이 1GB이기 때문에 하나의 작업자 스레드가 각각 800MB를 사용하는 두 개의 스레드를 생성하도록 할 수 없습니다).

노동자들이 자신의 권리를 향상시킬 수 있는 방법이 없어야 한다는 것은 말할 필요도 없습니다.

나는 내 요구 사항을 충족하는 가장 간단한 솔루션을 찾기 위해 사용 가능한 대안(SELinux, AppArmor, cgroups, ulimit, Linux 네임스페이스, LXC, Docker 등)을 검토하는 데 꽤 오랜 시간을 보냈지만 이 분야에 대한 내 경험은 제한적이었습니다.

현재 이해: LXC와 Docker는 내 사용 사례에 비해 약간 무겁고 완전히 안전하지 않습니다.1. AppArmor는 구성이 더 쉽고, 파일 시스템 및 네트워크 제한에 사용하기 때문에 SELinux보다 낫습니다. cgroup은 ulimit(단일 프로세스에서 실행)보다 낫고, 메모리 및 CPU 제한에 사용합니다.

이것이 내 목표를 달성하는 가장 쉬운 방법입니까? AppArmor 또는 cgroup을 단독으로 사용할 수 있나요? 내 모델에 명백한 보안 허점이 있습니까? 지침은 다음과 같아야합니다.“노동자들은 스스로 넘어질 수 있지만 그 외에는 아무것도 허용되지 않습니다”.

답변1

예, 특히 cgroup과 SELinux/AppArmor를 사용하여 모니터링하고 제어할 수 있습니다.평상복실행할 코드입니다.

cgroup을 사용하면 다음을 수행할 수 있습니다:

  1. cpuset하위 시스템의 CPU 코어 사용량을 CPU 1개로 제한
  2. 메모리 사용량 제한 설정 memory하위 시스템은 메모리 사용량 제한을 설정하고 포크도 추적합니다. 바라보다https://github.com/gsauthof/cgmemtime예를 들어.
  3. lo하위 시스템 에 net_prio연결되지 않은 항목에 대한 네트워크 액세스를 방지합니다 .

SELinux/AppArmor를 사용하면 프로세스에 대한 읽기/쓰기 액세스를 제한할 수 있습니다.

참고: 저는 AppArmor에 대해 잘 모르지만 이는 쓰기 및 읽기 보호가 해당 작업인 필수 액세스 제어(MAC) 시스템입니다.

이러한 시스템을 사용하려면 올바른 구성을 작성해야 합니다. 물론 이것은 말처럼 쉽지 않습니다. 시작하는 데 도움이 되는 몇 가지 참조 링크는 다음과 같습니다.

행운을 빌어요!

답변2

나는 버릴 것이다SELinux~을 위한갑옷을 적용내가 사용하는 경우에만우분투. (정말 꽤 어렵다)

LXC본질적으로 안전하지 않음 보안이 필요한 경우 다음을 통해 사용해야 합니다.라이브러리 가상 머신(기준으로SELinux MLS).

당신의 문제는끝없는그러므로 무제한의 시간 없이 기성 솔루션을 찾으려고 하지 마십시오.kernel.org최근에 사기를 당했어요FBI누군가 자신의 시스템을 수년 동안 사용해왔는데 이제서야 발견되었다고 주장합니다.

내가 함께 할게LXC/libvirt좋은 보안을 위해 그렇지 않으면 "new"를 시도하겠습니다.인텔 투명 용기, 컨테이너에 매우 가벼운 VM을 사용하고 명시적으로독일 DAX/KSM(아직 테스트하지는 않았지만 유망해 보입니다.)

커널 악용이 우려되는 경우사이버 보안귀하의 솔루션이지만 이를 컨테이너 솔루션과 통합해야 합니다(물론 골치 아픈 일입니다).

그러니 확실히 쉽지 않은 일이죠.LXC/libvirt정말 깔끔하지만 투명한 용기가 더 나을 수도 있습니다.

루스트어바웃? vagrant box를 사용할 수 없을 때 로컬 테스트 이외의 용도로 docker를 사용하지 않습니다. 더 많은 작업과 더 나은 커뮤니티가 필요합니다.

물론 systemd 컨테이너도 좋지만 언급조차 하지 않았고 공급업체에 구애받지 않는 솔루션이 아니기 때문에 마음에 들지 않거나 원하지 않는다고 가정합니다.

"더 간단하고" 더 아마추어적인 것을 원한다면 확인해 보세요.화재 감옥, 저는 몇 가지 데스크톱 "앱"에서 이 앱을 사용하고 있으며 작업을 수행합니다(맞춤형 앱용 템플릿을 만드는 것이 매우 쉽습니다. 디렉터리 상단에 있는 "개인" 설치를 사용하고 네트워크를 로컬 사용으로 제한합니다) 단, 생성 프로세스는 상위 프로세스를 상속하고 계속됩니다...).

화내지 않고 즐겁게 보내세요. ;)

답변3

seccomp-bpf는 OpenSSH, vsftpd 및 Chromium에서 작동하는 또 다른 옵션입니다. 여기에는 exit(), sigreturn(), read()만 있고 write()도 사용하지만 구성 가능한 Berkeley 패킷 필터 규칙 필터링을 사용할 수 있습니다. 시스템 이전. 메모리, CPU 등을 위한 cgroup과 함께 사용할 수도 있습니다.

https://wiki.mozilla.org/Security/Sandbox/Seccomp

답변4

그리드 컴퓨팅 시스템을 살펴보고 싶을 수도 있습니다. 특히 BOINC(http://boinc.berkeley.edu) 거의 모든 상자를 확인합니다.

귀하의 매개변수에 따라 실행될 것이라고 믿습니다.

fs: 자신의 디렉터리를 읽고 쓸 수 있지만 다른 디렉터리는 읽을 수 없습니다.

net: BOINC 서버에 대한 네트워크 액세스만 허용하도록 구성할 수 있지만 기본 IIRC는 아닙니다.

mem: 예, 유휴 컴퓨터와 유휴 컴퓨터가 아닌 컴퓨터에 대한 별도의 메모리 제한

CPU: 예, "컴퓨터가 유휴 상태가 아니면 실행하지 마세요"라고 말할 수도 있습니다.

관련 정보