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


15

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

각 노드는 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을 독점적으로 사용할 수 있습니까? 내 모델에 확실한 보안 허점이 있습니까? 가이드 라인은 "작업자가 스스로 내려 놓을 수 있지만 그 밖의 다른 것은 허용되지 않아야한다 " .


2
경우 제한 자원 [보내고]하는 것은 당신의 목표, 당신이 할 수있는 더 많은 우분투 게스트보다는 (또는 그 문제에 관해서는 정말 어떤 데비안 파생) . 어떤 경우에는, 당신은 아마 원하는 사용자 모드 리눅스 및 / 또는 (최근 커널과) 사용자 공간
mikeserv

2
LXC는 정확히 필요한 것 같습니다. 왜 그것이 어려운 편이고 안전하지 않다고 생각합니까? (물론, 버그가 있었지만 사용할 수있는 모든 것이 있습니다.)
Gilles 'SO-Stop

'namespaces leaks'에 관한 Ubuntu LXC 문서 의 링크 된 프레젠테이션 (2011 년부터 승인 됨)과 보안 섹션은 그리 안심이되지 않습니다. 네임 스페이스와 cgroups를 기반으로하는 LXC와 같은 것이 어쨌든 가장 좋은 옵션 일 수 있습니다. 나는 또한 Linux-Sandboxing , 흥미로운 독서를 발견했다
StephQ

약간의 재조정이 필요할 수 있지만 BSD 감옥에서 실행하는 것을 고려 했습니까?
라이더

LXC는 많은 VM과 비슷하다는 점에서 '무거운'것일 수 있지만 실제로 만드는 것은 매우 간단합니다. 이러한 솔루션 중 일부는 '더 가벼운'구성에는 많은 구성이 필요할 수 있습니다. LXC를 사용하면 하나의 앱에 전체 컨테이너가 있으므로 쓰기와 같은 것을 구성 할 필요가 없습니다.
MikeP

답변:


1

예, cgroup과 SELinux / AppArmor를 독점적으로 사용하여 실행할 임의의 코드 를 모니터링하고 제어 할 수 있습니다.

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

  1. cpuset서브 시스템을 사용하여 CPU 코어 사용량을 1 CPU로 제한
  2. memory하위 시스템으로 메모리 사용 제한을 설정 하여 포크까지 추적합니다. 예는 https://github.com/gsauthof/cgmemtime 을 참조 하십시오 .
  3. 에없는 아무것도 방지 네트워크 액세스 lonet_prio서브 시스템.

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

참고 : 저는 AppArmor에 익숙하지 않지만 필수 액세스 제어 (MAC) 시스템입니다. 즉, 쓰기와 읽기를 보호하는 것이 중요합니다.

이 시스템을 사용하는 것은 적절한 구성을 작성하는 문제입니다. 물론,이 모든 것이 말보다 훨씬 쉽습니다. 다음은 시작하기위한 몇 가지 참조 링크입니다.

행운을 빕니다!


1

Ubuntu 를 사용하는 경우에만 AppArmor에 대해 SELinux 를 삭제 합니다. (정말 어렵다)

LXC 자체는 안전하지 않습니다. 보안이 필요한 경우 libvirt ( SELinux MLS 기반)를 통해 사용해야합니다 .

귀하의 문제는 무한 하므로 선반에서 해결책을 찾지 않고 무한한 시간 을 보내지 마십시오. 심지어 kernel.org 조차도 뽑혔으며 최근에는 FBI 가 누군가가 지금까지 탐지되지 않고 몇 년 동안 시스템을 사용하고 있다고 선언했습니다.

나는 꽤 좋은 보안을 위해 LXC / libvirt 를 사용하거나 DAX / KSM 을 명확하게 사용하여 컨테이너에 매우 가벼운 VM을 사용하는 "새로운" 인텔 투명 컨테이너를 시도 할 것입니다. 유망한).

커널 악용에 관심이있는 경우 grsecurity 가 솔루션이지만 컨테이너 솔루션과 통합해야합니다 (두통).

따라서 쉬운 작업은 아니지만 LXC / libvirt 는 정말 깔끔하지만 명확한 컨테이너가 나올 것입니다.

도커? 사용할 수있는 방랑 상자가 없을 때 현지 테스트 이상의 도커를 사용하지 않았거나 사용하지 않으려면 더 많은 작업과 더 나은 커뮤니티가 필요합니다.

물론 시스템 컨테이너도 훌륭하지만 언급하지 않았기 때문에 마음에 들지 않거나 원치 않는 것으로 가정하고 공급 업체에 독립적 인 솔루션은 아닙니다.

"더 쉽고"더 아마추어적인 것을 원한다면 firejail을 확인하고 , 일부 데스크탑 "앱"에 사용하고 있으며 작업을 수행합니다 (맞춤형 앱용 템플릿을 만드는 것은 "개인"을 사용하는 것이 매우 쉽습니다) 디렉토리 위에 마운트하고 로컬 전용 네트워크를 제한하고 생성 된 프로세스는 부모를 위해 상속하고 계속 진행합니다 ...).

화 내지 않고 건배와 즐거움. ;)


0

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

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


0

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

나는 그것이 당신의 매개 변수에서 다음과 같이 작동한다고 생각합니다 :

fs : 다른 곳에서 자신의 디렉토리를 읽고 쓸 수 있습니다

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

mem : 예, 유휴 및 비유 휴 시스템에 대한 별도의 메모리 제한

CPU : 예, "컴퓨터가 유휴 상태가 아닌 경우 실행하지 마십시오"라고 말할 수 있음

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.