파일이 포함된 폴더가 있습니다.
/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/one
과 ls
, 나도 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
.)