Ich versuche, eine lokale Website zu erstellen, die es mir ermöglicht, eine Datei zu entschlüsseln, das darin enthaltene Dateisystem zu mounten und einen systemd-Dienst zu starten, ohne auf die Konsole zuzugreifen. Der gestartete Dienst verwendet dann die Dateien innerhalb des gemounteten Dateisystems. Der Webserver führt derzeit meinen Python-Code über CGI aus, um eine einfache Website zum Entschlüsseln und Mounten dieses Dateisystems bereitzustellen. Ich habe in der Sudoers-Datei Ausnahmen für den WWW-Data-Benutzer gemacht, um bestimmte Befehle auszuführen, die ich in Python aufrufe.
Wenn ich die Datei über diese Website entschlüssele (die aufruft cryptsetup luksOpen
), wird das entschlüsselte Gerät wie erwartet angezeigt:
> file /dev/mapper/service-volume
/dev/mapper/service-volume: symbolic link to ../dm-0
Aber wenn mein Python-Code versucht, dies zu mounten, service-volume
wird es nur innerhalb des Apache-Arbeitsprozesses gemountet und ist für meine Shell oder andere Prozesse nicht verfügbar (XXX ist die PID des Apache-Arbeitsprozesses):
> mountpoint /mnt/service-folder
/mnt/service-folder is not a mountpoint
> cat /proc/XXX/mounts
...
/dev/mapper/service-volume /mnt/service-folder ext4 rw,relatime 0 0
Der Mount-Vorgang wird sudo /bin/mount /dev/mapper/service-volume /mnt/service-folder
mit Pythons subprocess.run() ausgeführt.
Meine Fragen sind also: Was passiert da? Ist das eine Art Namespace-/Cgroups-Magie? Und wie kann dieser Ordner für einen anderen Dienst/Prozess als Apache selbst gemountet werden?
Weitere Informationen:
Es service-folder
existiert (ohne das gemountete Dateisystem):
> ls -la /mnt/service-folder
total 8
drwxr-xr-x 2 root root 4096 Jan 23 21:25 .
drwxr-xr-x 4 root root 4096 Jan 23 21:25 ..