전체 시스템에 영향을 미치기 위해 Tomcat에서 mount --bind를 얻는 방법은 무엇입니까?

전체 시스템에 영향을 미치기 위해 Tomcat에서 mount --bind를 얻는 방법은 무엇입니까?

파일이 포함된 폴더가 있습니다.

/path/to/data/one/it_works.txt

빈 폴더가 있습니다.

/path/to/user/bob

Tomcat의 웹 애플리케이션에서 실행해야 하는 스크립트가 있습니다. 이는 다음과 같습니다.

#!/bin/sh

Source="$1"
Target="$2"

/bin/mkdir "$Target"
/bin/touch "$Target/it_failed.txt"
sudo /bin/mount --bind "$Source" "$Target" || exit 1
ls "$Target"
exit 1

(이것은 exit 1웹 애플리케이션에 의해 기록된 출력을 얻기 위한 것입니다. 일단 작동하면 제거합니다.)

Sudo가 올바르게 설정된 것 같습니다.

실행하면 예상대로 인쇄됩니다 sudo -u tomcat ./the-script.sh /path/to/data/one /path/to/user/bob/one. it_works.txt그러면 cd /path/to/user/bob/onels, 나도 it_works.txt찾을 것입니다. (그런 다음 umount 및 rmdir $Target을 수행합니다.) 웹 애플리케이션에서 스크립트를 실행하면 로그도 it_works.txt기록됩니다(예상). 하지만 만약 내가 그리고 cd /path/to/user/bob/one, ls나는 을 찾습니다 it_failed.txt. 다른 프로세스에서도 마찬가지입니다(내 경우에는 WebDAV; WebDAV가 심볼릭 링크를 지원하지 않기 때문에 심볼릭 링크를 사용할 수 없는 이유입니다).

마운트 바인딩은 이를 실행하는 프로세스에만 적용되고(비록 sudo) 시스템의 나머지 부분에는 적용되지 않는 것 같습니다.

처음에는 샌드박스 때문에 이런 현상이 일어나는 줄 알았는데 systemd, 설정을 해보니 ProtectSystem=false계속 같은 현상이 발생하네요...

Tomcat 프로세스 범위 외부에서 마운트 바인딩을 적용하는 방법은 무엇입니까?

(Distro는 데비안 10.10입니다)

답변1

행동예전에는로 인해 발생했습니다 systemd.unshare(1)환경이라면어느명령에서 InaccessiblePaths,PrivateMounts, PrivateTmp, PrivateDevices, ProtectSystem, ProtectHome, ReadOnlyPaths또는 파일에서 ReadWritePaths활성화됩니다 tomcat9.service.

나는 그 중 하나를 주석 처리하여 이 문제를 제거했습니다. 현재 보안 섹션의 모습은 다음과 같습니다 [Service].

# Security
User=tomcat
Group=tomcat
# PrivateTmp=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=false
CacheDirectory=tomcat9
CacheDirectoryMode=750
# ProtectSystem=strict
# ReadWritePaths=/etc/tomcat9/Catalina/
# ReadWritePaths=/var/lib/tomcat9/webapps/
# ReadWritePaths=/var/log/tomcat9/
# ReadWritePaths=/path/to/data/
# ReadWritePaths=/path/to/user/

( NoNewPrivileges=false성공을 위해 필요합니다 sudo.)

관련 정보