Нет точки монтирования в /etc/mtab при использовании encfs из apache2
Я написал веб-страницу, которая позволяет мне удаленно монтировать зашифрованную папку encfs, которая затем доступна через WebDAV. По сути, это просто форма пароля с кнопкой монтирования / размонтирования, которая пытается смонтировать / размонтировать предварительно определенный зашифрованный диск encfs с паролем, предоставленным через форму. В основном, доступная в Интернете оболочка для
encfs --stdinpass /encfs/drive/encrypted/ /var/www/unencrypted
Это работает как задумано, так как я могу подключить / отключить зашифрованный диск и увидеть / прочитать незашифрованные данные через WebDAV.
Но происходит нечто странное: незашифрованный вид папки доступен ТОЛЬКО через WebDAV.
Если я запускаю sudo -u www-data ls -la / var / www (www-data - это пользователь, запускающий веб-сервер и, следовательно, также пользователь, монтирующий диск, я подтвердил это с помощью htop) или как любой другой пользователь, я посмотрите точку монтирования (в приведенном выше примере это будет / var / www / unencrypted) как обычную папку, а не как обычную папку encfs, которая обычно должна выглядеть примерно так:
drwxr-xr-x 5 www-data www-data 4096 Feb 1 02:25 .
drwxr-xr-x 15 root root 4096 Jan 31 11:46 ..
d????????? ? ? ? ? ? unencrypted
но на самом деле это выглядит так:
drwxr-xr-x 5 www-data www-data 4096 Feb 1 02:25 .
drwxr-xr-x 15 root root 4096 Jan 31 11:46 ..
drwxr-xr-x 2 www-data www-data 4096 Jan 31 21:47 unencrypted
как обычная папка (которая считается пустой, хотя в той же папке есть данные при доступе к ней через WebDAV).
Также в /etc/mtab нет записи, указывающей, что диск encfs когда-либо был смонтирован. В любом случае, похоже, что диск никогда не был подключен, хотя на самом деле это так, потому что я могу получить к нему доступ через WebDAV, а также процесс ecnfs явно работает, как показано в htop.
Как это происходит и как это исправить?
PS: если я бегу
sudo -u www-data bash -c "echo $(cat /tmp/passwort_file) | encfs --stdinpass /encfs/drive/encrypted/ /var/www/unencrypted"
от терминала такого поведения нет. Папка по-прежнему доступна через WebDAV, но в этом случае она также правильно отображается в /etc/mtab и также видна как диск encfs при использовании ls -la.
1 ответ
Я предполагаю, что это Debian Linux или Ubuntu с systemd в качестве менеджера сервисов.
Linux поддерживает "пространства имен монтирования", которые обеспечивают разные представления файловой системы для разных процессов (например, chroot, но гораздо более гибкие и вызывающие головную боль). Systemd позволяет использовать эту функцию для защиты системы от проблем безопасности и атак; например, некоторые службы могут видеть /home пустым или /etc как доступный только для чтения.
Большинство дистрибутивов используют эти параметры безопасности в apache2.service - если вы запускаете systemctl cat apache2
вы увидите, что он настроен на собственный /tmp
каталог:
[Service]
...
PrivateTmp=true
Побочный эффект пространств имен mount заключается в том, что они несколько глобальны: однажды systemd "unshares" /
чтобы иметь возможность создавать монтируемые только под Apache монтирования, даже если для этого требуется только одно монтирование, тот же эффект все еще применяется ко всем монтированиям, созданным службой Apache. (Для сервисов это в некоторой степени преднамеренно: зачем веб-серверу монтировать файловые системы? Принцип наименьших привилегий.)
Так что если вы бежите findmnt
или же cat /proc/self/mounts
, вы увидите только монтирование в корневом пространстве имен. Но если вы бежите nsenter --mount --target <APACHE_PID> findmnt
или же cat /proc/<APACHE_PID>/mounts
вы увидите как те, что унаследованы от корневого пространства имен, так и те, которые являются частными для процесса Apache.
Чтобы отключить эту защиту, запустите systemctl edit --full apache2
и удалите все настройки, начиная с Private*
, ReadOnly*
, или же Inaccessible*
,