Назад | Перейти на главную страницу

Apache и индивидуальный WebDAV DocumentRoot

У меня настроен пользователь 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 ... (Больше никаких клонов для генерации конфигов, никаких перезагрузок и т. Д.)