Настройка внешней авторизации в Apache: различия между версиями
Bas (обсуждение | вклад) Нет описания правки |
Bas (обсуждение | вклад) Нет описания правки |
||
Строка 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]. | ||
Модуль есть в официальных репозиториях, поэтому легко подхватывается пакетным менеджером: | |||
<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> | ||
[[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);
}
?>