LINUX.ORG.RU
ФорумAdmin

Postfix аутентифкация failed при SASL CRAM-MD5

 ,


0

2

При отправке сообщения Postfix ругается на аутентификацию

Oct  4 11:02:02 postfix postfix/smtpd[21764]: warning: unknown[192.168.206.20]: SASL CRAM-MD5 authentication failed: PDc4NzM1NDI1ODIyNjAxOTcuMTQ3NTU2ODEyMEBwb3N0Zml4Pg==
Oct  4 11:02:02 postfix postfix/smtpd[21764]: disconnect from unknown[192.168.206.20

На стороне postfix

mysql> INSERT INTO users (email, password) VALUES ('support@domain.ru', ENCRYPT('passwd'));
mysql> select * from users where email="support@domain.ru";
+---------------------+---------------+
| email               | password      |
+---------------------+---------------+
| support@domain.ru   | X77m94lRCLxtM |
+---------------------+---------------+
1 row in set (0.00 sec)

t# cat dovecot-sql.conf
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail password=pass
default_pass_scheme = CRYPT
password_query = SELECT email AS user, password FROM users WHERE email = '%u'
# cat dovecot.conf |grep auth_mechanisms
auth_mechanisms = plain login cram-md5 digest-md5
# cat smtpd.conf
pwcheck_method: saslauthd
mech_list: DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: passwd
sql_database: mail
sql_select: SELECT password FROM users WHERE email = '%u'

Механизм аутентификации digest-md5 работает!

★★★★★

Ответ на: комментарий от vasily_pupkin

Попробуй в кач-ве пароля X77m94lRCLxtM

Oct  4 11:58:13 postfix postfix/smtpd[22391]: connect from unknown[192.168.206.20]
Oct  4 11:58:15 postfix postfix/smtpd[22391]: warning: unknown[192.168.206.20]: SASL CRAM-MD5 authentication failed: PDQ2MzQzODgwNTU4MTE3NjQuMTQ3NTU3MTQ5M0Bwb3N0Zml4Pg==
Oct  4 11:58:15 postfix postfix/smtpd[22391]: disconnect from unknown[192.168.206.20]

petav ★★★★★
() автор топика
Ответ на: комментарий от vel

Пароль должен быть в поле userPassword

У меня же указано что пароль запрашивать так:

sql_select: SELECT password FROM users WHERE email = '%u'
Я вас не понял.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Но разницы нет (поправил smtpd.conf), что так:

mysql>SELECT password FROM users WHERE email ='support@domain.ru';
+---------------+
| password      |
+---------------+
| X77m94lRCLxtM |
+---------------+
1 row in set (0.00 sec)
что так
mysql> SELECT password as userPassword FROM users WHERE email ='support@domain.ru';
+---------------+
| userPassword  |
+---------------+
| X77m94lRCLxtM |
+---------------+
1 row in set (0.00 sec)

Oct  4 12:53:23 postfix postfix/smtpd[23475]: connect from unknown[192.168.206.20]
Oct  4 12:53:25 postfix postfix/smtpd[23475]: warning: unknown[192.168.206.20]: SASL CRAM-MD5 authentication failed: PDkyMTc5MTQyNTkyOTU0MzcuMTQ3NTU3NDgwM0Bwb3N0Zml4Pg==
Oct  4 12:53:25 postfix postfix/smtpd[23475]: disconnect from unknown[192.168.206.20]
petav ★★★★★
() автор топика
Последнее исправление: petav (всего исправлений: 1)
Ответ на: комментарий от petav

Если верить документации, то cram-md5 хочет пароль в открытом виде и поле должно называться userPassword, а не password.

Далее

pwcheck_method: saslauthd
mech_list: DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
allow_plaintext: true
auxprop_plugin: mysql
Ты уж определись! Если используется «pwcheck_method: saslauthd», то разбирайся с saslauthd https://cyrusimap.org/sasl/faqs/crammd5-digestmd5.html

Если «auxprop_plugin: mysql» то тогда должно быть

pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
Если непонятно что за ошибки то в .conf
sql_verbose: true
log_level: 7

«WHERE email = '%u'» - IMHO только имя без домена

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Если верить документации, то cram-md5 хочет пароль в открытом виде

Может быть, но клиентское приложение делает так

public function authenticate(
$username,
$password,
$authtype = 'LOGIN',
$realm = '',
$workstation = ''
) {
 if (empty($authtype)) {
$authtype = 'LOGIN';
}
switch ($authtype) {
#....
case 'CRAM-MD5':
// Start authentication
if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
return false;
}
// Get the challenge
$challenge = base64_decode(substr($this->last_reply, 4));

// Build the response
$response = $username . ' ' . $this->hmac($challenge, $password);

// send encoded credentials
return $this->sendCommand('Username', base64_encode($response), 235);
break;
}
#...
}
protected function hmac($data, $key)
{
if (function_exists('hash_hmac')) {
return hash_hmac('md5', $data, $key);
}

// The following borrowed from
// http://php.net/manual/en/function.mhash.php#27225

// RFC 2104 HMAC implementation for php.
// Creates an md5 HMAC.
// Eliminates the need to install mhash to compute a HMAC
// Hacked by Lance Rushing

$bytelen = 64; // byte length for md5
if (strlen($key) > $bytelen) {
$key = pack('H*', md5($key));
}
$key = str_pad($key, $bytelen, chr(0x00));
$ipad = str_pad('', $bytelen, chr(0x36));
$opad = str_pad('', $bytelen, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;

return md5($k_opad . pack('H*', md5($k_ipad . $data)));
}

pwcheck_method: auxprop

И auxprop и saslauthd пробовал, потому что не понял где ошибка.

Если непонятно что за ошибки то в .conf

Да, спасибо

«WHERE email = '%u'» - IMHO только имя без домена

Да, все верно и имя и домен в одном столбце храняться.

petav ★★★★★
() автор топика
Последнее исправление: petav (всего исправлений: 2)
Ответ на: комментарий от vel

Если верить документации, то cram-md5 хочет пароль в открытом виде и поле должно называться userPassword

А можно ссылку на эту документацию, потому что здесь CRAM-MD5 совершенно другое про этот метод аутентификации написано.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

«WHERE email = '%u'» - IMHO только имя без домена

так тогда нужно «WHERE email = '%u@%r'

на счет cram-md5: его реализация в cyrus-sasl требует открытого пароля. Если в постфиксе своя реализация, тогда я ничем не могу помочь.

vel ★★★★★
()
Ответ на: комментарий от vel

Если в постфиксе своя реализация, тогда я ничем не могу помочь

Не буду утверждать, но я думаю что в Postfix как раз стандратная реализация. Может кто придет и поправит мои догадки.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Слишком заумно написано в вики.

с сервера приходит токен в b64 ( <7873542582260197.1475568120@postfix> в твоем случае )

клиент вычисляет md5(токен+пароль)

клиент отвечает серверу в b64(username md5hash)

Сервер сравнивает полученный хеш с вычисленным аналогично, т.е. ему нужен пароль в явном виде на момент вычисления хеша.

vel ★★★★★
()
Ответ на: комментарий от vel

Следуя этой логике пароль «X77m94lRCLxtM» должен был бы сработать. Я его пробовал и с support и support@domain.ru. Это к Вашему:

так тогда нужно «WHERE email = '%u@%r'

vel, спасибо за пояснения. Подумаю еще, принимая их во внимание.

petav ★★★★★
() автор топика

Какой-то ужас, все почему cyrus(saslauthd) и dovecot вместе? Я чую, что тут полная каша. Можно посмотреть конфиги postfix ?

anonymous
()

Не должно быть cyrus и dovecot в одной связке. Они делают одну и ту же работу. Видимо вы понахватали кусков из разных конфигов. Уберите cyrus он он убогий и оставьте dovecot. Отдайте заниматься авторизацией dovecot'у ( в том числе и по smtp). Postfix должен перенаправлять запросы ему. В общем, дайте конфиги.

anonymous
()
Ответ на: комментарий от anonymous

и оставьте dovecot. Отдайте заниматься авторизацией dovecot'у ( в том числе и по smtp). Postfix должен перенаправлять запросы ему.

Все так и есть. cyrus у vel

А по вопросу... Я наверое из 250-AUTH уберу CRAM-MD5 и может клиент воспользуется чем-то другим.

$ nc smtp.domain.ru 25
220 domain.ru ESMTP Postfix (@@DISTRO@@)
EHLO 123
250-domain.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5
250-AUTH=PLAIN LOGIN CRAM-MD5 DIGEST-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Да, клиенту пришлось перейти на LOGIN

250-AUTH PLAIN LOGIN DIGEST-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5

Oct  4 21:47:38 postfix postfix/smtpd[30027]: connect from unknown[192.168.206.20]
Oct  4 21:47:38 postfix postfix/smtpd[30027]: 84E0922472: client=unknown[192.168.206.20], sasl_method=LOGIN, sasl_username=support@domain.ru
Oct  4 21:47:38 postfix postfix/cleanup[30113]: 84E0922472: message-id=<2c5cb24@support.domain.ru>
Oct  4 21:47:38 postfix postfix/qmgr[30012]: 84E0922472: from=<support@domain.ru>, size=1025, nrcpt=1 (queue active)
Oct  4 21:47:38 postfix postfix/smtpd[30027]: disconnect from unknown[192.168.206.20]

Для себя не вижу смысла ковырять этот CRAM-MD5

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

да нет же, у тебя smtpd.conf и в нем saslauthd это цирус. Зачем делать из клиента тестера? Лучше покажи конфиг postfix и я тебе все разжую.

constin ★★★★
()
Ответ на: комментарий от petav

Если оно через tls/ssl работает, то login/plain достаточно.

если работает digest-md5, то cram-md5 наверно можно убрать. A кто из клиентов кроме thunderbird умеет digest-md5 ?

Но эта ситуация очень странная, если digest-md5 работает, а cram-md5 - нет.

Раньше в комплекте cyrus-sasl была утиль smtptest, которой можно было протестировать работу разных способов авторизации. А в составе cyrus-imap был imtest который делал тоже самое через протокол imap. Их отладочный вывод позволял понять с какой стороны возникает проблема.

vel ★★★★★
()
Ответ на: комментарий от constin
# dpkg -l|grep cyrus
#
# tree /etc/postfix
/etc/postfix
├── certificate
│   ├── smtpd.key
│   └── smtpd.pem
├── dynamicmaps.cf
├── main.cf
├── main.cf.23062015
├── master.cf
├── master.cf_backup
├── mysqlconf
│   ├── virtual_domains.cf
│   ├── virtual_email2email.cf
│   ├── virtual_forwardings.cf
│   └── virtual_mailboxes.cf
├── postfix-files
├── postfix-script
├── post-install
└── sasl
    ├── smtpd.conf
    ├── smtpd.conf.2306.2015
    └── smtpd.conf.back
# cat /etc/postfix/master.cf | grep -v '^#'
smtp      inet  n       -       -       -       -       smtpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix	-	n	n	-	2	pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
# cat /etc/postfix/main.cf | grep -v '^#'

command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
myhostname = domain.ru
mydomain = domain.com
inet_interfaces = all
mydestination = localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
smtpd_banner = $myhostname ESMTP $mail_name (@@DISTRO@@)
local_destination_concurrency_limit = 20
default_destination_concurrency_limit = 20

debugger_command =
	 PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
	 ddd $daemon_directory/$process_name $process_id & sleep 5

inet_protocols = ipv4

smtpd_use_tls = yes
smtpd_tls_cert_file=/etc/postfix/certificate/smtpd.pem
smtpd_tls_key_file=/etc/postfix/certificate/smtpd.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes

virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysqlconf/virtual_forwardings.cf, mysql:/etc/postfix/mysqlconf/virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysqlconf/virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysqlconf/virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes

smtpd_delay_reject = yes

smtpd_client_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    permit

smtpd_helo_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname,
    reject_unknown_helo_hostname,
    permit

smtpd_sender_restrictions =
    permit_mynetworks,
    reject_non_fqdn_sender,
    permit_sasl_authenticated,
    permit

smtpd_recipient_restrictions =
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unlisted_recipient,
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unknown_sender_domain,
    reject_rbl_client sbl.spamhaus.org,
    reject_rbl_client dnsbl-1.uceprotect.net,
    reject_rbl_client dnsbl.sorbs.net,
    reject_rbl_client ix.dnsbl.manitu.net,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client access.redhawk.org,
    reject_rbl_client bl.deadbeef.com,
    reject_rbl_client dnsbl.cyberlogic.net,
    reject_rbl_client korea.services.net,
    reject_unknown_client_hostname,
    reject_unauth_pipelining,
    reject_unauth_destination,
    permit

smtpd_data_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_pipelining,
    permit

smtpd_end_of_data_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_multi_recipient_bounce,
    permit

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
petav ★★★★★
() автор топика
Ответ на: комментарий от constin
# tree /etc/dovecot
/etc/dovecot
├── certificate
│   ├── dovecot.key
│   └── dovecot.pem
├── conf.d
│   ├── 10-auth.conf
│   ├── 10-director.conf
│   ├── 10-logging.conf
│   ├── 10-mail.conf
│   ├── 10-master.conf
│   ├── 10-ssl.conf
│   ├── 10-tcpwrapper.conf
│   ├── 15-lda.conf
│   ├── 15-mailboxes.conf
│   ├── 20-imap.conf
│   ├── 90-acl.conf
│   ├── 90-plugin.conf
│   ├── 90-quota.conf
│   ├── 90-sieve.conf
│   ├── auth-checkpassword.conf.ext
│   ├── auth-deny.conf.ext
│   ├── auth-ldap.conf.ext
│   ├── auth-master.conf.ext
│   ├── auth-passwdfile.conf.ext
│   ├── auth-sql.conf.ext
│   ├── auth-static.conf.ext
│   ├── auth-system.conf.ext
│   └── auth-vpopmail.conf.ext
├── dovecot.conf
├── dovecot.conf_backup
├── dovecot-db.conf.ext
├── dovecot-dict-sql.conf.ext
├── dovecot-ldap.conf.ext
├── dovecot.pem
├── dovecot-sql.conf
├── dovecot-sql.conf.ext
├── private
│   └── dovecot.pem
└── README

# cat /etc/dovecot/dovecot.conf | grep -v '^#'
protocols = imap
listen = *
shutdown_clients = yes
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 5000
last_valid_uid = 5000

log_path = /var/log/mail.log

ssl_cert = </etc/dovecot/certificate/dovecot.pem
ssl_key = </etc/dovecot/certificate/dovecot.key

mail_location = maildir:/home/vmail/%d/%n

protocol lda {
  auth_socket_path = /var/run/dovecot/auth-master
  log_path = /home/vmail/dovecot-deliver.log
  mail_plugins = sieve
  postmaster_address = admin@domain.com
}

namespace {
  inbox = yes
  location =
  prefix = INBOX.
  separator = .
}

passdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  user = root
}

userdb {
  args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
  driver = static
}

auth_mechanisms = plain login digest-md5

petav ★★★★★
() автор топика
Ответ на: комментарий от vel

Но эта ситуация очень странная, если digest-md5 работает, а cram-md5 - нет

Вот тут, не буду утвержать, что digest-md5, есть ощущение что сказав это, я сказал не совсем правду. Теперь не уверен.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

я должен какое-то время покурить твои конфиги, но на вскидку: 1.smtpd.conf у тебя вообще никак в процессе не участвует, так что меняй там что-ли не меняй - разницы нет. Так что цирус ты действительно не используешь, это хорошо.

2. Postfix сам у тебя не авторизует, он отдает эту работу Dovecot'у

smtpd_sasl_path = private/auth

3. Поэтому механизмы авторизации тебе надо крутить в конфиге dovecot, где у тебя сейчас auth_mechanisms = plain login digest-md5

cram-md5 , как видишь, тут нет, добавь его.

Мне не очень понятно, зачем тебе он вообще нужен cram-md5, по хорошему plain login достаточно, если ты всех заставляешь это делать через TLS (чистый SSL отдавать тоже не надо, так как он дырявый)

Завтра напишу больше, если надо.

constin ★★★★
()
Ответ на: комментарий от constin

1.smtpd.conf у тебя вообще никак в процессе не участвует, так что меняй там что-ли не меняй - разницы нет. Так что цирус ты действительно не используешь, это хорошо.

Да, не учавствует.

Postfix сам у тебя не авторизует, он отдает эту работу Dovecot'у

Да

Мне не очень понятно, зачем тебе он вообще нужен cram-md5,

Я тоже так думаю. Просто он был наверное изначально, но ни кто его работу не проверял. А тут приложение обновилось и увидело, что есть такая возможность и начало пользоваться и почта перестала отправляться.

по хорошему plain login достаточно, если ты всех заставляешь это делать через TLS

Да, не нужен.

Завтра напишу больше, если надо

constin, спасибо! Вопрос исчерпан, я думаю. Тут надо к сереру spamassistant прикрутить и shared folder, вот тут если можно проконсультируюсь в новой ветке.

petav ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.