The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Подключение виртуальной базы пользователей к Dovecot с CRAM-MD5 аутентификацией
Для того чтобы не хранить базу виртуальных пользователей с открытыми паролями
можно использовать в 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
 
12.11.2009 , Источник: http://postfixmail.com/blog/index.p...
Ключи: crypt, dovecot, imap, mail, cuth / Лицензия: CC-BY
Раздел:    Корень / Администратору / Сетевые сервисы / Mail, почта / Безопасность и установка ограничений

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, Гайбруш Трипвуд (?), 14:53, 12/11/2009 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    Такое хеширование имеет немного смысла, потому что знания этого хеша достаточно для аутентификации.
     
     
  • 2.2, Sw00p aka jerom (?), 10:07, 13/11/2009 [^] [ответить]    [к модератору]
  • +/
    уважаемый читаем как работает крам аутентификация

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

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

     
     
  • 3.3, Гайбруш Трипвуд (?), 11:04, 13/11/2009 [^] [ответить]    [к модератору]
  • +/
    Я знаю, как работает cram-md5, поэтому и запостил, чтобы у читателей не возникало иллюзий, что таким образом можно защитить базу паролей от кражи. cram-md5 позволяет не передавать пароли в открытом виде при аутентификации, но за это приходится платить хранением их в открытом виде. Вы скажете, что хранится хеш? Но если посмотрите на алгоритм cram-md5, то увидите, что dovecot хранит их хеши только для того, чтобы не вычислять одно и тоже при каждом подключении и знания этого хеша достаточно для успешной аутентификации.
     
     
  • 4.4, Sw00p aka jerom (?), 15:49, 13/11/2009 [^] [ответить]    [к модератору]
  • +/
    >>, но за это приходится платить хранением их в открытом виде.

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

    я хряню в базе не плаин текстовые пароли а захешированные крамом
    и при подключении пользователь либо 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'

     
     
  • 5.5, Sw00p aka jerom (?), 16:01, 13/11/2009 [^] [ответить]    [к модератору]
  • +/
    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)

     
     
  • 6.6, Гайбруш Трипвуд (?), 17:02, 13/11/2009 [^] [ответить]    [к модератору]  
  • +/
    Документация ввела вас в заблуждение.
    Еще раз повторяю: знания довекотовского cram-md5 хеша достаточно для успешной авторизации по механизму cram-md5, и польза такого хеширования ограничена лишь:
    - меньше вычислений при каждом логине
    - знание такого хеша не позволит авторизоваться по некоторым другим механизмам (digest-md5, например), что верно подмечено в документации

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

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

     
     
  • 7.7, Sw00p aka Jerom (?), 14:38, 14/11/2009 [^] [ответить]    [к модератору]  
  • +/
    схему в студию как вы будете зная хеш на стороне сервера проходить авторизацию

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

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

     
     
  • 8.9, Гайбруш Трипвуд (?), 16:17, 14/11/2009 [^] [ответить]    [к модератору]  
  • +/
    Тред вы не дочитали, они там разобрались.
    Попробуем уйти в детали.
    CRAM-MD5 работает так:
    - сервер передает в открытом виде параметр m
    - клиент вычисляет такую вот штуку
    HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m)), где K - это пароль (на самом деле там есть еще детали, но несущественные для нас) и передает серверу. H - это MD5, а opad и ipad - известные константы, ∥ - просто присоединение, а ⊕ - XOR.
    - сервер делает то же самое, только с паролем клиента, который хранится на сервере
    - сервер сравнивает то, что вычислил и то, что получил от клиента

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

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

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

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

     
     
  • 9.10, Sw00p aka Jerom (?), 10:45, 16/11/2009 [^] [ответить]    [к модератору]  
  • +/
    описанный вами алгоритм он производится на стороне сервера

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

    вот функция

    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;
    }

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

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


     
     
  • 10.11, Sw00p aka Jerom (?), 11:05, 16/11/2009 [^] [ответить]    [к модератору]  
  • +/
    вот ещё функция реализации 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;
    }

     
  • 10.12, Гайбруш Трипвуд (?), 11:22, 16/11/2009 [^] [ответить]    [к модератору]  
  • +/
    Посмотрим на такой алгоритм аутентификации имени меня.
    - сервер посылает случайное число challenge
    - клиент вычисляет некое x = H1(challenge, H2(password)), H1 и H2 - криптохеш-функции и посылает на сервер.
    - сервер делает то же самое, только с хранящимся на сервере паролем и сравнивает
    Видно, что это некий абстрактный cram-md5.

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

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

     
     
  • 11.13, Sw00p aka Jerom (?), 12:16, 16/11/2009 [^] [ответить]    [к модератору]  
  • +/
    а вы попробуйте реализовать этот алгоритм dovecot_hash=H2(password)
    а потом сделайте так x = H1(challenge, dovecot_hash)


     
  • 7.8, Sw00p aka Jerom (?), 14:45, 14/11/2009 [^] [ответить]    [к модератору]  
  • +/
    а на счёт брутфорсеров - то всё можно пробрутфорсить
    но при этом есть варианты брутфорса с использованием имеющегося хеша пароля и без него

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

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

     
  • 3.14, fi (ok), 20:11, 17/11/2009 [^] [ответить]    [к модератору]  
  • +/
    Да это уже проходили.

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

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

     
     
  • 4.15, Sw00p aka Jerom (?), 10:04, 18/11/2009 [^] [ответить]    [к модератору]  
  • +/
    мда не знал что у меня в базе плаинтекстовые пассы храняться

    капча: 30005

     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2018 by Maxim Chirkov  
    ДобавитьПоддержатьВебмастеруГИД  
    Hosting by Ihor