Complete Virtual Mail Server/SMTP Authentication/ko
도입부
지금까지는 로컬 호스트만 메일 보내기를 허용했습니다. 아쉽게도 postfix는 courier-authlib와 직접적으로 동작할 수능 없습니다. 대신, 절충안인 dev-libs/cyrus-sasl이 있습니다. cyrus-sasl로 인증 정보를 가져오는 방법은 세가지가 있는데, 데이터베이스에서 직접 인증하거나, 로컬, 원격에서 처리하는 방법입니다. 이 방식의 설정은 다음과 같습니다.
courier-imap -> courier-authlib --\ +--> database postfix ------> cyrus-sasl -------/
약간 더 복잡할지라도, cyrus-sasl은 courier-authlib와 소통하는데 사용하여 courier-authlib로 인증하도록 합니다.
courier-imap -----------\ +-> courier-authlib -> database postfix -> cyrus-sasl --/
이상적으로 마지막 옵션이 해결책이 되겠지만, 사용할 인증 백엔드는 courier-authlib입니다. 허나, cyrus-sasl 플러그인은 courier-authlib와 유닉스 소켓을 통해서만 소통하므로 courier-authlib가 cyrus-sasl과 동일한 호스트에서 동작하지 않으면, 이 절차를 수행할 수 없습니다. 따라서 첫번째 접근 방식은 courier-authlib를 사용할 수 없을 때만 활용해야합니다.
cyrus-sasl 설치
cyrus-sasl의 핵심 기능은 crypt
USE 플래그가 필요합니다. 데이터베이스로 인증할 수 없을때 활성화하며, 암호문을 암호화합니다. postfix를 이머지할 때, 올바른 USE 플래그를 통해 cyrus-sasl을 끌어와야 합니다.
암호화한 암호문을 데이터베이스에서 바로 사용하도록 지원하는 젠투 패치는 >cyrus-sasl-2.1.23 에서 사용할 수 없으므로, 각 버전을 사용할 때 net-libs/courier-authlib를 통해 진행합니다.
USE flags for dev-libs/cyrus-sasl The Cyrus SASL (Simple Authentication and Security Layer)
authdaemond
|
Add Courier-IMAP authdaemond unix socket support (net-mail/courier-imap, mail-mta/courier) |
berkdb
|
Add support for sys-libs/db (Berkeley DB for MySQL) |
gdbm
|
Add support for sys-libs/gdbm (GNU database libraries) |
kerberos
|
Add kerberos support |
ldapdb
|
Enable ldapdb plugin |
mysql
|
Add mySQL Database support |
openldap
|
Add ldap support for saslauthd |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
postgres
|
Add support for the postgresql database |
sample
|
Enable sample client and server |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
sqlite
|
Add support for sqlite - embedded sql database |
srp
|
Enable SRP authentication |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
static-libs
|
Build static versions of dynamic libraries as well |
urandom
|
Use /dev/urandom instead of /dev/random |
어떤 데이터베이스를 선택하든지간에 상관 없이 지원 기능을 빌드합니다. 어떤 보안 비슷한 이유로 추가 데이터베이스 코드를 원하지 않으면 데이터베이스 USE 플래그를 설정하지 않고 이머지할 수 있습니다.
데이터베이스 USE 플래그는 cyrus-sasl을 사용하도록 설정하지 않은 상태에서 SQL 기능 지원을 넣고 컴파일할 때, cyrus-sasl에서 계속 오류 기록을 출력하기 때문에, 데이터베이스로 바로 인증하기보다 courier-authlib를 통해 인증한다면 제거해야합니다.
cyrus-sasl과 postfix 설정
postfix는 main.cf 설정에서 sasl을 사용하겠다고 알리는 몇가지 옵션이 필요합니다. 기본 설정 파일에는 없으므로 추가해야합니다.
# Postifx to SASL authentication
broken_sasl_auth_clients = no
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_sasl_authenticated_header
에서는 메일 헤더로 메일을 보낼 때 cyrus로 인증할 사용자 이름을 출력합니다. 공개적으로 저장하는 메일링 리스트에 보낼 메일은 전세계에서 이 헤더를 보게 될테니 특히 위험합니다. 여기서는 시험 목적으로만 활성화합니다.cyrus-sasl 설정
authdaemond 포함
postfix 요청문은 mail
사용자 및 그룹에서 보호하는 authdaemond에서 만들어내므로 postfix에 접근 권한을 부여해야 합니다.
root #
gpasswd -a postfix mail
다음 cyrus-sasl에 authdaemond를 통해 인증하라고 해야 합니다:
pwcheck_method: authdaemond
mech_list: LOGIN PLAIN
sql_select: dummy
authdaemond_path: /var/lib/courier/authdaemon/socket
log_level: 5
postgresql 포함
sasl_pwcheck_method: auxprop
sasl_auxprop_plugin: pgsql
password_format: crypt
mech_list: LOGIN PLAIN
sql_engine: pgsql
#sql_hostnames: localhost
sql_database: postfix
sql_user: postfix
sql_passwd: $password
sql_select: SELECT password FROM mailbox WHERE local_part='%u' AND active='1'
시험
sasl 지원 기능 동작을 검증할 때 AUTH
지시문 동작을 확인하려 텔넷을 활용할 수 있습니다:
user $
telnet foo.example.com 25
220 foo.example.com ESMTP Postfix EHLO example.com 250-foo.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye Connection closed by foreign host.
사용중이던 메일 클라이언트가 제대로 동작하지 않는다면 postfix의 main.cf에 여기 추가 항목 (
250-AUTH=LOGIN PLAIN
) 이 뜨도록 broken_sasl_auth_clients = yes
설정을 사용할 수 있습니다.다음 시험할 부분은 원격 호스트를 활용하여 로그인한 다음 시험 메시지를 보내는 절차입니다.
메일 서버에 생짜 텍스트로 로그인하는 방법이 상당히 불안하(고, 이 안내서의 나머지 부분에서 설명하는 대로 보호할 수 있)지만 일반적입니다. 있는 그대로의 (base64로 인코딩하여 인코딩하기 매우 쉬운) 텍스트 로그인 데이터를 구려터진 거대한 인터넷 망으로 실어보낼 때는 시험 사용자 또는 최소한 시험용 암호만 사용하십시오.
base64 모듈을 펄 언어로 설치했다면 base64 인코딩 데이터를 만들 때 활용할 수 있습니다. 그렇지 않아도 온라인에서 base64 변환 처리가 가능합니다. 다시 한 번 말씀드리지만, 데이터를 신뢰할 수 없는 사이트에 보낼 땐 상당한 주의를 기울이십시오.
user $
perl -MMIME::Base64 -e 'print encode_base64("testuser");'
dGVzdHVzZXI=
user $
telnet foo.example.com 25
Trying 1.2.3.4... Connected to foo.example.com. Escape character is '^]'. 220 foo.example.com ESMTP Postfix HELO example.com 250 foo.example.com AUTH LOGIN 334 VXNlcm5hbWU6 (base64 decode: 'Username:') dGVzdHVzZXI= (base64 encoded from: 'testuser') 334 UGFzc3dvcmQ6 (base64 decode: 'Password:') c2VjcmV0 (base64 encoded from: 'secret') 235 2.7.0 Authentication successful mail from:me@you.com 250 2.1.0 Ok rcpt to:<validuser>@<validexternaldomain>.<tld> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: Test message Test message to ensure Postfix is only relaying with smtp authorization. . 250 2.0.0 Ok: queued as 82F97606 quit 221 2.0.0 Bye Connection closed by foreign host.
마무으리
모든 부분이 잘 동작할 것 같으면, 디버깅 기능을 끌 수 있(거나 설정을 완전히 지워버릴 수 있)습니다:
log_level: 0
게다가 smtpd_sasl_authenticated_header
도 취향에 따라 다시 비활성화할 수 있습니다. 사용자의 메일 처리 문제를 처리할 때 매우 간편한 수단입니다. 하지만 위에서 말씀드린 바와 같이 사용자 이름을 헤더에 기록하는 잠재 보안 문제가 있을 수 있습니다. 그렇지 않으면 로그인 이름을 메일 주소의 local_part에 두거나, 메일 주소 그 자체라면 로그인 이름이 이미 알려져 있으니 큰 문제는 ... 아니겠죠. 그죠? 일부 위험성에 대해서는 이미 이야기 했지만 큰 문제가 되진 않을겁니다.
smtpd_sasl_authenticated_header = no