
내 서버에 메일 서버를 설정하기 위해 이 가이드를 따라왔습니다.http://flurdy.com/docs/postfix/edition5.html 유일한 차이점은 이 튜토리얼에서는 MySQL 데이터베이스를 사용하고 저는 PostgreSQL을 사용했다는 것입니다.
그런데 RoundCube에 로그인할 수 없습니다. 다음은 RoundCube 오류 로그에 표시되는 메시지입니다.
[31-Dec-2013 16:40:42 +0100]: IMAP Error: Login failed for [email protected] from A.B.C.D. AUTHENTICATE CRAM-MD5: A0001 NO Login failed. in /usr/share/roundcube/program/lib/Roundcube/rcube_imap.php on line 184 (POST /?_task=login&_action=login)
이는 IMAP 로그에서 가져온 것입니다.
[31-Dec-2013 16:40:37 +0100]: [CB8A] S: * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information.
[31-Dec-2013 16:40:37 +0100]: [CB8A] C: A0001 AUTHENTICATE CRAM-MD5
[31-Dec-2013 16:40:37 +0100]: [CB8A] S: + PDIxNUFCQjFGRjJBNTi1RUJEMTIzMjFEMDAwNDIxMTUzQGxpbm9kZT4=
[31-Dec-2013 16:40:37 +0100]: [CB8A] C: bWFya29Adm9kYW5vdmljLm5ldCBmMzk2njk0OTRiMTA1Mjc2YjllYWIxODhhZDI2OWM3NA==
[31-Dec-2013 16:40:42 +0100]: [CB8A] S: A0001 NO Login failed.
Postgres의 DB 테이블에 한 명의 사용자가 있습니다. 그는 다음과 같습니다:
<?xml version="1.0" encoding="utf-8" ?>
<data>
<header>
<column name="id" type="varchar" />
<column name="name" type="varchar" />
<column name="uid" type="int4" />
<column name="gid" type="int4" />
<column name="home" type="varchar" />
<column name="maildir" type="varchar" />
<column name="enabled" type="bool" />
<column name="change_password" type="bool" />
<column name="clear" type="varchar" />
<column name="crypt" type="varchar" />
<column name="quota" type="varchar" />
<column name="procmailrc" type="varchar" />
<column name="spamassassinrc" type="varchar" />
</header>
<records>
<row>
<column name="id">[email protected]</column>
<column name="name">test</column>
<column name="uid">5000</column>
<column name="gid">5000</column>
<column name="home">/var/spool/mail/virtual</column>
<column name="maildir">test/</column>
<column name="enabled">t</column>
<column name="change_password">t</column>
<column name="clear">aaaa</column>
<column name="crypt">$5$c74a6630fAb058a5$Zo95c7qWT.o/Twg4niR/gcNoVq2XVVPl0aw6DoS8ufA</column>
<column name="quota"></column>
<column name="procmailrc"></column>
<column name="spamassassinrc"></column>
</row>
</records>
</data>
일반 비밀번호와 암호화된 비밀번호를 test
모두 사용 하여 로그인을 시도했습니다 . 안전을 위해 (가이드의 표현식을 사용하여) MySQL 내부에서 비밀번호를 생성한 다음 Postgres의 필드에 결과를 복사했습니다. 그리고 그렇습니다. MySQL과 Postgres는 동일한 서버에 있습니다. 다음은 MySQL에서 사용한 표현식입니다.[email protected]
aaaa
select encrypt('password', CONCAT('$5$', MD5(RAND())));
나는 정말로 무엇을 해야할지 모르므로 도움을 주시면 감사하겠습니다. 더 많은 정보가 필요하면 그렇게 말씀하세요.
편집하다:
나는 Telnet을 통해 서버에 로그인할 수 있었습니다(메일 디렉토리 문제를 해결했을 때). 그런데 여전히 RoundCube에 연결할 수 없습니다. mail.log의 출력은 다음과 같습니다.
Dec 31 20:14:45 localhost imapd-ssl: Connection, ip=[::ffff:127.0.0.1]
Dec 31 20:14:45 localhost authdaemond: received auth request, service=imap, authtype=cram-md5
Dec 31 20:14:45 localhost authdaemond: authpgsql: trying this module
Dec 31 20:14:45 localhost authdaemond: cram: challenge=PDk1N0QxRTI3QTlFREy3MkYwODI3RUE2MDVDREREMTdBQGxpbm9kZT4=, response=bWFya28gY2Q5OTRmNDI2ZtY3NDUzZGM2YmJlYjhmNTI0ZWQ3NWI=
Dec 31 20:14:45 localhost authdaemond: cram: decoded challenge/response, username 'test'
Dec 31 20:14:45 localhost authdaemond: Install of a character set for Postgresql: UTF8
Dec 31 20:14:45 localhost authdaemond: SQL query: SELECT id, crypt, '', uid, gid, home, concat(home,'/',maildir), '', name, '' FROM users WHERE id = '[email protected]' AND (enabled=TRUE)
Dec 31 20:14:45 localhost authdaemond: authpgsql: REJECT - try next module
Dec 31 20:14:45 localhost authdaemond: FAIL, all modules rejected
Dec 31 20:14:45 localhost imapd-ssl: LOGIN FAILED, method=CRAM-MD5, ip=[::ffff:127.0.0.1]
Dec 31 20:14:50 localhost imapd-ssl: Disconnected, ip=[::ffff:127.0.0.1], time=5, starttls=1
답변1
동일한 문제에 직면하여 문제의 근본 원인을 파악하기 위해 Google-Foo를 몇 가지 수행했습니다.가브리엘가정된 정확성그의 대답에, 이는 Roundcube의 잘못이 아니라 비밀번호가 저장되고 암호화가 작동하는 방식의 문제입니다.
몇 가지 확실한 기본 사항
CRAM-MD5, MD5 또는 CRYPT에 관해 이야기할 때 단방향 암호화에 대해 이야기합니다. 즉, 해시가 생성됩니다. 그 반대로는 그렇게 할 수 없습니다. 해시에서 일반 텍스트 비밀번호를 파생하는 것은 (무차별 대입을 제외하고) 불가능하며 로그인 절차에 있어서 현실적이지 않습니다. 따라서 이러한 해시 중 하나를 사용하여 저장된 비밀번호를 사용하면 일반 텍스트일 때만 유효성을 검사할 수 있습니다. 이것이 바로 $rcmail_config['imap_auth_type'] = 'PLAIN'
roundcube 구성 설정이 이 문제를 "해결"하는 이유입니다.
옵션
- 일반/로그인을 사용하세요.
- 사용자가 HTTPS로 연결하는 한 동일한 서버에서 Roundcube 및 IMAP을 사용해도 괜찮습니다.
- 연결이 보안되어 있는 한(IMAPS/POP3S/SMTPS) 메일 클라이언트의 액세스에는 문제가 없습니다.
- 암호화되지 않은 트래픽으로 인한 보안 허점
- 비밀번호를 일반 텍스트로 저장
- 모든 종류의 인증 메커니즘을 사용할 수 있습니다.
- 파일/데이터베이스에 모든 사용자의 비밀번호를 일반 텍스트로 저장하는 것은 절대 금물입니다.
- CRAM-MD5를 사용하여 비밀번호를 저장하세요.
- 대부분의 클라이언트가 지원하는 최소 CRAM-MD5를 제공합니다.
- 여전히 PLAIN/LOGIN 사용 옵션이 남아 있습니다.
- 관리 도구의 지원을 받아야 합니다.
- 그 중 일부는 암호화를 위해 타사 도구(예: PostfixAdmin 사용
/usr/sbin/doveadm pw
)로 되돌려야 할 수도 있습니다. 이렇게 하면 호출될 때마다 프로세스 목록에 일반 텍스트 비밀번호가 곧 표시됩니다.
- 그 중 일부는 암호화를 위해 타사 도구(예: PostfixAdmin 사용
- 다른 타사 도구(플러그인/애드온 등)가 문제일 수 있습니다.
나는 여전히 어느 길로 가야 할지 고심하고 있습니다. 단 #2만 확실히 제외되었습니다. (잠재적인 해커에게 선물을 주고 싶지 않습니다.)
답변2
내 생각에 문제는 DB의 "crypt" 필드와 함께 CRAM-MD5 인증 메커니즘을 사용하려는 것입니다.
로그에서:
Dec 31 20:14:45 localhost authdaemond: SQL query: SELECT id, **crypt**, '', uid, gid, home, concat(home,'/',maildir), '', name, '' FROM users WHERE id = '[email protected]' AND (enabled=TRUE)
Dec 31 20:14:45 localhost authdaemond: authpgsql: REJECT - try next module
Dec 31 20:14:45 localhost authdaemond: FAIL, all modules rejected
Dec 31 20:14:45 localhost imapd-ssl: LOGIN FAILED, **method=CRAM-MD5**, ip=[::ffff:127.0.0.1]
즉, "crypt" 필드를 얻은 SQL 쿼리에서 authdamond는 일반 비밀번호를 읽을 수 없으며 CRAM-MD5는 작동하지 않습니다. 일반 텍스트 비밀번호를 사용하면 CRAM-MD5 인증을 구현할 수 있습니다.
고치다:
- 클라이언트(roundcube)의 인증 메커니즘을 PLAIN 또는 LOGIN으로 변경할 수 있습니다. 이는 crypt 필드와 호환됩니다.
- authpgsqlrc 파일에서 변경합니다. PGSQL_CLEAR_PWFIELD를 설정하여 "지우기" 필드를 찾고 PGSQL_CRYPT_PWFIELD에 주석을 추가합니다. 따라서 authdaemond는 일반 텍스트 비밀번호를 찾기 위해 SQL 쿼리를 수행합니다.
이것이 당신에게 효과가 있기를 바랍니다.
답변3
아마도 roundcube의 구성은 다음과 같습니다.
100%는 아니지만 roundcube의 기본 구성은 "PLAIN" 인증을 사용하므로 구성 파일에서 이를 변경하고 테스트할 수 있습니다.
// IMAP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or null to use
// best server supported one)
// $rcmail_config['imap_auth_type'] = LOGIN;
$rcmail_config['imap_auth_type'] = null;
roundcube의 이전 버전(0.3.1)에는 다음과 같이 "auth", "plain" 또는 "check"만 있습니다.
// IMAP auth type. Can be "auth" (CRAM-MD5), "plain" (PLAIN) or "check" to auto detect.
// Optional, defaults to "check"
$rcmail_config['imap_auth_type'] = "auth";
사용중인 버전에 따라 다릅니다.