Linux 프로세스의 쓰기 권한을 폴더로 제한

Linux 프로세스의 쓰기 권한을 폴더로 제한

프로세스(및 모든 잠재적 하위 프로세스)가 내 사용자 프로필을 기반으로 파일 시스템을 읽을 수 있기를 원하지만 해당 프로세스의 쓰기 권한을 미리 선택된 폴더 집합(아마도 하나의 폴더)으로만 제한하고 싶습니다. ) .

chroot액션이 너무 광범위한 것 같습니다. 프로세스를 파일 시스템의 특정 부분으로 제한하면 /bin폴더 등을 마운트해야 하는 필요성이 훨씬 간단해집니다. 내 프로세스는 내가 시작하는 일반적인 프로세스처럼 파일 시스템의 내용을 읽을 수 있어야 합니다.

도커 컨테이너를 사용하고 볼륨을 마운트할 수 있지만 이는 과도한 것 같습니다. 도커를 설치하고, 이미지를 생성하고, 컨테이너를 시작해야 하는 등의 작업이 필요합니다.

비슷한 일을 할 수 있는 방법이 있나요? :

restricted-exec --read-all --write-to /a/particular/path --write-to /another/particular/path my-executable -- --option-to-the-executable

일부unveil그러나 호출 프로세스에 의해 제어되며 쓰기 액세스에만 사용됩니다.

답변1

을 사용할 수도 있습니다 . 여기에는 및 systemd와 같은 파일 시스템 액세스를 제어하는 ​​다양한 설정이 있습니다 .ReadOnlyPathsReadWritePaths

systemd-run다음은 쓰기 권한만 사용하여 명령을 실행하는 간단한 예입니다 /var/lib. 이 예제는 touch여러 디렉터리에 파일을 만드는 데 사용되지만 쓰기 가능한 경로만 성공합니다.

root@ubuntu:~# systemd-run --wait -p ProtectSystem=strict -p ProtectHome=read-only -p ReadWritePaths=/var/lib bash -c
'touch /etc/myfile /var/lib/myfile /var/cache/myfile /root/myfile /home/ubuntu/myfile'
Running as unit: run-u1008.service
Finished with result: exit-code
Main processes terminated with: code=exited/status=1
Service runtime: 44ms
root@ubuntu:~# ls -l {/etc/,/var/lib/,/var/cache/,/root/,/home/ubuntu/}myfile
ls: cannot access '/etc/myfile': No such file or directory
ls: cannot access '/var/cache/myfile': No such file or directory
ls: cannot access '/root/myfile': No such file or directory
ls: cannot access '/home/ubuntu/myfile': No such file or directory
-rw-r--r-- 1 root root 0 Mar  3 23:17 /var/lib/myfile

편집하다

옵션을 사용하여 사용자로 명령을 실행할 수 있습니다 -p User. 불행히도 내 제안을 사용하려면 루트 액세스 권한이 필요합니다.아니요파일 시스템 보호 사용 --user(기준:systemd-run --user이와 같은 제한 사항이 구현되지 않은 이유는 무엇입니까 ProtectSystem?).

여기 또 다른 간단한 예가 있습니다. 이번에는 명령이 ubuntu사용자로 실행됩니다.

root@ubuntu:~# install -o ubuntu -g ubuntu -d /tmp/{test,test2}
root@ubuntu:~# systemd-run --wait -p User=ubuntu -p ProtectSystem=strict -p ProtectHome=read-only -p ReadWritePaths=/tmp/test bash -c 'touch /tmp/test/myfile /tmp/test2/myfile /home/ubuntu/myfile'
Running as unit: run-u1043.service
Finished with result: exit-code
Main processes terminated with: code=exited/status=1
Service runtime: 55ms
root@ubuntu:~# ls -l /tmp/{test,test2}/myfile /home/ubuntu/myfile
ls: cannot access '/tmp/test2/myfile': No such file or directory
ls: cannot access '/home/ubuntu/myfile': No such file or directory
-rw-r--r-- 1 ubuntu ubuntu 0 Mar  5 17:37 /tmp/test/myfile

보호에 관심이 있다면 systemd의 기능을 /tmp고려해 볼 수도 있습니다 . PrivateTmp이는 샌드박스 프로세스에 사용할 수 있는 시스템 설정 중 하나일 뿐입니다.

답변2

firejail수행한 작업:

mkdir -p ~/test && firejail --read-only=/tmp --read-only=~/ --read-write=~/test/ touch ~/test/OK ~/KO /tmp/KO

관련 정보