Closed MikhailBarsukov closed 9 years ago
Очень подозрительно. Складывается ощущение, что проблема на стороне Битрикс. Brick для авторизации использует специальные токены (Пароли Приложений), Вадим Думбравану описывал их работу для разработчиков: OTP & AP (a.k.a. ОП и ПП) Если в двух словах, то это специальный "пароль" который генерируется при добавлении аккаунта. Оригинальный пароль при этом нигде не сохраняется, т.к. больше не нужен. Основная прелесть этих Паролей Приложений - он ограничен исключительно десктопным приложением. Т.е., например, даже при его утере с его помощью нельзя вытащить ваш календарь. Пожалуйста, попробуйте с эмулировать проблему:
$ curl --data "renew_password=y&action=login&login=_Ваш_логин_&password=_Ваш_обычный_пароль_&otp=" https://_хост_/desktop_app/login/
В ответ должен прийти ПП, для примера:
{success: true, sessionId: 'qi0i10tu35dr6up6id1rv6tbn1', appPassword: 'ywzhbdxlcpnrygwf'}
$ 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 в целом не опаснее браузера (а где-то и безопаснее, в виду разного рода ограничений).
Спасибо большое за развернутый ответ.
По багу авторизации получили 403 ошибку при запросах через curl. Расследуем теперь с саппортом 1с.
С саппортом дошли до такого момента: "Это внешние пользователи, выгруженные из AD, для них пока этот функционал не работает. Надеемся, что такая возможность добавиться после этого весеннего релиза продукта." Возможно ли как-то наладить работу не через пароли приложений, а через основные пароли?
"Это внешние пользователи, выгруженные из 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;
}
Я бы, честно говоря, предпочел бы третий вариант, так не хочется хранить оригинальный пароль.
обсудил с админами, нет и должной квалификации и не совсем хороший способ, учитывая что LDAP используется для многих сервисов. Может всё-таки реализуете 1 вариант на время, пока сам битрикс не реализовал поддержку. Потом можно и отключить эту функцию.
Имхо, зря вы так. Обработчик вполне корректный (я на всякий случай проконсультировался с автором модуля LDAP Битрикс). Как бы то ни было...сделал возможность не использовать Пароли Приложений, будет доступно в версии 0.1.20.29. Будем надеяться, как временная мера, ибо она мне совсем не по душе, но не заставлять же вас мучатся пока Битрикс реализует фичу в LDAP:-)
Версия 0.1.20.29 доступна в PPA (Launchpad) и AUR.
Спасибо большое, работает как надо! )
не программист, опишу как могу.
Кратко: Такое ощущение, что пароль шифруется после ввода при авторизации при записи в файл, а потом от туда берется простым текстом и обратно не дешифруется.
Полно: Авторизация под ubuntu 14.04 до нашего портала (работает под https) не проходит после того как запускаешь приложение, вводишь реквизиты и пытаешься подключиться.
Если зайти в .config/brick/accounts.json там прописан пароль (притом другой (шифрованный?)), если вместо него простым текстом вписать свой пароль и перезапустить приложение, то подключается без проблем.
P.S.: Спасибо большое за разработку такой полезной программы. Нашёл только один баг, который, собственно, и описал. Также подобная программа нуждается в проверке на безопасность. Может вы можете упростить каким-либо образом проверку программисту вашей программы?