Linux에서 바이너리를 제한/샌드박싱하기 위한 다양한 옵션을 이해하려고 노력 중입니다. docker처럼 사용할 수 있다는 것을 알았 namespaces
습니다 cgroups
. 나는 SELinux
다음과 같은 것을 사용할 수 있습니다이 링크는 제안합니다. 어느 것을 사용해야 합니까? 네임스페이스와 cgroup은 SELinux를 사용하여 구현됩니까? Linux에서는 어떻게 공존합니까?
그리고 언제 능력을 사용하나요? 바이너리에 SElinux 또는 네임스페이스/cgroup 정책이 내장되어 있는 경우 이러한 정책이 필요한 이유는 무엇입니까?
답변1
Linux에는 프로세스를 제한하는 데 사용할 수 있는 여러 가지 보안 메커니즘이 포함되어 있습니다. 대부분은 샌드박스와 컨테이너를 구축하는 데 함께 사용할 수 있습니다. 일부 메커니즘에 대한 간략한 개요:
디지털-아날로그 변환기(임의 접근 제어): 기존 소유자/그룹 권한입니다. 프로세스 소유자, 그룹 및 파일에 대한 기존 권한 비트입니다.
사과(필수 접근 제어), SELinux 및 AppArmor가 가장 일반적인 구현입니다. MAC 시스템은 주체(프로세스, 사용자 등)와 객체(파일, 소켓 등) 사이에 규칙을 적용하여 허용된 액세스를 결정합니다. MAC 규칙은 복잡한 정책과 보다 세분화된 권한을 지원합니다. 그러나 구성 노력이 적지 않을 수 있습니다.
능력프로세스가 수퍼유저 권한의 하위 집합을 가질 수 있도록 허용합니다. 루트로 실행되는 프로세스는 권한이 없는 사용자로 전환하기 전에 특정 기능을 유지할 수 있으므로 최소한의 슈퍼유저 기능만 유지하여 공격 표면을 줄일 수 있습니다. 그러나 많은 기능이 너무 광범위하여 루트와 거의 동일합니다.[1]. 일부 setuid 바이너리는 파일 기능을 사용하여 비setuid로 만들 수 있습니다.
cgroup프로세스 회계, 애플리케이션 자원 제약 및 관리에 사용됩니다. 예를 들어냉장고그룹 내의 모든 프로세스를 동결하는 안정적인 방법을 제공합니다(그렇지 않으면 문제가 될 수 있음).
네임스페이스프로세스가 별도의 환경(마운트, 네트워크, 사용자, pid 등)을 갖도록 허용합니다. 네트워크 네임스페이스는 동일한 네트워크 구성을 공유하지 않으며, 각 pid 네임스페이스는 상위 네임스페이스의 PID를 알지 못합니다. 네임스페이스를 사용하여 Linux 컨테이너를 구축하는 방법을 쉽게 확인할 수 있습니다.
(chroot, seccomp 필터 및 ACL과 같은 더 많은 메커니즘이 있습니다.)
일부 기능은 중복됩니다(예: DAC, MAC 및 기능). 이들을 함께 사용하면 계층화된 보안을 구축하는 데 여전히 유용할 수 있습니다. 이상적으로는 버그나 잘못된 구성으로 인한 취약성을 이러한 계층 중 하나에서 완화할 수 있습니다.
각 기능에는 자체 유틸리티와 API가 포함되어 있습니다.LXC단일 인터페이스를 통해 이러한 기능을 활용할 수 있는 간단한 방법을 제공합니다. LXC는 또한 부분적인 기능만 사용하는 구성을 허용합니다. 예를 들어 호스트와 마운트 네임스페이스를 공유하는 동안 프라이빗 네트워크 네임스페이스를 갖는 것입니다. 자체 독립 네임스페이스가 있는 컨테이너 내에서 전체 Linux 사용자 공간을 실행하는 것도 가능합니다.