저는 온라인 심판 시스템을 갖춘 시스템을 구축하고 있습니다. 모든 실행 파일을 실행하고 출력을 평가해야 합니다. 문제는 이를 모두 하나의 컨테이너, 다른 폴더에 넣으면 응용 프로그램 중 하나가 해당 폴더를 종료하고 다른 응용 프로그램에 속한 다른 폴더에 액세스하려고 할 수 있다는 것입니다. 이 경우 메인 서버는 보호되지만, 다른 애플리케이션과 평가자는 보호되지 않습니다.
나만의 솔루션을 찾았지만 더 나은 솔루션이 있다고 생각합니다. 예를 들어 5개의 컨테이너를 만들고 각 컨테이너는 동일한 알고리즘을 실행하며 각 컨테이너는 한 번에 1개의 문제를 평가합니다. 질문이 평가된 후에는 삭제되고 다른 질문이 접수됩니다. 이 경우 마스터 서버와 모든 애플리케이션은 보호되지만 평가자는 보호되지 않습니다. 평가된 응용 프로그램은 해당 폴더를 종료하고 임의의 텍스트 파일 쓰기를 시작할 수 있습니다(예: 전체 메모리를 채우는 것).
평가자는 실행 파일을 시작하고 실행 시간(1~2초 이상 걸리면 종료됨)과 사용하는 메모리(특정 한도에 도달하면 종료됨)를 측정합니다.
저도 매번 컨테이너를 생성하고 실행 파일을 평가한 후 삭제할까도 생각했지만, 컨테이너를 생성하고 시작하는 데 몇 초 밖에 걸리지 않습니다...
컨테이너와 평가자로부터 평가 프로세스를 분리하는 방법은 무엇입니까? 기본적으로 한 프로세스가 다른 폴더에 액세스하는 것을 방지하고 싶습니다.
답변1
귀하의 문제 설명에서 귀하의 애플리케이션에 대해 다른 사용자 계정을 생성하는 것을 방해하는 내용을 읽지 못했습니다. 그런 다음 간단한 파일 권한을 사용하여 간섭을 방지할 수 있습니다.
chown app1 /var/lib/myapps/app1
chmod 700 /var/lib/myapps/app1
sudo -u app1 /var/lib/myapps/app1/run.sh
편집하다
평가자가 실행 중이면 root
응용 프로그램을 시작하여 간단히 수행할 수 있습니다 sudo
.
평가자가 실행되고 있지 않으면 root
프로세스가 평가자 프로세스가 아닌 바이너리를 소유한 사용자로 실행되도록 일반적인 방법으로 호출하는 응용 프로그램을 SUID 비트(사용자 ID 설정)와 함께 설치할 수 있습니다. .
답변2
답변3
봉쇄가 없으면 Hauke Laging이 제안한 대로 특정 사용자와 함께 chroot 환경에서 애플리케이션을 실행하는 것이 좋습니다. 비교하다남자 chroot
설정은 쉽습니다. 복잡성은 애플리케이션이 액세스해야 하는 리소스에 따라 다릅니다.