SSMTP를 사용하여 Postfix를 통해 메일을 보낼 때 인증 오류

SSMTP를 사용하여 Postfix를 통해 메일을 보낼 때 인증 오류

SSMTP를 실행하는 서버 A에서 Postfix를 실행하는 서버 B를 통해 메일을 보내려고 합니다. Postfix 서버가 제대로 실행되고 있으며 한동안 아무런 문제 없이 프로덕션 환경에 있었습니다. Dovecot을 사용하여 Postfix를 실행합니다.

내 Gmail 계정을 사용하여 SSMTP에서 메일을 보낼 수 있으며 작동하지만 전체 메일 프로세스를 더 잘 제어하고 싶기 때문에 자체 Postfix 서버를 사용하고 싶습니다.

다음 로그와 코드에서는 내 공개 도메인을 example.com으로 바꿨습니다.

다음은 SSMTP에서 생성된 오류입니다.

root@N40L:/etc/ssmtp# echo "test" | mailx -vvv -s "test" [email protected]
[<-] 220 h******.stratoserver.net ESMTP Postfix (Debian/GNU)
[->] EHLO example.com
[<-] 250 DSN
[->] AUTH LOGIN
[<-] 535 5.7.8 Error: authentication failed: Invalid authentication mechanism
send-mail: Server didn't like our AUTH LOGIN (535 5.7.8 Error: authentication failed: Invalid authentication mechanism)

저는 두 대의 컴퓨터에서 Debian 8을 실행하고 있습니다.

이것은 내 ssmtp.conf입니다.

[email protected]
mailhub=example.com:465
rewriteDomain=example.com
hostname=example.com
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=correctpassword

SSMTP가 때때로 영숫자가 아닌 비밀번호를 처리할 수 없다는 것을 알고 있으므로 비밀번호는 문자와 숫자의 문자열입니다. 나는 Mutt를 사용하여 그것을 확인했고 그것이 올바른 비밀번호, 올바른 사용자 이름, 올바른 포트라고 확신합니다.

접미사 main.cf:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = ********.stratoserver.net
myorigin = /etc/mailname
mydestination = localhost.stratoserver.net, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
message_size_limit=20480000
virtual_mailbox_domains = a.bunch.of names.here.and example.com
virtual_mailbox_base = /var/mail/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_gid_maps = static:5000
virtual_uid_maps = static:5000
virtual_minimum_uid = 5000
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
content_filter = scan:127.0.0.1:10026
receive_override_options = no_address_mappings

LetsEncrypt 인증서는 올바른 이름을 표시하며 많은 전화기(Android 및 iPhone)는 물론 다양한 메일 클라이언트 및 웹 메일에도 만족합니다. 인증서가 제대로 된 것 같아요.

master.cf, 관련성이 있는지 확실하지 않지만:

smtp      inet  n       -       -       -       -       smtpd -v
 -o content_filter=spamassassin
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
pickup    unix  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      unix  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}
spamassassin unix -     n       n       -       -       pipe
  user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
scan      unix  -       -       n       -       16      smtp
        -o smtp_send_xforward_command=yes

127.0.0.1:10025 inet  n -       n       -       16      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks_style=host
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Dovecot의 관련 구성 섹션:

# 2.2.13: /etc/dovecot/dovecot.conf
auth_debug = yes
auth_debug_passwords = yes
auth_verbose = yes
mail_debug = yes
mail_plugins = " quota"
mail_privileged_group = vmail
managesieve_notify_capability = mailto
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocols = " imap lmtp sieve"
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0666
    user = postfix
  }
}
service imap-login {
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0666
    user = postfix
  }
}
ssl = required
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt//live/example.com/privkey.pem
userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
verbose_ssl = yes
protocol lmtp {
  mail_plugins = " quota sieve"
  postmaster_address = [email protected]
}

서버 A에서 메일을 보내려고 하는데 위의 오류가 발생하면 서버 B는 이를 /var/mail/mail.log에 기록합니다.

Jan 16 10:29:54 postfix/smtps/smtpd[13601]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Jan 16 10:29:54 postfix/smtps/smtpd[13601]: connect from ******.upc-h.chello.nl[62.194.***.***]
Jan 16 10:29:54 dovecot: auth: Debug: auth client connected (pid=0)
Jan 16 10:29:54 postfix/smtps/smtpd[13601]: warning: ******.upc-h.chello.nl[62.194.***.***]: SASL LOGIN authentication failed: Invalid authentication mechanism
Jan 16 10:29:54 postfix/smtps/smtpd[13601]: lost connection after AUTH from ******.upc-h.chello.nl[62.194.***.***]
Jan 16 10:29:54 postfix/smtps/smtpd[13601]: disconnect from ******.upc-h.chello.nl[62.194.***.***]

