Настройка внешней авторизации в Apache: различия между версиями
Bas (обсуждение | вклад) |
Bas (обсуждение | вклад) |
||
(не показано 13 промежуточных версий этого же участника) | |||
Строка 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>. | ||
Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в [http://www.owncloud.org OwnCloud]. Здесь возникли следующие сложности: | |||
* Пароль в [http://www.owncloud.org OwnCloud'е] хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но любые попытки прямого доступа в БД отпадают. | |||
* Вариант с отдельной базой пользователей не подходил из-за того, что пользователи могли менять пароли. Да и вообще любые изменения с пользователями в [http://www.owncloud.org OwnCloud'е] не отражались бы в файле, что добавляло бы администратору больше работы. | |||
* Редактирование исходных кодов [http://www.owncloud.org OwnCloud'а] не нравилось тем, что эти изменения обязательно надо было бы подробно документировать. При обновлении обычно hand made радостно затирается любыми установщиками и быстро восстановить работоспособность, особенно через какое-то время будет сложно. Тем не менее, этот вариант рассматривался как резервный. Была найдена функция изменения пользователя, поэтому оставалось бы написать свою вставку и файл с пользователями мог бы быть актуальным. Так же можно было использовать хуки самой системы, любезно предоставленные разработчиками продукта. | |||
* Оставался вариант найти модуль к [http://httpd.apache.org Apache], который бы позволял сделать так, как надо. Как ни странно, но модуль был найден. Встречайте: [http://code.google.com/p/mod-auth-external/ mod-authnz-external]. | |||
==== Решение ==== | ==== Решение ==== | ||
libapache2-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]. | ||
Модуль есть в официальных репозиториях, поэтому легко подхватывается пакетным менеджером: | |||
<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"> | |||
#!/usr/bin/php -q | |||
<?php | |||
namespace OCP; | |||
require '/var/www/owncloud/lib/base.php'; | |||
require '/var/www/owncloud/lib/public/user.php'; | |||
$uid = trim(fgets(STDIN), "\n\r\0\x0B"); | |||
$password = trim(fgets(STDIN), "\n\r\0\x0B"); | |||
$oc_user = new User(); | |||
$retval = $oc_user->checkPassword($uid, $password); | |||
if ($retval == $uid) | |||
{ | |||
exit(0); | |||
} | |||
else | |||
{ | |||
exit(1); | |||
} | |||
?> | |||
</syntaxhighlight> | |||
Ограничиваем доступ к скрипту пользователем, из-под которого работает [http://httpd.apache.org Apache]: | |||
<pre> | |||
# chown www-data:www-data /etc/apache2/oc_check_pass.php | |||
# chmod 700 /etc/apache2/oc_check_pass.php | |||
</pre> | |||
Активируем установленный и настроенный модуль и перезапускаем [http://httpd.apache.org Apache]: | |||
<pre> | |||
# a2enmod authnz_external | |||
# service apache2 restart | |||
</pre> | |||
[[Category:Apache]] | [[Category:Apache]] | ||
[[Category:Debian]] | [[Category:Debian]] |
Текущая версия от 07:01, 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 '/var/www/owncloud/lib/base.php';
require '/var/www/owncloud/lib/public/user.php';
$uid = trim(fgets(STDIN), "\n\r\0\x0B");
$password = trim(fgets(STDIN), "\n\r\0\x0B");
$oc_user = new User();
$retval = $oc_user->checkPassword($uid, $password);
if ($retval == $uid)
{
exit(0);
}
else
{
exit(1);
}
?>
Ограничиваем доступ к скрипту пользователем, из-под которого работает Apache:
# chown www-data:www-data /etc/apache2/oc_check_pass.php # chmod 700 /etc/apache2/oc_check_pass.php
Активируем установленный и настроенный модуль и перезапускаем Apache:
# a2enmod authnz_external # service apache2 restart