Apache e por usuário WebDAV DocumentRoot

6

Eu tenho um usuário do WebDAV configurado que atualmente recebe nomes de usuário e senhas do meu banco de dados MySQL. Eu dou aos usuários a opção de usar o WebDAV para uploads de arquivos grandes (isso é para um serviço de compartilhamento de arquivos que estou desenvolvendo atualmente), mas eu cheguei a um pequeno problema que não consigo descobrir.

Primeiro de tudo - como eu diria que cada usuário tem sua própria raiz WebDAV para que eles não possam olhar nos arquivos de outros usuários? Já executo um cronjob que verifica todos os usuários que ativaram o WebDAV e cria automaticamente os diretórios com as permissões apropriadas. Eu só preciso de algum método para dizer isso ao apache.

Obrigado por qualquer ajuda, eu realmente agradeço.

Eu também estou ciente de que poderia executar um cronjob a cada minuto para gerar uma configuração do apache e recarregar a configuração do apache, mas isso seria um pouco sobrecarregado e eu gostaria de ter mais flexibilidade.

    
por Tristan Seifert 17.07.2011 / 04:44

2 respostas

4

É uma pena que a configuração do Apache não seja tão flexível quanto a do nginx, então você pode fazer algo como:

Alias /dav /path/to/dav/store/$REMOTE_USER

No entanto, você pode usar REMOTE_USER em uma regra de reescrita, assim:

RewriteEngine On
RewriteRule ^/dav(.*)$ /__davinternal/%{LA-U:REMOTE_USER} [PT]

Em seguida, coloque toda a sua beleza auth / DAVish em um <Location /__davinternal> e Bob é o amante do seu auntie.

Isso funciona muito bem se você tiver locais consistentes em seu sistema de arquivos para todos os seus usuários (digamos, /path/to/dav/store/<username> ); Se você tem pastas de usuários espalhadas pelo sistema de arquivos (com um mapeamento no MySQL), você ainda pode mapear seus locais de usuários, mas você tem que usar um RewriteMap :

RewriteMap davdirs txt:/path/to/user/dir/map.txt
RewriteRule /^dav(.*)$ /__davinternal/${davdirs:%{LA-U:REMOTE_USER}}

Você pode fazer um RewriteMap direto do MySQL (através de um script externo), mas eu tentaria fazer com que meu aplicativo atualizasse um arquivo dbm sempre que as informações de mapeamento fossem alteradas e usasse um mapa do dbm - desempenho muito melhor e não martela seu banco de dados no chão.

Eu não abordei as implicações de segurança dessas configurações nessa resposta, em parte porque não tenho certeza e porque não sei qual é a sua política de segurança exata.

    
por 17.07.2011 / 08:17
0

Tanto quanto eu poderia dizer (2-3 anos atrás), você precisa adicionar uma configuração por usuário / diretório.

# 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

E o arquivo de configuração por usuário bloqueia um usuário em um diretório. Aqui está um exemplo

<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>

E isso é tudo que existe para isso. Eu acho que você tem que recarregar o Apache em cada mudança de configuração. Seria maravilhoso se essas tarefas pudessem ser feitas usando um módulo do Apache ... (Não há mais crons para gerar configurações, não mais recarregamentos, etc.)

    
por 17.07.2011 / 07:42