프로세스가 파일을 덮어쓰는 것을 방지

프로세스가 파일을 덮어쓰는 것을 방지

그 설정

program소스 코드를 사용할 수 없는(아마 독점/레거시) 실행 파일이 있다고 가정해 보겠습니다 .

프로그램이 실행될 때마다 file.txt전달된 명령줄 인수에 따라 항상 같은 이름과 항상 같은 디렉토리에 파일을 생성합니다 program.

질문

program여러 인스턴스를 동시에 실행하고 싶습니다 . 이는 서버가 클라이언트의 실행 요청을 program수신하고 있는 상황에서 발생할 수 있습니다 .program

문제는 두 인스턴스가 모두 동일한 인스턴스에 쓰기 때문에 이것이 가능하지 않아 file.txt파일이 손상될 수 있다는 것입니다.

가능한 솔루션 아이디어

  • program어떻게든 의 출력을 고유한 이름을 가진 파일로 리디렉션 할 수 있습니까 (소스가 손실되었음을 기억하세요)?
  • 어떻게든 "샌드박스"하여 program별도의 파일 시스템에서 실행되는 것처럼 동작하도록 할 수 있습니까(오버헤드는 무시할 수 있음)?
  • 들어본 적은 있지만 LD_PRELOADC 표준 라이브러리 함수 재정의에만 적용되는지, 아니면 일반적으로 Linux 시스템 호출 재정의에도 적용되는지는 모르겠습니다.

어떤 아이디어가 있나요?

답변1

프로그램이 실행될 때마다 파일이 생성됩니다. 파일을 "file.txt"라고 부르겠습니다. 항상 같은 이름과 항상 같은 디렉터리에 있으며, 파일은 프로그램에 전달된 명령줄 인수에 따라 다릅니다.

프로그램이 동적 실행 파일인 경우 다음을 통해 함수 삽입을 사용할 수 있습니다.LD_PRELOAD파일을 다른 위치(예: 환경 변수로 지정된 위치)에 쓰도록 합니다. 이는 호출을 가로채서 해당 호출이 대상인지 open확인한 다음 적절한 대안을 실행하는 것을 의미합니다.openfile.txt

프로그램이 시스템 서비스로 시작되면 다음을 사용할 수 있습니다.PrivateMounts자체 마운트 네임스페이스에서 이를 실행하고 이를 쓸 수 있는 이름으로 마운트하는 옵션입니다 file.txt.

@glennjackman이 의견에서 제안한 것처럼 프로세스가 컨테이너에서 실행되도록 예약할 수도 있습니다. 이는 기본적으로 이전 솔루션과 동일하지만 시스템 중단 대신 Docker 또는 Podman과 같은 컨테이너 런타임을 사용하여 설정합니다. .


위의 옵션 중에서 컨테이너 내부에서 실행하는 것이 아마도 운영상 가장 쉬운 방법일 것입니다.


"LD_PRELOAD"에 대해 들어본 적이 있지만 이것이 C 표준 라이브러리 함수를 재정의하는 데에만 작동하는지, 아니면 일반적인 Linux 시스템 호출을 재정의하는 데에도 작동하는지 모르겠습니다.

함수 삽입을 통해 LD_PRELOAD함수 호출만 차단할 수 있으며 시스템 호출은 차단할 수 없습니다. 그러나 이것은 일반적으로 괜찮습니다. 코드가 호출할 때 open시스템 호출을 직접 호출하는 것이 아니라 opensyscall을 호출하는 것입니다. 이는 glibc 래퍼 함수를 ​​호출하고, 이는 차례로 시스템 호출을 호출합니다.

관련 정보