URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 60851
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Подключение виртуальной базы пользо..."

Отправлено auto_tips , 12-Ноя-09 14:53 
Для того чтобы не хранить базу виртуальных пользователей с открытыми паролями можно использовать в Dovecot механизм аутентификации CRAM-MD5.

Для включения  CRAM-MD5 аутентификации в /etc/dovecot.conf необходимо привести конфигурацию к виду:

   default_mail_env = maildir:/var/spool/vhosts/%d/%n
   auth_mechanisms = plain DIGEST-MD5 CRAM-MD5
   auth_verbose = yes
   auth default {
      mechanisms = plain cram-md5
      passdb passwd-file {
      args = /etc/dovecot/passdb
   }
   userdb static {
      args = uid=virtual gid=virtual /etc/dovecot/userdb
   }


В директории /etc/dovecot создаем два файла: passdb с паролями и userdb со списком пользователей и расположением их виртуальных аккаунтов.

Пример содержимого userdb:

   tom@example.com::510:510::/var/spool/vhosts/example.com/:/bin/false::

Пример passdb:

   tom@example.com:{HMAC-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6

Для формирования HMAC-MD5 хэша на основе открытого пользовательского пароля необходимо использовать утилиту dovecotpw:

   # dovecotpw
   Enter new password:
   Retype new password:
   {HMAC-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6


URL: http://postfixmail.com/blog/index.php/create-virtual-account.../
Обсуждается: http://www.opennet.me/tips/info/2224.shtml


Содержание

Сообщения в этом обсуждении
"Подключение виртуальной базы пользователей к Dovecot с CRAM-MD5 аутентификацией"
Отправлено Гайбруш Трипвуд , 12-Ноя-09 14:53 
Такое хеширование имеет немного смысла, потому что знания этого хеша достаточно для аутентификации.

"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka jerom , 13-Ноя-09 10:07 
уважаемый читаем как работает крам аутентификация

давно уже перешёл на хранения в базе (слон) в краме и авторизацию

пс: кому нужен пхп скрипт для генерации хеша ??? могу дать


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Гайбруш Трипвуд , 13-Ноя-09 11:04 
Я знаю, как работает cram-md5, поэтому и запостил, чтобы у читателей не возникало иллюзий, что таким образом можно защитить базу паролей от кражи. cram-md5 позволяет не передавать пароли в открытом виде при аутентификации, но за это приходится платить хранением их в открытом виде. Вы скажете, что хранится хеш? Но если посмотрите на алгоритм cram-md5, то увидите, что dovecot хранит их хеши только для того, чтобы не вычислять одно и тоже при каждом подключении и знания этого хеша достаточно для успешной аутентификации.

"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka jerom , 13-Ноя-09 15:49 
>>, но за это приходится платить хранением их в открытом виде.

уважаемый плохо читали значить

я хряню в базе не плаин текстовые пароли а захешированные крамом
и при подключении пользователь либо PLAIN использует либо CRAM-MD5

пс: ещё почитайте настройки довкота

особенно файлик (у мня слон) dovecot-pgsql.conf

driver = pgsql
connect = host=localhost dbname=db user=bla password=bla

# Default password scheme.
#
# List of supported schemes is in
# http://wiki.dovecot.org/Authentication/PasswordSchemes
#
# А вот это как раз для вас (как храняться пароли в базе)

default_pass_scheme = CRAM-MD5

# а это по дефолту
#default_pass_scheme = LOGIN

# ниже следующие строчки делались исключительно под себя

user_query = SELECT '/base/mailboxes/%d/%n' AS home, 'maildir:/base/mailboxes/%d/%n' AS mail, 1981 AS uid, 1981 AS gid, '*:bytes='||quota AS quota_rule, 'INBOX.Spam:ignore' AS quota_rule2, 'INBOX.Trash:ignore' AS quota_rule3 FROM mdb_mailbox_tbl WHERE username='%u' AND active='1'

password_query = SELECT username AS user, password, '/base/mailboxes/%d/%n' AS  userdb_home, 'maildir:/base/mailboxes/%d/%n' AS userdb_mail, 1981 AS userdb_uid, 1981 AS userdb_gid FROM mdb_mailbox_tbl WHERE username='%u' AND active='1'


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka jerom , 13-Ноя-09 16:01 
Non-plaintext authentication mechanisms

See Authentication/Mechanisms for explanation of auth mechanisms. Most installations use only plaintext mechanisms, so you can skip this section unless you know you want to use them.

The problem with non-plaintext auth mechanisms is that the password must be stored either in plaintext, or using a mechanism-specific scheme that's incompatible with all other non-plaintext mechanisms. For example if you're going to use CRAM-MD5 authentication, the password needs to be stored in either PLAIN or CRAM-MD5 scheme. If you want to allow both CRAM-MD5 and DIGEST-MD5, the password must be stored in plaintext.

In future it's possible that Dovecot could support multiple passwords in different schemes for a single user.


пс: в переводе не нуждается думаю
пс2: если мы хотим использовать PLAIN or CRAM-MD5 scheme то пароли плаинтекстом хранить не обязательно
если же мы хотим использоват CRAM-MD5 and DIGEST-MD5 то тут обязательно нужно хранить плаинтекстом (особенно в использовании DIGEST-MD5)


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Гайбруш Трипвуд , 13-Ноя-09 17:02 
Документация ввела вас в заблуждение.
Еще раз повторяю: знания довекотовского cram-md5 хеша достаточно для успешной авторизации по механизму cram-md5, и польза такого хеширования ограничена лишь:
- меньше вычислений при каждом логине
- знание такого хеша не позволит авторизоваться по некоторым другим механизмам (digest-md5, например), что верно подмечено в документации

В этом заключается минус таких механизмов, как cram-md5 и digest-md5 по сравнению с передачей пароля открытым текстом. В последнем случае пароль тоже хранится в хешированном виде, и знания этого хеша уже не будет достаточно для аутентификации, вычислять пароль брутфорсом.

Посмотрите хотя бы вот этот тред
http://www.dovecot.org/list/dovecot/2008-April/029986.html
Ну и стандарты почитать тоже можно.


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 14-Ноя-09 14:38 
схему в студию как вы будете зная хеш на стороне сервера проходить авторизацию

пс: тот кто отвечал в треде даже сам понятия не имеет как этот механизм реализован

и говорит мол Then you have to store passwords in plaintext.
для дайджеста да но не для крама


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Гайбруш Трипвуд , 14-Ноя-09 16:17 
Тред вы не дочитали, они там разобрались.
Попробуем уйти в детали.
CRAM-MD5 работает так:
- сервер передает в открытом виде параметр m
- клиент вычисляет такую вот штуку
HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m)), где K - это пароль (на самом деле там есть еще детали, но несущественные для нас) и передает серверу. H - это MD5, а opad и ipad - известные константы, ∥ - просто присоединение, а ⊕ - XOR.
- сервер делает то же самое, только с паролем клиента, который хранится на сервере
- сервер сравнивает то, что вычислил и то, что получил от клиента

Так вот, на сервере должен хранится пароль в открытом виде, иначе эту HMAC не вычислить.
Довекот делает хитрее, он заранее выполняет некоторую часть вычислений, которая не зависит от меняющегося в каждой сессии параметра m. Но если злоумышленник украдет этот довекотовский хеш, то, получив от сервера число m, он проделает оставшуюся часть вычислений и успешно авторизуется, без всякого брутфорса. Если же он украдет файл юниксовых паролей (MD5 с солью), то ему придется делать брутфорс, чтобы определить пароль. Видите разницу?

> схему в студию как вы будете зная хеш на стороне сервера проходить авторизацию

конкретную схему я описать не могу, нужно разбираться, что именно dovecot вычисляет, но поверьте, имея на руках файл с хешами, злоумышленник разберется

Если вас все это не убеждает, то у меня больше нет аргументов, спросите у кого-нибудь еще. Все уже разжевал.


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 16-Ноя-09 10:45 
описанный вами алгоритм он производится на стороне сервера

довкот посылает челендж

вот функция

static const char *get_cram_challenge(void)
{
        unsigned char buf[17];
        size_t i;

        hostpid_init();
        random_fill(buf, sizeof(buf)-1);

        for (i = 0; i < sizeof(buf)-1; i++)
                buf[i] = (buf[i] % 10) + '0';
        buf[sizeof(buf)-1] = '\0';

        return t_strdup_printf("<%s.%s@%s>", (const char *)buf,
                               dec2str(ioloop_time), my_hostname);
}


вот что происходит на стороне клиента (пример из SquirrelMail)


function cram_md5_response ($username,$password,$challenge) {
    $challenge=base64_decode($challenge);  // декодируем полученный челендж
    $hash=bin2hex(hmac_md5($challenge,$password)); // потом шифруем этот челендж функцией hmac_md5
    $response=base64_encode($username . " " . $hash) . "\r\n"; // кодируем полученный хеш в виде USERNAME <SPACE> HASH
    return $response;
}

и отправляем эти данные на сервер

а теперь вопрос - зная хеш пароля куда я его буду пихат ?????????????
судя по алгоритму да можно его подставить но  механизм аутентификации этого не позволит



"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 16-Ноя-09 11:05 
вот ещё функция реализации hmac_md5($challenge,$password)

function hmac_md5($data, $key='') {

    if (extension_loaded('mhash')) {
            if ($key== '') {
                        $mhash=mhash(MHASH_MD5,$data);
            } else {
                        $mhash=mhash(MHASH_MD5,$data,$key);
            }
            return $mhash;
    }

    if (!$key) {
        return pack('H*',md5($data));
    }

    $key = str_pad($key,64,chr(0x00));
    if (strlen($key) > 64) {
        $key = pack("H*",md5($key));
    }
    $k_ipad =  $key ^ str_repeat(chr(0x36), 64) ;
    $k_opad =  $key ^ str_repeat(chr(0x5c), 64) ;
    /* Heh, let's get recursive. */
    $hmac=hmac_md5($k_opad . pack("H*",md5($k_ipad . $data)) );
    return $hmac;
}


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Гайбруш Трипвуд , 16-Ноя-09 11:22 
Посмотрим на такой алгоритм аутентификации имени меня.
- сервер посылает случайное число challenge
- клиент вычисляет некое x = H1(challenge, H2(password)), H1 и H2 - криптохеш-функции и посылает на сервер.
- сервер делает то же самое, только с хранящимся на сервере паролем и сравнивает
Видно, что это некий абстрактный cram-md5.

Так вот, хитрющий довекот хранит у себя dovecot_hash=H2(password), чтобы не вычислять его каждый раз. Если файл с хешами попадет к нехорошему человеку, он при аутентификации сможет вычислить x = H1(challenge, dovecot_hash) и авторизоваться.
> а теперь вопрос - зная хеш пароля куда я его буду пихат ?????????????

Я уже говорил, что нужно посмотреть, что именно довекот может вычислить без знания challenge (т.е. H2), и тогда можно будет определить формулу для злоумышленника.


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 16-Ноя-09 12:16 
а вы попробуйте реализовать этот алгоритм dovecot_hash=H2(password)
а потом сделайте так x = H1(challenge, dovecot_hash)



"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 14-Ноя-09 14:45 
а на счёт брутфорсеров - то всё можно пробрутфорсить
но при этом есть варианты брутфорса с использованием имеющегося хеша пароля и без него

типичный случай брутфорс мд5 который возвращает один и тот же хеш и в данном случае достаточно шифровать последовательности и сравнивать с хешом

в случае мд5 используемом в системе юниксов для авторизации необходимо иметь хеш чтобы пробрутфорсить


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено fi , 17-Ноя-09 20:11 
Да это уже проходили.

любой CRAM принципиально требует наличия не зашифрованного пароля на сервере. Это просто по определению. В случаи с мд5 всего лишь требуется модифицированный клиент.

Сами разберитесь как это работает, в инете достаточно много есть об этом.


"Подключение виртуальной базы пользователей к Dovecot с CRAM-..."
Отправлено Sw00p aka Jerom , 18-Ноя-09 10:04 
мда не знал что у меня в базе плаинтекстовые пассы храняться

капча: 30005