Настройка внешней авторизации в Apache: различия между версиями
Bas (обсуждение | вклад) Нет описания правки |
Bas (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
=== Вступление === | |||
Есть один проект, который использует облачное файловое хранилище [http://www.owncloud.org OwnCloud]. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале [http://www.owncloud.org OwnCloud'а] есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю. | Есть один проект, который использует облачное файловое хранилище [http://www.owncloud.org OwnCloud]. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале [http://www.owncloud.org OwnCloud'а] есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю. | ||
=== Анализ === | |||
Доступ к файлам по ссылке имеет следующий вид: <code>https://owncloud.gwtools.ru/public.php?service=files&t=5627da44883053d541add981dbfea754</code>. Было решено, что с помощью web-сервера [http://httpd.apache.org Apache] мы будем ограничивать доступ к файлу <code>public.php</code>. | Доступ к файлам по ссылке имеет следующий вид: <code>https://owncloud.gwtools.ru/public.php?service=files&t=5627da44883053d541add981dbfea754</code>. Было решено, что с помощью web-сервера [http://httpd.apache.org Apache] мы будем ограничивать доступ к файлу <code>public.php</code>. | ||
Строка 11: | Строка 11: | ||
* Оставался вариант найти модуль к [http://httpd.apache.org Apache], который бы позволял сделать так, как надо. Как ни странно, но модуль был найден. Встречайте: [http://code.google.com/p/mod-auth-external/ mod-authnz-external]. | * Оставался вариант найти модуль к [http://httpd.apache.org Apache], который бы позволял сделать так, как надо. Как ни странно, но модуль был найден. Встречайте: [http://code.google.com/p/mod-auth-external/ mod-authnz-external]. | ||
=== Решение === | |||
Модуль <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]. |
Версия от 06:45, 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.
libapache2-mod-authnz-external
#!/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);
}
?>
<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