Как сделать работающие ответы HTTP OPTIONS для WebDAV с Apache2?

Вопрос или проблема

HTTP OPTIONS запрос — это тип HTTP-запроса (как GET, POST) к веб-серверам. Он необязателен как вспомогательный, вы можете использовать его для программного определения, какие запросы понимают веб-серверы. Но вы не обязаны это делать. Ответ на такой запрос должен быть 200 OK с пустым телом и заголовком, который указывает, какие запросы разрешены.

С WebDAV некоторые приложения (в частности, клиент WinSCP) делают OPTIONS запросы, другие клиенты не обязательно, это варьируется.

Я использую Apache2 с mod_dav в качестве веб-сервера, используя LDAP для аутентификации. WebDAV и аутентификация работают с клиентами WebDAV, которые не делают OPTIONS запрос и сразу начинают WebDAV связь с запросом PROPFIND. Проверено, работает. Таким образом, проблем с аутентификацией здесь нет. Только когда вы приходите с WinSCP, возникают ошибки аутентификации. Это происходит потому, что WinSCP начинает с запроса OPTIONS, а Apache2 отвечает с ошибкой. (К сожалению, у наших пользователей инструментом выбора является WinSCP, и они обучены его использовать, так что я хотел бы, чтобы это работало.)

Вот мой файл conf-enabled/webdav-john.doe.conf:

<IfModule mod_dav_fs.c>
   DavLockDB /usr/local/kitodo/webdav/DavLockDB
</IfModule>

<IfModule mod_dav.c>
   LimitXMLRequestBody 10240
   LimitRequestBody 0

   BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
   BrowserMatch "^Microsoft-WebDAV-MiniRedir" redirect-carefully

   Alias /webdav/john.doe "/usr/local/webdav/users/john.doe"

   <Directory /usr/local/webdav/users/john.doe>
      Dav on

      AddDefaultCharset utf-8
      Options Indexes FollowSymLinks

      AuthType Basic
      AuthName "john.doe WebDAV realm"

      AuthBasicProvider ldap
      AuthLDAPUrl "ldap://localhost/ou=users,dc=nodomain"

      BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
      BrowserMatch "^Microsoft-WebDAV-MiniRedir" redirect-carefully

      Order allow,deny
      Allow from all

      <LimitExcept OPTIONS>
         Require user john.doe
      </LimitExcept>

   </Directory>
</IfModule>

Это дает следующий результат:

admin@host:/home/admin# curl -i -X OPTIONS localhost/webdav/john.doe/
HTTP/1.1 401 Unauthorized
Date: Tue, 05 Nov 2024 12:38:04 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 456
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>Этот сервер не смог проверить, что вы
уполномочены получить доступ к запрашиваемому документу. Либо вы предоставили неверные
учетные данные (например, неправильный пароль), либо ваш
браузер не понимает, как предоставить
необходимые учетные данные.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Сервер на localhost Порт 80</address>
</body></html>

Если я уберу три строки <LimitExcept OPTIONS> ... </LimitExcept>, то результат будет следующим:

admin@host:/home/admin# curl -i -X OPTIONS localhost/webdav/john.doe
HTTP/1.1 403 Forbidden
Date: Tue, 05 Nov 2024 12:36:04 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 274
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>У вас нет разрешения на доступ к этому ресурсу.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Сервер на localhost Порт 80</address>

Таким образом, здесь есть две проблемы: Во-первых, <LimitExcept> не влияет, иначе оба запроса должны давать один и тот же результат, и во-вторых, OPTIONS не работает. Я не знаю, должно ли это работать и поддерживается ли это нативно mod_dav, или это требует дополнительной отдельной конфигурации, и если да, то какой? Я не смог найти ничего об этом нигде. Другие (не WebDAV) страницы на сервере также неправильно реагируют на OPTIONS, а ведут себя как GET.

Какова должна быть правильная конфигурация, чтобы включить клиентов WebDAV, таких как WinSCP, которые требуют правильного ответа на HTTP OPTIONS, с Apache2 для загрузки WebDAV?

