여러 사용자가 컨테이너 이미지를 실행 중입니다.동일한슈퍼컴퓨터의 사용자 계정("서비스 계정"). 각 컨테이너는 민감한 데이터가 포함된 폴더를 마운트합니다. 한 서비스 계정 사용자는 다른 서비스 계정 사용자의 데이터에 액세스할 수 없습니다. "사용자마다 다른 사용자 계정을 사용"하는 것이 해결책이라는 것을 알고 있지만 이 솔루션은 그렇지 않습니다. 여기서는 작동하지 않습니다. 모든 사람이 동일한 서비스 계정을 사용해야 합니다.
임시 tmpfs 마운트 파일 시스템을 사용하는 Bwrap이 해결책이 될 수 있지만 불행하게도 설치된 컨테이너 런타임(Singularity 및 Sarus)으로 인해 bwrap을 사용할 수 없습니다. 예를 들어 Sarus는 특정 파일 세트가 루트의 소유인지 확인하지만 bwrap은 파일이 누구에게도 속하지 않도록 새 사용자 네임스페이스를 생성합니다(권한 없는 Singularity 설치가 솔루션인지 확실하지 않음).
내 생각은 컨테이너가 수행하는 파일 시스템 작업을 tmpfs에 민감한 파일을 저장하는 bwrap'ed 프로세스로 "리디렉션"하는 것입니다. 예를 들어, 컨테이너가 해당 폴더에 파일을 쓰려고 하면 파일은 즉시 bwrap'ed 프로세스로 전달되고, 이 프로세스는 이를 tmpfs로 전달합니다. 또는 컨테이너가 디렉터리에서 파일을 읽으려고 시도하면 bwrap'ed 프로세스가 tmpfs에서 파일을 전달하고 컨테이너에 직접 전달합니다. 각 파일 시스템 작업 전에 비밀을 추가하고 올바른 비밀이 사용되는 경우에만 파일을 배포하는 등 일종의 액세스 제어가 있을 수 있고 있어야 합니다.
내 첫 번째 생각은 해당 디렉토리에 설치된 소켓을 수신하는 일종의 서버를 작성하는 것이었지만 이것이 가능한지 확실하지 않았습니다.
다음으로 나는 그것이 쉽다는 것을 알았습니다리디렉션다른 프로세스로의 명령 출력(예:
ls > /proc/5555/fd/1
나는 이것이 매우 간단한 해결책으로 이어질 수 있다고 생각합니다.
해결책은 다음과 같습니다.
컨테이너는 bwrap'ed 프로세스에 마운트된 폴더에서 쓰기/폴더에 쓰기
해당 폴더에 "기록된" 모든 파일은 비밀번호로 시작하고 이를 tmpfs로 리디렉션하는 bwrapped 프로세스(예: 쉘 스크립트)에 의해 직접 인계되어 다른 사용자에게 숨겨집니다.
대신 컨테이너가 이 가짜 디렉터리에서 파일을 읽으려고 할 때 비밀번호 앞에도 추가하고 bwrap'ed 프로세스는 파일을 tmpfs에서 컨테이너로 직접 전달합니다.
리디렉션과 같은 간단한 명령을 사용하여 이 작업을 수행할 수 있다고 생각하지만 이해할 수 없습니다.
폴더(또는 일반적으로 마운트 지점)가 위 방식으로 프로세스에 대한 자동 리디렉터 역할을 할 수 있는 방법을 이해할 수 없습니다.
어쩌면 내 솔루션 아이디어도 완전히 오해의 소지가 있을 수 있으며 이 문제를 해결하는 더 좋은 방법이 있을 수 있습니다. 모든 단서에 만족합니다. 또한 컨테이너를 중첩하고 외부 컨테이너에 쓰기 가능한 레이어를 두는 것도 고려했지만 Singularity와 같은 HPC 컨테이너 런타임으로는 이를 달성하기가 쉽지 않습니다.
각 솔루션은 sudo 권한 없이 사용자 공간에서 실행되어야 합니다.
편집: 이것이 내가 시도한 것입니다:
> bwrap --dev-bind / / --tmpfs ~/testfolder/sandbox/ bash
> sarus run debian cat /etc/os-release
[73526.403627484] [daint101-28645] [main] [ERROR] Error trace (most nested error last):
#0 checkThatPathIsRootOwned at "SecurityChecks.cpp":78 Path "/apps/daint/system/opt/sarus/1.3.2/etc/sarus.json" must be owned by root in order to prevent other users from tampering its contents. Found uid=65534, gid=65534.
아니면 특이점을 가지고 있거나
> bwrap --dev-bind / / --tmpfs ~/testfolder/sandbox/ bash
> singularity exec ubuntu_latest.sif cat /etc/os-release
INFO: Convert SIF file to sandbox...
FATAL: while extracting ubuntu_latest.sif: root filesystem extraction failed: extract command failed: ERROR : No setuid installation found, for unprivileged installation use: ./mconfig --without-suid
: exit status 1