Apache и пользовательский WebDAV DocumentRoot
У меня есть настроенный пользователь WebDAV, который в настоящее время получает имена пользователей и пароли из моей базы данных MySQL. Я даю пользователям возможность использовать WebDAV для загрузки больших файлов (это для службы обмена файлами, которую я сейчас разрабатываю), но у меня возникла небольшая проблема, которую я не могу понять.
Прежде всего - как бы мне было, чтобы у каждого пользователя был свой собственный корень WebDAV, чтобы он не мог просматривать файлы других пользователей? Я уже запускаю cronjob, который проверяет всех пользователей, которые включили WebDAV, и автоматически создает каталоги с соответствующими разрешениями. Мне просто нужен какой-то способ сказать Apache об этом.
Спасибо за любую помощь, я действительно ценю это.
Я также знаю, что мог бы просто запускать cronjob каждую минуту, чтобы генерировать мне конфигурацию apache и перезагружать конфигурацию apache, но это было бы слишком много накладных расходов, и я хотел бы получить больше гибкости.
2 ответа
Жаль, что конфигурация Apache не такая гибкая, как у nginx, поэтому вы можете сделать что-то вроде:
Alias /dav /path/to/dav/store/$REMOTE_USER
Тем не менее, вы можете использовать REMOTE_USER
в правиле переписывания, вот так:
RewriteEngine On
RewriteRule ^/dav(.*)$ /__davinternal/%{LA-U:REMOTE_USER} [PT]
Затем положите всю свою прелесть <Location /__davinternal>
и Боб - любовник твоей тети.
Это прекрасно работает, если у вас есть согласованные местоположения в вашей файловой системе для всех ваших пользователей (скажем, /path/to/dav/store/<username>
); если у вас есть пользовательские папки, разбросанные по файловой системе (с отображением в MySQL), вы все равно можете сопоставить свои пользовательские местоположения, но вам нужно использовать RewriteMap
:
RewriteMap davdirs txt:/path/to/user/dir/map.txt
RewriteRule /^dav(.*)$ /__davinternal/${davdirs:%{LA-U:REMOTE_USER}}
Вы можете сделать RewriteMap прямо из MySQL (с помощью внешнего скрипта), но я бы попытался заставить мое приложение обновлять файл dbm всякий раз, когда изменилась эта информация отображения, и вместо этого использовать карту dbm - намного лучшая производительность и не т забить вашу базу данных в землю.
В этом ответе я не рассказал о последствиях этих настроек для безопасности, отчасти потому, что сам в этом не уверен, а также потому, что не знаю, какой может быть ваша точная политика безопасности.
Насколько я могу судить (2-3 года назад), вам нужно добавить конфигурацию для каждого пользователя / каталога.
# cat /etc/apache2/conf.d/dav_store.conf
# First you need to say that a share under location X will be a webdav share:
Alias /store /home/davfs/storage/
<Directory /home/davfs/storage/>
DAV On
AuthType Basic
AuthName "sample"
Auth_MySQL On
Auth_MySQL_Authoritative On
Auth_MySQL_Host localhost
Auth_MySQL_User _admin
Auth_MySQL_Password 123
Auth_MySQL_DB dav
Auth_MySQL_Password_Table auth_user
Auth_MySQL_Username_Field username
Auth_MySQL_Password_Field password
Auth_MySQL_Empty_Passwords Off
Auth_MySQL_Encryption_Types Django #This was custom.
#AuthMySQLUserCondition = "is_active = 1"
# non root users cannot view this directory
Options -Indexes -MultiViews
AllowOverride None
require user root;
</Directory>
<Directory /home/davfs/storage/*/>
DAV On
require user root;
</Directory>
Include /home/davfs/etc/conf.d/*.dvu
И файл конфигурации на пользователя блокирует пользователя к каталогу. Вот образец
<Directory /home/davfs/storage/lm/lmwangi/>
# We need this in subdirs.. otherwise error messages such as
# "DAV Off" cannot be used to turn off a subtree of a DAV-enabled location.
# will fill up your log
DAV On
require user lmwangi
</Directory>
И это все, что нужно. Я думаю, что вы должны перезагрузить Apache при каждом изменении конфигурации. Было бы замечательно, если бы эти задачи могли быть выполнены с использованием модуля Apache... (больше нет крон для генерации конфигов, больше нет перезагрузок и т. Д.)