webdav+ext base.auth+var=error

Илья Шипицин chipitsine at gmail.com
Mon Mar 23 12:09:48 UTC 2015


в общем nginx.conf (пути, чтобы Lua увидела файлы модулей):

lua_package_path '/xxx/?.lua';
lua_shared_dict sha1 10M;
lua_shared_dict a 10M;

init_by_lua '

require "base64"
sha1 = require "sha1"

        ngx.shared.sha1:add("user","5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8")
';


ключевым в данном случае является объект "shared dictinary", в который
можно класть ключ-значение (этот объект разделяемый между всеми
worker-ами nginx).

в данном случае завели два объекта - sha1, в котором храним хеши
паролей. и "a", в котором будем хранить кешированные входы
пользователей (чтобы не вычислять хеши при каждом обращении к
страницам)

далее в нужном сайте делаем

access_by_lua_file 'xxx.lua';

следующего содержания

if ngx.req.get_headers()['Authorization'] then
 local m = ngx.re.match(ngx.req.get_headers().authorization, 'Basic\\s(.+)')
 if m and table.maxn(m) == 1 then
        if not ngx.shared.a:get(m[1]) then
                local u = ngx.re.match( from_base64(m[1]), '(.+):(.+)'  )

                if u and table.maxn(u) == 2 then

                local s1 = ngx.shared.sha1:get(u[1])
                if not s1 then
                        ngx.header['WWW-Authenticate'] = 'Basic realm="xxx"'
                        ngx.exit(ngx.HTTP_UNAUTHORIZED)
                else
                        if s1 == sha1.sha1(u[2]) then
                                ngx.shared.a:add(m[1], 1)
                                return
                        else
                                ngx.header['WWW-Authenticate'] =
'Basic realm="xxx"'
                                ngx.exit(ngx.HTTP_UNAUTHORIZED)

                        end
                end
                end
        else
                return
        end
 end

else
        ngx.header['WWW-Authenticate'] = 'Basic realm="xxx"'
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
end


т.е. при первой аутентификации пользователя, если она успешная,
кешируем ее в "a"

есть побочные эффекты, например, при изменении списка логинов-паролей
надо делать restart, а не reload.
еще можно устроить DoS, если завалить запросами с неправильными
паролями (чтобы нагрузить арифметичвеским вычислением хешей)

как иллюстрация - вполне.

21 марта 2015 г., 19:40 пользователь itcod <nginx-forum at nginx.us> написал:
> Илья спасибо! за наводку!
> если не затруднит киньте микро-пример...
> я полный чайник в луа..
> если на перл или js синтаксис похоже то разберусь:)
>
> Posted at Nginx Forum: http://forum.nginx.org/read.php?21,257511,257518#msg-257518
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru


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