Ответ или решение

Чтобы настроить ответ HTTP OPTIONS для WebDAV с использованием Apache2, необходимо учитывать несколько ключевых аспектов конфигурации веб-сервера и модуля mod_dav. Ваша текущая проблема заключается в том, что запросы OPTIONS от WinSCP обрабатываются с ошибками. Давайте разберем, как это исправить.

1. Обзор проблемы

Запросы OPTIONS служат для проверки доступных методов HTTP для определенного ресурса на сервере. Для клиентов, таких как WinSCP, поддержка этого типа запросов имеет критическое значение, поскольку это может влиять на их возможность аутентификации и взаимодействия с сервером. Краткое резюме ваших текущих проблем:

  • Запросы OPTIONS возвращают ответ 401 Unauthorized или 403 Forbidden.
  • Ваши ограничения в секции <LimitExcept> не работают так, как ожидалось.
  • Некоторые другие страницы на вашем сервере также не обрабатывают запросы OPTIONS правильно.

2. Конфигурация Apache для работы с OPTIONS

Теперь мы перейдем к необходимым изменениям в конфигурации вашего Apache-сервера. Ниже приведён пример правильной конфигурации с комментариями для лучшего понимания.

<IfModule mod_dav_fs.c>
    DavLockDB /usr/local/kitodo/webdav/DavLockDB
</IfModule>

<IfModule mod_dav.c>
    LimitXMLRequestBody 10240
    LimitRequestBody 0

    Alias /webdav/john.doe "/usr/local/webdav/users/john.doe"

    <Directory /usr/local/webdav/users/john.doe>
        Dav on

        AddDefaultCharset utf-8
        Options Indexes FollowSymLinks

        AuthType Basic
        AuthName "john.doe WebDAV realm"

        AuthBasicProvider ldap
        AuthLDAPUrl "ldap://localhost/ou=users,dc=nodomain"

        # Позволяем OPTIONS без аутентификации
        <LimitExcept GET POST PROPFIND OPTIONS>
            Require user john.doe
        </LimitExcept>

        # Настройка allow/deny
        Order allow,deny
        Allow from all
    </Directory>

    # Обработка OPTIONS запросов
    <Location /webdav/john.doe>
        SetEnvIf Request_Method OPTIONS options_request
        Header always set Allow "OPTIONS, GET, POST, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, DELETE, LOCK, UNLOCK"
        Header always set Content-Length 0 env=options_request
        Header always set Status "200 OK" env=options_request
    </Location>
</IfModule>

3. Объяснение ключевых изменений

  • LimitExcept: Я изменил секцию <LimitExcept> так, чтобы OPTIONS могли быть выполнены без аутентификации. Это обеспечит доступ к методу OPTIONS всем клиентам.

  • Location Block: Добавлен блок <Location ...>, в котором используется SetEnvIf для определения, является ли текущий запрос OPTIONS. Если это так, то устанавливаются заголовки для ответа, чтобы указать разрешенные методы и вернуть статус 200 OK. Это гарантирует, что запрос OPTIONS не блокируется.

  • Заголовок Allow: Укажите все методы, которые поддерживаются вашим WebDAV, через заголовок Allow. Это поможет клиентам, таким как WinSCP, понять, какие действия доступны.

4. Проверка конфигурации

После внесения изменений необходимо перезагрузить Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Проверьте, работает ли ваш запрос, выполнив команду:

curl -i -X OPTIONS http://localhost/webdav/john.doe/

Вы должны увидеть ответ 200 OK и список поддерживаемых методов в заголовке Allow.

Заключение

Убедитесь, что все изменения сделаны корректно, и протестируйте взаимодействие с WinSCP. Это поможет исправить проблему с аутентификацией, связанной с запросами OPTIONS. Понимание работы Apache и веб-протоколов — это залог стабильного функционирования вашей системы WebDAV. Если возникнут дополнительные вопросы, не стесняйтесь обратиться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...