AuthMechanism=LOGINssmtp.conf에 or AuthMechanism=CRAM-MD5(SSMTP 매뉴얼 페이지에 따르면 이것이 사용 가능한 유일한 메커니즘임)을 추가한 경우에도 마찬가지이므로 다시 삭제했습니다.

인터넷에서는 Gmail을 SSMTP와 함께 사용하는 것을 매우 고집하기 때문에 저는 약간의 실험을 거쳐 UseSTARTTLS를 사용해 보았습니다. 그런 다음 서버 A에서 이런 일이 발생합니다.

send-mail: Cannot open example.com:465
Can't send mail: sendmail process failed with error code 1

...서버 B에 로그인되어 있습니다.

Jan 16 10:46:01 postfix/smtps/smtpd[14047]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Jan 16 10:46:01 postfix/smtps/smtpd[14047]: connect from ******.upc-h.chello.nl[62.194.***.***]
Jan 16 10:46:12 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jan 16 10:46:12 dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
Jan 16 10:46:12 dovecot: auth: Debug: auth client connected (pid=14049)
Jan 16 10:46:12 dovecot: auth: Debug: client in: AUTH#0111#011PLAIN#011service=imap#011secured#011session=***************AAAAAAAAAAB#011lip=::1#011rip=::1#011lport=143#011rport=60112#011resp=AG40MGxAd*****************QzE3MDE= (previous base64 data may contain sensitive data)
Jan 16 10:46:12 dovecot: auth-worker(14017): Debug: sql([email protected],::1): query: SELECT email as username, pwd AS password FROM addresses WHERE email = '[email protected]'
Jan 16 10:46:12 dovecot: auth: Debug: client passdb out: OK#0111#[email protected]
Jan 16 10:46:12 dovecot: auth: Debug: master in: REQUEST#011154140673#01114049#0111#0114d206d2a85468af9af75b8538aab7485#011session_pid=14050#011request_auth_token
Jan 16 10:46:12 dovecot: auth-worker(14017): Debug: sql([email protected],::1): SELECT 5000 AS uid, 5000 as gid, email, '/var/mail/vmail/example.com/n40l' AS home FROM addresses WHERE email = '[email protected]'
Jan 16 10:46:12 dovecot: auth: Debug: master userdb out: USER#011154140673#[email protected]#011uid=5000#011gid=5000#[email protected]#011home=/var/mail/vmail/example.com/n40l#011auth_token=ff5b12*****************aedf315ac08e
Jan 16 10:46:12 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=::1, lip=::1, mpid=14050, secured, session=<0pDTDTNG0AAAAAAAAAAAAAAAAAAAAAAB>
Jan 16 10:46:12 dovecot: imap: Debug: Loading modules from directory: /usr/lib/dovecot/modules
Jan 16 10:46:12 dovecot: imap: Debug: Module loaded: /usr/lib/dovecot/modules/lib10_quota_plugin.so
Jan 16 10:46:12 dovecot: imap: Debug: Module loaded: /usr/lib/dovecot/modules/lib11_imap_quota_plugin.so
Jan 16 10:46:12 dovecot: imap: Debug: Added userdb setting: plugin/[email protected]
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Effective uid=5000, gid=5000, home=/var/mail/vmail/example.com/n40l
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Quota root: name=User quota backend=maildir args=
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Quota rule: root=User quota mailbox=* bytes=10737418240 messages=0
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Quota rule: root=User quota mailbox=Trash bytes=+104857600 messages=0
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Quota grace: root=User quota bytes=536870912 (5%)
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: Namespace inbox: type=private, prefix=, sep=, inbox=yes, hidden=no, list=yes, subscriptions=yes location=maildir:/var/mail/vmail/example.com/n40l
Jan 16 10:46:12 dovecot: imap([email protected]): Debug: maildir++: root=/var/mail/vmail/example.com/n40l, index=, indexpvt=, control=, inbox=/var/mail/vmail/example.com/n40l, alt=
Jan 16 10:46:12 dovecot: imap([email protected]): Disconnected: Logged out in=50 out=475

B서버의 웹메일에 문제없이 로그인이 가능하고, 제가 사용하고 있는 주소로 메일을 주고받을 수 있어서 계정 자체는 문제가 없습니다. 다른 계정을 사용해 보았지만 동일한 오류가 발생했습니다.

