У меня настроен пользователь WebDAV, который в настоящее время получает имена пользователей и пароли из моей базы данных MySQL. Я даю пользователям возможность использовать WebDAV для загрузки больших файлов (это для службы обмена файлами, которую я сейчас разрабатываю), но я обнаружил небольшую проблему, которую, похоже, не могу понять.
Прежде всего - как я могу сделать так, чтобы у каждого пользователя был собственный корень WebDAV, чтобы они не могли просматривать файлы других пользователей? Я уже запускаю задание cron, которое проверяет всех пользователей, включивших WebDAV, и автоматически создает каталоги с соответствующими разрешениями. Мне просто нужен способ сообщить об этом apache.
Спасибо за любую помощь, я очень ценю это.
Я также знаю, что могу просто запускать cronjob каждую минуту, чтобы сгенерировать мне конфигурацию apache и перезагрузить конфигурацию apache, но это было бы слишком большими накладными расходами, и мне бы хотелось большей гибкости.
Очень жаль, что конфигурация Apache не такая гибкая, как конфигурация nginx, поэтому вы можете сделать что-то вроде:
Alias /dav /path/to/dav/store/$REMOTE_USER
Однако вы жестяная банка использовать REMOTE_USER
в правиле перезаписи, например:
RewriteEngine On
RewriteRule ^/dav(.*)$ /__davinternal/%{LA-U:REMOTE_USER} [PT]
Затем поместите всю свою красоту auth / DAVish в <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 ... (Больше никаких клонов для генерации конфигов, никаких перезагрузок и т. Д.)