buglloc / brick

An open source Bitrix24 messenger client.
MIT License
121 stars 58 forks source link

Баг авторизации Ubuntu 14.04 #3

Closed MikhailBarsukov closed 9 years ago

MikhailBarsukov commented 9 years ago

не программист, опишу как могу.

Кратко: Такое ощущение, что пароль шифруется после ввода при авторизации при записи в файл, а потом от туда берется простым текстом и обратно не дешифруется.

Полно: Авторизация под ubuntu 14.04 до нашего портала (работает под https) не проходит после того как запускаешь приложение, вводишь реквизиты и пытаешься подключиться.

Если зайти в .config/brick/accounts.json там прописан пароль (притом другой (шифрованный?)), если вместо него простым текстом вписать свой пароль и перезапустить приложение, то подключается без проблем.

P.S.: Спасибо большое за разработку такой полезной программы. Нашёл только один баг, который, собственно, и описал. Также подобная программа нуждается в проверке на безопасность. Может вы можете упростить каким-либо образом проверку программисту вашей программы?

buglloc commented 9 years ago

Очень подозрительно. Складывается ощущение, что проблема на стороне Битрикс. Brick для авторизации использует специальные токены (Пароли Приложений), Вадим Думбравану описывал их работу для разработчиков: OTP & AP (a.k.a. ОП и ПП) Если в двух словах, то это специальный "пароль" который генерируется при добавлении аккаунта. Оригинальный пароль при этом нигде не сохраняется, т.к. больше не нужен. Основная прелесть этих Паролей Приложений - он ограничен исключительно десктопным приложением. Т.е., например, даже при его утере с его помощью нельзя вытащить ваш календарь. Пожалуйста, попробуйте с эмулировать проблему:

  1. Для начала получаем ПП на странице паролей приложений или просим сгенерировать портал:
$ curl --data "renew_password=y&action=login&login=_Ваш_логин_&password=_Ваш_обычный_пароль_&otp=" https://_хост_/desktop_app/login/

В ответ должен прийти ПП, для примера:

{success: true, sessionId: 'qi0i10tu35dr6up6id1rv6tbn1', appPassword: 'ywzhbdxlcpnrygwf'}
  1. Теперь попробовать авторизоваться с ним:
$ curl -v --data "action=login&login=_Ваш_логин_&password=ywzhbdxlcpnrygwf" https://_хост_/desktop_app/login/

Сервер должен ответить 200 OK с примерно таким ответом:

{success: true, sessionId: 'r4cim3r8rala63hslj7gjgftn4'}

Если ответ не 200, а например 401 или success: false - скорее всего нужно смотреть на стороне Битрикс и обратиться в их Тех поддержку для выяснения причин. Если сервер ответит что все хорошо - нужно разбираться дальше, вы первый кто столкнулся с такой проблемой за последние несколько месяцев и я пока не могу сообразить, что могло пойти не так:-(

Сам же менеджер паролей в Brick еще будет переделываться, у меня есть планы по небольшому усилению безопасности их хранения.

Также подобная программа нуждается в проверке на безопасность. Может вы можете упростить каким-либо образом проверку программисту вашей программы?

Единственное, что сейчас приходит на ум - я мог бы описать общую архитектуру проекта и детально важные участки. Но, увы, сейчас я не смогу найти на это времени, во всяком случае не раньше середины мая. А больше...слабо представляю чем я смогу тут помочь еще:-( Но всегда открыт, поэтому при возникновении каких-то вопросов он может, например, написать мне на почту buglloc [at] yandex.ru. Попробую проконсультировать по каким-то деталям.

Что же касается вопросов безопасности в общих чертах - то все начинается с архитектуры:

Как-то так в основных чертах. Иными словами, Brick в целом не опаснее браузера (а где-то и безопаснее, в виду разного рода ограничений).

MikhailBarsukov commented 9 years ago

Спасибо большое за развернутый ответ.

По багу авторизации получили 403 ошибку при запросах через curl. Расследуем теперь с саппортом 1с.

MikhailBarsukov commented 9 years ago

С саппортом дошли до такого момента: "Это внешние пользователи, выгруженные из AD, для них пока этот функционал не работает. Надеемся, что такая возможность добавиться после этого весеннего релиза продукта." Возможно ли как-то наладить работу не через пароли приложений, а через основные пароли?

buglloc commented 9 years ago

"Это внешние пользователи, выгруженные из AD, для них пока этот функционал не работает. Надеемся, что такая возможность добавиться после этого весеннего релиза продукта."

Аааа...вот оно что.

Возможно ли как-то наладить работу не через пароли приложений, а через основные пароли?

Есть, как минимум, три варианта, разной степени сложности/правильности:

  1. Могу сделать галку "сохранять оригинальный пароль" или что-то в этом духе. По которой отключать использование паролей приложений.
  2. Можно попробовать при добавлении аккаунта делать второй запрос с полученным Паролем Приложения, дабы убедится что он подходит и если он не подошел:
    • Использовать оригинальный автоматически. Не очень люблю "угадайки" в ПО, если честно
    • Предложить поставить галку из п.1
  3. Можно сделать поддержку ПП в AD самому, например, обработчиком событий:
AddEventHandler('main', 'OnFindExternalUser', 'ldapOnFindExternalUser');
function ldapOnFindExternalUser($login)
{
    if (!CModule::IncludeModule('ldap'))
        return null;

    if(!$login)
        return null;

    $filter = array('ACTIVE' => 'Y');
    $ldapDelimiter = strpos($login, '\\');
    if( $ldapDelimiter === false && COption::GetOptionString('ldap', 'ntlm_auth_without_prefix', 'Y') != 'Y') {
        return null;
    } elseif( $ldapDelimiter > 0 ) {
        $filter['CODE'] = substr($login, 0, $ldapDelimiter);
        $login = substr($login, $ldapDelimiter + 1);
    }

    $ldapServer = CLdapServer::GetList(array(), $filter);

    while($xLDAP = $ldapServer->GetNextServer()) {
        if(!$xLDAP->Connect())
            continue;

        if($arLdapUser = $xLDAP->FindUser($login)) {
            $ID = $xLDAP->SetUser($arLdapUser, false);

            if($ID > 0) {
                return $ID;
            }
        }

        $xLDAP->Disconnect();
    }

    return null;
}

Я бы, честно говоря, предпочел бы третий вариант, так не хочется хранить оригинальный пароль.

MikhailBarsukov commented 9 years ago

обсудил с админами, нет и должной квалификации и не совсем хороший способ, учитывая что LDAP используется для многих сервисов. Может всё-таки реализуете 1 вариант на время, пока сам битрикс не реализовал поддержку. Потом можно и отключить эту функцию.

buglloc commented 9 years ago

Имхо, зря вы так. Обработчик вполне корректный (я на всякий случай проконсультировался с автором модуля LDAP Битрикс). Как бы то ни было...сделал возможность не использовать Пароли Приложений, будет доступно в версии 0.1.20.29. Будем надеяться, как временная мера, ибо она мне совсем не по душе, но не заставлять же вас мучатся пока Битрикс реализует фичу в LDAP:-)

buglloc commented 9 years ago

Версия 0.1.20.29 доступна в PPA (Launchpad) и AUR.

MikhailBarsukov commented 9 years ago

Спасибо большое, работает как надо! )