나는 헤매고 있다. SSMTP는 Postfix를 통해 메일을 보낼 수 있어야 합니다. 디버깅 및 상세 옵션을 모두 활성화해도 문제의 원인을 찾을 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

root@N40L:/etc/ssmtp# echo "test" | mailx -vvv -s "test" [email protected]
[<-] 220 h******.stratoserver.net ESMTP Postfix (Debian/GNU)
[->] EHLO example.com
[<-] 250 DSN

이 명령은 Postfix에 연결하여 프로필을 h******.stratoserver.net보냅니다 EHLO. 그러나 수신된 응답은 단순히 250 DSNPostfix가 현재 인증을 수락할 의사가 없음을 나타냅니다. 인증을 수락하면 응답은 다음과 유사할 수 있습니다.

[<-] 250-AUTH PLAIN LOGIN CRAM-MD5
[<-] 250 DSN

기본적으로 클라이언트에 대한 서버의 응답은 EHLO해당 특정 서버가 어떤 SMTP 프로토콜 기능을 기꺼이 받아들이는지 클라이언트에게 알려줍니다. 인증을 위해서는 해당 단어 AUTH와 허용되는 인증 메커니즘 목록이 포함된 줄이 있어야 합니다 . 여러 줄의 응답에는 클라이언트의 이전 명령의 결과 코드와 마지막 줄을 제외한 각 줄의 시작 부분에 빼기 기호(여기)가 포함됩니다 250-. 대답의 마지막 줄에는 결과 코드와 공백 문자가 포함됩니다.

ssmtp.conf서비스 이름에 해당하는 포트 465를 사용한다고 표시 합니다 smtps.

mailhub=example.com:465

따라서 관련 Postfix master.cf항목은 다음과 같습니다.

smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

이것은 나에게 불완전해 보인다.

인증된 경우에만 이 포트를 통해 메일이 전송되도록 하려면 이전 서비스 ( 포트 587에서 실행되는 서비스) -o smtpd_client_restrictions=permit_sasl_authenticated,reject와 마찬가지로 이 포트도 필요합니다. 당신은 또한 필요합니다 .submissionsubmission-o smtpd_sasl_security_options=noanonymous

-o smtpd_sasl_type=dovecot특히 Postfix와 함께 Dovecot SASL을 사용하려면 거기에 한 줄을 추가 해야 합니다 . 다음을 원할 수도 있습니다 -o smtpd_sasl_path=private/auth. Postfix와 함께 Dovecot SASL을 사용하는 경우 Dovecot 구성에 다음과 같이 지정된 Dovecot SASL 인증 소켓의 위치를 ​​식별합니다.

unix_listener /var/spool/postfix/private/auth

그러나 Postfix 프로세스는 작업 디렉토리 smtpd로 사용될 것이기 때문에(그리고 실제로 그곳에서 루트가 변경될 수도 있습니다) 경로의 일부만 필요합니다 ./var/spool/postfixsmtpdprivate/auth

STARTTLS를 사용하려면 대신 포트 587을 사용해야 하며, 진단을 위해 해당 포트에 대한 Postfix의 EHLO 응답에는 250-STARTTLS.

STARTTLS의 일반적인 이벤트 순서는 다음과 같습니다.

  1. 클라이언트는 포트 587에 암호화되지 않은 연결을 설정하고 전송합니다.EHLO
  2. 암호화되지 않은 인증 데이터를 보내는 것은 그리 스마트하지 않기 때문에 서버 응답에는 OR 메커니즘이 포함되어 있지만 STARTTLS포함되어 있지 않습니다 AUTH.PLAINLOGIN
  3. 클라이언트는 STARTTLS명령을 보내고 양 당사자는 즉시 TLS 핸드셰이크를 시작합니다.
  4. TLS가 적용되면 클라이언트는 다른 메시지를 보냅니다.EHLO
  5. 이제 서버의 응답에는 AUTH서버 관리자가 허용한 모든 인증 메커니즘이 포함됩니다.

나는 이것이 OP에 대한 매우 늦은 답변이라는 것을 알고 있지만 아마도 다른 사람이 다양한 구성 부분이 어떻게 조화를 이루는 지 알아내는 데 도움이 될 것입니다. (이것은 확실히 나에게 Postfix 인증 지식을 다시금 상기시켜주었습니다.)

답변2

ssmtp는 손상된 인증 메커니즘을 사용하기 때문에 Outlook 클라이언트를 에뮬레이트하는 것으로 보입니다.

broken_sasl_auth_clients = yes이 문제는 postfix main.cf에서 "수정"됩니다.

관련 정보