Re: динамический dav methods $DAV;

Maxim Dounin mdounin at mdounin.ru
Tue Apr 14 21:42:38 UTC 2015


Hello!

On Tue, Apr 14, 2015 at 03:38:11PM -0400, itcod wrote:

> "Реальнее - использовать средства контроля доступа, см. выше."
> 
> Максим спасибо. 
> Из всех перечисленных вами средств похоже только limit_except по описанию
> может раздельно влиять 
> на методы применяемые в WEBDAV (DELETE, MKCOL, COPY, MOVE, OPTIONS,
> PROPFIND)

Вам кажется.  Контроль доступа в зависимости от метода можно 
делать, помимо limit_except, ещё как минимум с помощью директив 
модуля rewrite:

    if ($request_method = POST) {
        return 403;
    }

Не говоря уже о выгрузке логики доступа в скриптовые языки (perl, 
тот же lua) или вообще на бекенды с помощью auth_request.

> Задача тривиальна при изменении переменной (она изменяется из программы lua)
> разрешить или блокировать метод GET. Создал для проверки конструкцию
> 
> set $limit_get all;
> limit_except GET {
>     deny  $limit_get all;
> }
> Получил ошибку:
> nginx: [emerg] invalid parameter "limit_get" ....
> 
> Вывод1. Средство контроля не знает переменных и не может в зависимости от
> внешних условий (прав пользователя) заблокировать/разблокировать метод.

Ваша проблема в том, что вы упорно пытаетесь использовать 
переменные там, где они не поддерживаются.  Повторю: переменные 
поддерживают только некоторые директивы nginx'а.  BTW, если в 
какой-либо директиве можно использовать переменные - это явно 
указано в документации.

> Вывод2. Перечисленные вами средства контроля не решают задачи динамической
> установки доступных пользователю(имя:пароль) методов (прав доступа).

См. выше, вам кажется.

> Я пока не вижу способа запретить ему создавать каталоги или стирать файлы
> если он зашёл в папку.... и это приводит нас к однопользовательской системе
> алядос... может я чего то не вижу ? может где то есть эта возможность
> динамически управлять методами(правами). Всё таки хочется сделать
> простенькую полноценную систему управления доступом к файлам в webdav... 

Если данные о том, можно что-то пользователю или нет - из 
скриптового языка, то проще всего вашу задачу решить с помощью 
скриптового языка же, вернув ошибку непосредственно из него.

Тривиальный авторизатор на auth_basic, требующий от всех 
пользователей ввода логина/пароля, и разрешающий некоторым из них 
методы, отличные от GET, делается как-то так:

    server {
        listen 80;
        server_name dav.example.com;

        location / {
            auth_basic "restricted site";
            auth_basic_user_file /path/to/users;

            dav_methods PUT DELETE;

            limit_except GET {
                auth_basic "restricted site";
                auth_basic_user_file /path/to/admins;
            }

            ...
        }
    }

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru