Настройка внешней авторизации в Apache: различия между версиями

Материал из Bas Wiki
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 14: Строка 14:


Модуль <code>mod-authnz-external</code> позволяет использовать внешние программы для авторизации пользователей. Если авторизатору вернуть код завершения 0, то пользователь считается авторизованным. Было решено с помощью [http://www.php.net PHP] написать скрипт. Почему [http://www.php.net PHP]? [http://www.owncloud.org OwnCloud] разработан на [http://www.php.net PHP], поэтому в скрипте достаточно будет сослаться на исходники, принять данные от пользователя и передать их компетентным органам в лице методов класса [http://www.owncloud.org OwnCloud].
Модуль <code>mod-authnz-external</code> позволяет использовать внешние программы для авторизации пользователей. Если авторизатору вернуть код завершения 0, то пользователь считается авторизованным. Было решено с помощью [http://www.php.net PHP] написать скрипт. Почему [http://www.php.net PHP]? [http://www.owncloud.org OwnCloud] разработан на [http://www.php.net PHP], поэтому в скрипте достаточно будет сослаться на исходники, принять данные от пользователя и передать их компетентным органам в лице методов класса [http://www.owncloud.org OwnCloud].
libapache2-mod-authnz-external


Модуль есть в официальных репозиториях, поэтому легко подхватывается пакетным менеджером:
<pre>
# apt-get install libapache2-mod-authnz-external
</pre>
Добавляем настройки в [http://httpd.apache.org Apache] (в моём случае в <code>VirtualHost</code>):
<syntaxhighlight lang="apache">
<Files "public.php">
        AuthType Basic
        AuthBasicProvider external
        AuthName "Enter Login and Password for download"
        Require valid-user
        AuthExternal oc_check_pass
</Files>
AddExternalAuth oc_check_pass /etc/apache2/oc_check_pass.php
SetExternalAuthMethod oc_check_pass pipe
</syntaxhighlight>
Создаём php-скрипт <code>/etc/apache2/oc_check_pass.php</code>:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
#!/usr/bin/php -q
#!/usr/bin/php -q
Строка 41: Строка 60:


?>
?>
</syntaxhighlight>
<syntaxhighlight lang="apache">
<Files "public.php">
        AuthType Basic
        AuthName "Enter Login and Password for download"
        AuthBasicProvider external
        Require valid-user
        AuthExternal oc_check_pass
</Files>
AddExternalAuth oc_check_pass /etc/apache2/oc_check_pass.php
SetExternalAuthMethod oc_check_pass pipe
</syntaxhighlight>
</syntaxhighlight>
[[Category:Apache]]
[[Category:Apache]]

Версия от 06:57, 24 октября 2014

Вступление

Есть один проект, который использует облачное файловое хранилище OwnCloud. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале OwnCloud'а есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю.

Анализ

Доступ к файлам по ссылке имеет следующий вид: https://owncloud.gwtools.ru/public.php?service=files&t=5627da44883053d541add981dbfea754. Было решено, что с помощью web-сервера Apache мы будем ограничивать доступ к файлу public.php.

Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в OwnCloud. Здесь возникли следующие сложности:

  • Пароль в OwnCloud'е хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но любые попытки прямого доступа в БД отпадают.
  • Вариант с отдельной базой пользователей не подходил из-за того, что пользователи могли менять пароли. Да и вообще любые изменения с пользователями в OwnCloud'е не отражались бы в файле, что добавляло бы администратору больше работы.
  • Редактирование исходных кодов OwnCloud'а не нравилось тем, что эти изменения обязательно надо было бы подробно документировать. При обновлении обычно hand made радостно затирается любыми установщиками и быстро восстановить работоспособность, особенно через какое-то время будет сложно. Тем не менее, этот вариант рассматривался как резервный. Была найдена функция изменения пользователя, поэтому оставалось бы написать свою вставку и файл с пользователями мог бы быть актуальным. Так же можно было использовать хуки самой системы, любезно предоставленные разработчиками продукта.
  • Оставался вариант найти модуль к Apache, который бы позволял сделать так, как надо. Как ни странно, но модуль был найден. Встречайте: mod-authnz-external.

Решение

Модуль mod-authnz-external позволяет использовать внешние программы для авторизации пользователей. Если авторизатору вернуть код завершения 0, то пользователь считается авторизованным. Было решено с помощью PHP написать скрипт. Почему PHP? OwnCloud разработан на PHP, поэтому в скрипте достаточно будет сослаться на исходники, принять данные от пользователя и передать их компетентным органам в лице методов класса OwnCloud.

Модуль есть в официальных репозиториях, поэтому легко подхватывается пакетным менеджером:

# apt-get install libapache2-mod-authnz-external

Добавляем настройки в Apache (в моём случае в VirtualHost):

<Files "public.php">
        AuthType Basic
        AuthBasicProvider external
        AuthName "Enter Login and Password for download"
        Require valid-user
        AuthExternal oc_check_pass
</Files>

AddExternalAuth oc_check_pass /etc/apache2/oc_check_pass.php
SetExternalAuthMethod oc_check_pass pipe

Создаём php-скрипт /etc/apache2/oc_check_pass.php:

#!/usr/bin/php -q
<?php

namespace OCP;

require '/opt/www/owncloud/lib/base.php';
require '/opt/www/owncloud/lib/public/user.php';

$uid = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

$oc_user = new User();
$retval = $oc_user->checkPassword($uid, $password);

if ($retval == $uid)
{
    exit(0);
}
else
{
    exit(1);
}

?>