Для того чтобы не хранить базу виртуальных пользователей с открытыми паролями можно использовать в 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
Такое хеширование имеет немного смысла, потому что знания этого хеша достаточно для аутентификации.
уважаемый читаем как работает крам аутентификациядавно уже перешёл на хранения в базе (слон) в краме и авторизацию
пс: кому нужен пхп скрипт для генерации хеша ??? могу дать
Я знаю, как работает cram-md5, поэтому и запостил, чтобы у читателей не возникало иллюзий, что таким образом можно защитить базу паролей от кражи. cram-md5 позволяет не передавать пароли в открытом виде при аутентификации, но за это приходится платить хранением их в открытом виде. Вы скажете, что хранится хеш? Но если посмотрите на алгоритм cram-md5, то увидите, что dovecot хранит их хеши только для того, чтобы не вычислять одно и тоже при каждом подключении и знания этого хеша достаточно для успешной аутентификации.
>>, но за это приходится платить хранением их в открытом виде.уважаемый плохо читали значить
я хряню в базе не плаин текстовые пароли а захешированные крамом
и при подключении пользователь либо 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'
Non-plaintext authentication mechanismsSee 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)
Документация ввела вас в заблуждение.
Еще раз повторяю: знания довекотовского cram-md5 хеша достаточно для успешной авторизации по механизму cram-md5, и польза такого хеширования ограничена лишь:
- меньше вычислений при каждом логине
- знание такого хеша не позволит авторизоваться по некоторым другим механизмам (digest-md5, например), что верно подмечено в документацииВ этом заключается минус таких механизмов, как cram-md5 и digest-md5 по сравнению с передачей пароля открытым текстом. В последнем случае пароль тоже хранится в хешированном виде, и знания этого хеша уже не будет достаточно для аутентификации, вычислять пароль брутфорсом.
Посмотрите хотя бы вот этот тред
http://www.dovecot.org/list/dovecot/2008-April/029986.html
Ну и стандарты почитать тоже можно.
схему в студию как вы будете зная хеш на стороне сервера проходить авторизациюпс: тот кто отвечал в треде даже сам понятия не имеет как этот механизм реализован
и говорит мол Then you have to store passwords in plaintext.
для дайджеста да но не для крама
Тред вы не дочитали, они там разобрались.
Попробуем уйти в детали.
CRAM-MD5 работает так:
- сервер передает в открытом виде параметр m
- клиент вычисляет такую вот штуку
HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m)), где K - это пароль (на самом деле там есть еще детали, но несущественные для нас) и передает серверу. H - это MD5, а opad и ipad - известные константы, ∥ - просто присоединение, а ⊕ - XOR.
- сервер делает то же самое, только с паролем клиента, который хранится на сервере
- сервер сравнивает то, что вычислил и то, что получил от клиентаТак вот, на сервере должен хранится пароль в открытом виде, иначе эту HMAC не вычислить.
Довекот делает хитрее, он заранее выполняет некоторую часть вычислений, которая не зависит от меняющегося в каждой сессии параметра m. Но если злоумышленник украдет этот довекотовский хеш, то, получив от сервера число m, он проделает оставшуюся часть вычислений и успешно авторизуется, без всякого брутфорса. Если же он украдет файл юниксовых паролей (MD5 с солью), то ему придется делать брутфорс, чтобы определить пароль. Видите разницу?> схему в студию как вы будете зная хеш на стороне сервера проходить авторизацию
конкретную схему я описать не могу, нужно разбираться, что именно dovecot вычисляет, но поверьте, имея на руках файл с хешами, злоумышленник разберется
Если вас все это не убеждает, то у меня больше нет аргументов, спросите у кого-нибудь еще. Все уже разжевал.
описанный вами алгоритм он производится на стороне серверадовкот посылает челендж
вот функция
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;
}и отправляем эти данные на сервер
а теперь вопрос - зная хеш пароля куда я его буду пихат ?????????????
судя по алгоритму да можно его подставить но механизм аутентификации этого не позволит
вот ещё функция реализации 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;
}
Посмотрим на такой алгоритм аутентификации имени меня.
- сервер посылает случайное число challenge
- клиент вычисляет некое x = H1(challenge, H2(password)), H1 и H2 - криптохеш-функции и посылает на сервер.
- сервер делает то же самое, только с хранящимся на сервере паролем и сравнивает
Видно, что это некий абстрактный cram-md5.Так вот, хитрющий довекот хранит у себя dovecot_hash=H2(password), чтобы не вычислять его каждый раз. Если файл с хешами попадет к нехорошему человеку, он при аутентификации сможет вычислить x = H1(challenge, dovecot_hash) и авторизоваться.
> а теперь вопрос - зная хеш пароля куда я его буду пихат ?????????????Я уже говорил, что нужно посмотреть, что именно довекот может вычислить без знания challenge (т.е. H2), и тогда можно будет определить формулу для злоумышленника.
а вы попробуйте реализовать этот алгоритм dovecot_hash=H2(password)
а потом сделайте так x = H1(challenge, dovecot_hash)
а на счёт брутфорсеров - то всё можно пробрутфорсить
но при этом есть варианты брутфорса с использованием имеющегося хеша пароля и без неготипичный случай брутфорс мд5 который возвращает один и тот же хеш и в данном случае достаточно шифровать последовательности и сравнивать с хешом
в случае мд5 используемом в системе юниксов для авторизации необходимо иметь хеш чтобы пробрутфорсить
Да это уже проходили.любой CRAM принципиально требует наличия не зашифрованного пароля на сервере. Это просто по определению. В случаи с мд5 всего лишь требуется модифицированный клиент.
Сами разберитесь как это работает, в инете достаточно много есть об этом.
мда не знал что у меня в базе плаинтекстовые пассы хранятьсякапча: 30005