Complete Virtual Mail Server/SMTP Authentication/ko

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Complete Virtual Mail Server/SMTP Authentication and the translation is 100% complete.

Other languages:
English • ‎русский • ‎한국어

도입부

지금까지는 로컬 호스트만 메일 보내기를 허용했습니다. 아쉽게도 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) local
java Add support for Java global
ldapdb Enable ldapdb plugin local
mysql Add mySQL Database support global
openldap Add ldap support for saslauthd local
sample Enable sample client and server local
sqlite Add support for sqlite - embedded sql database global
srp Enable SRP authentication local
static-libs Build static versions of dynamic libraries as well global
urandom Use /dev/urandom instead of /dev/random local

참고
어떤 데이터베이스를 선택하든지간에 상관 없이 지원 기능을 빌드합니다. 어떤 보안 비슷한 이유로 추가 데이터베이스 코드를 원하지 않으면 데이터베이스 USE 플래그를 설정하지 않고 이머지할 수 있습니다.
데이터베이스 USE 플래그는 cyrus-sasl을 사용하도록 설정하지 않은 상태에서 SQL 기능 지원을 넣고 컴파일할 때, cyrus-sasl에서 계속 오류 기록을 출력하기 때문에, 데이터베이스로 바로 인증하기보다 courier-authlib를 통해 인증한다면 제거해야합니다.

cyrus-sasl과 postfix 설정

postfix는 main.cf 설정에서 sasl을 사용하겠다고 알리는 몇가지 옵션이 필요합니다. 기본 설정 파일에는 없으므로 추가해야합니다.

파일 /etc/postfix/main.cfpostfix에 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를 통해 인증하라고 해야 합니다:

파일 /etc/sasl2/smtpd.confauthdaemond 인증
pwcheck_method: authdaemond
mech_list: LOGIN PLAIN
sql_select: dummy 
authdaemond_path: /var/lib/courier/authdaemon/socket
 
log_level: 5

postgresql 포함

파일 /etc/sasl2/smtpd.conf직접 데이터베이스 인증
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.

마무으리

모든 부분이 잘 동작할 것 같으면, 디버깅 기능을 끌 수 있(거나 설정을 완전히 지워버릴 수 있)습니다:

파일 /etc/sasl2/smtpd.conf디버깅 비활성화
log_level: 0

게다가 smtpd_sasl_authenticated_header도 취향에 따라 다시 비활성화할 수 있습니다. 사용자의 메일 처리 문제를 처리할 때 매우 간편한 수단입니다. 하지만 위에서 말씀드린 바와 같이 사용자 이름을 헤더에 기록하는 잠재 보안 문제가 있을 수 있습니다. 그렇지 않으면 로그인 이름을 메일 주소의 local_part에 두거나, 메일 주소 그 자체라면 로그인 이름이 이미 알려져 있으니 큰 문제는 ... 아니겠죠. 그죠? 일부 위험성에 대해서는 이미 이야기 했지만 큰 문제가 되진 않을겁니다.

파일 /etc/postfix/main.cfpostfix에 sasl 지원 기능 추가
smtpd_sasl_authenticated_header = no