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

Материал из Bas Wiki
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
==== Вступление ====
==== Вступление ====
Есть один проект, который использует облачное файловое хранилище [http://www.owncloud.org OwnCloud]. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале [http://www.owncloud.org OwnCloud]'а есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю.
Есть один проект, который использует облачное файловое хранилище [http://www.owncloud.org OwnCloud]. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале [http://www.owncloud.org OwnCloud'а] есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю.


==== Анализ ====
==== Анализ ====
Строка 6: Строка 6:


Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в [http://www.owncloud.org OwnCloud]. Решение в лоб: создать такой файл :) Тут сразу появилось куча "пунктиков".<br />
Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в [http://www.owncloud.org OwnCloud]. Решение в лоб: создать такой файл :) Тут сразу появилось куча "пунктиков".<br />
Во-первых, при создании пользователя в [http://www.owncloud.org OwnCloud]'е его необходимо добавлять в файл. Если бы это был всего 1 или 2 пользователя, то я бы это пережил, но что делать, если надо будет добавлять 10, 20, 50? Те же самые проблемы возникают и с удалением пользователей.<br />
Во-первых, при создании пользователя в [http://www.owncloud.org OwnCloud'е] его необходимо добавлять в файл. Если бы это был всего 1 или 2 пользователя, то я бы это пережил, но что делать, если надо будет добавлять 10, 20, 50? Те же самые проблемы возникают и с удалением пользователей.<br />
Во-вторых, пользователь мог менять свой пароль. Да, есть в нашем мире люди, которые меняют пароли, присланные им по почте. Возникает проблема синхронизации паролей между файлом и базой данных.<br />
Во-вторых, пользователь мог менять свой пароль. Да, есть в нашем мире люди, которые меняют пароли, присланные им по почте. Возникает проблема синхронизации паролей между файлом и базой данных.<br />
В-третьих, пароль в [http://www.owncloud.org OwnCloud]'е хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но вариант с экспортом пользователей в обычный файл с <code>Basic</code> авторизацией не подходил.
В-третьих, пароль в [http://www.owncloud.org OwnCloud'е] хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но вариант с экспортом пользователей в обычный файл с <code>Basic</code> авторизацией не подходил.





Версия от 05:37, 24 октября 2014

Вступление

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

Анализ

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

Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в OwnCloud. Решение в лоб: создать такой файл :) Тут сразу появилось куча "пунктиков".
Во-первых, при создании пользователя в OwnCloud'е его необходимо добавлять в файл. Если бы это был всего 1 или 2 пользователя, то я бы это пережил, но что делать, если надо будет добавлять 10, 20, 50? Те же самые проблемы возникают и с удалением пользователей.
Во-вторых, пользователь мог менять свой пароль. Да, есть в нашем мире люди, которые меняют пароли, присланные им по почте. Возникает проблема синхронизации паролей между файлом и базой данных.
В-третьих, пароль в OwnCloud'е хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но вариант с экспортом пользователей в обычный файл с Basic авторизацией не подходил.


Решение

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