웹사이트 검색

Postfix, Dovecot, MySQL 및 SpamAssassin을 사용하여 메일 서버를 구성하는 방법


소개

이 튜토리얼에서는 Ubuntu 12.04에서 Postfix, Dovecot, MySQL 및 SpamAssassin을 사용하여 메일 서버를 구성할 것입니다.

이 자습서를 따르면 가상 도메인, 사용자 및 별칭을 추가할 수 있습니다. 또한 가상 서버는 스팸 허브로부터 안전합니다.

전제 조건

메일 서버를 설정하기 전에 필요한 VPS에는 다음이 있습니다.

선택사항: SSL 인증서(무료로 서명된 SSL 인증서 설정)

선택 사항(루트 사용자로 로그인)

루트 사용자로 패키지를 설치하면 모든 권한이 있으므로 유용합니다.

sudo -i

사용자 비밀번호를 입력하십시오. 성공하면 $ 기호가 #로 변경되는 것을 볼 수 있습니다.

1단계: 패키지 설치

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

Postfix 구성이 프롬프트되면 인터넷 사이트를 선택하십시오.



Postfix 구성은 시스템 메일 이름에 대해 묻습니다. FDQN 또는 기본 도메인을 사용할 수 있습니다.



2단계: MySQL 데이터베이스, 가상 도메인, 사용자 및 별칭 생성

설치가 완료되면 MySQL 데이터베이스를 생성하여 3개의 서로 다른 테이블(도메인용 테이블, 사용자용 테이블, 별칭용 테이블)을 구성합니다.

데이터베이스 이름을 servermail로 지정하지만 원하는 이름을 사용할 수 있습니다.

서버메일 데이터베이스를 생성합니다:

mysqladmin -p create servermail

MySQL 루트 사용자로 로그인

mysql -u root -p

MySQL 루트 비밀번호를 입력하십시오. 성공하면 다음이 표시됩니다.

mysql >

먼저 메일 인증에 특정한 새 사용자를 생성해야 하며 SELECT 권한을 부여할 것입니다.

mysql > GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';

그런 다음 해당 권한이 성공적으로 적용되도록 MySQL 권한을 다시 로드해야 합니다.

mysql > FLUSH PRIVILEGES;

마지막으로 데이터베이스를 사용하여 테이블을 생성하고 데이터를 도입해야 합니다.

mysql> USE servermail;

승인된 도메인으로 인식되는 특정 도메인에 대한 테이블을 생성할 것입니다.


CREATE TABLE `virtual_domains` (
`id`  INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

사용자를 소개하는 테이블을 만들 예정입니다. 여기에 이메일 주소와 비밀번호를 추가합니다. 각 사용자를 도메인과 연결해야 합니다.

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

마지막으로 가상 별칭 테이블을 생성하여 다른 이메일로 전달할 모든 이메일을 지정합니다.


CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

세 개의 테이블을 성공적으로 만들었습니다. 이제 데이터를 소개하겠습니다.

가상 도메인

여기에서는 virtual_domains 테이블 내부의 도메인을 소개합니다. 원하는 모든 도메인을 추가할 수 있지만 이 자습서에서는 기본 도메인(example.com)과 FQDN(hostname.example.com)만 소개합니다.


INSERT INTO `servermail`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'hostname.example.com');

가상 이메일

각 도메인에 연결된 이메일 주소와 비밀번호를 소개합니다. 특정 정보로 모든 정보를 변경했는지 확인하십시오.


INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');

가상 별칭

다른 이메일 주소(목적지)로 전달할 이메일 주소(출처)를 소개하겠습니다.


INSERT INTO `servermail`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@example.com', 'email1@example.com');

MySQL 종료

 mysql > exit

3단계: Postfix 구성

SMTP 연결을 처리하고 MySQL 데이터베이스에 도입된 각 사용자에게 메시지를 보내도록 Postfix를 구성할 것입니다.

먼저 기본 구성으로 되돌리려는 경우를 대비하여 기본 파일의 복사본을 만들어야 합니다.

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

main.cf 파일을 열어 수정합니다.

nano /etc/postfix/main.cf

먼저 TLS 매개변수에 주석을 달고 다른 매개변수를 추가해야 합니다. 이 자습서에서는 무료 SSL 인증서와 자습서(링크)에서 제안하는 경로를 사용하지만 개인 구성에 따라 수정할 수 있습니다.


# TLS parameters
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_use_tls=yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes

그런 다음 이전 단계에서 변경한 TLS 설정 아래에 다음 매개변수를 추가합니다.


smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination

mydestination 기본 설정을 주석 처리하고 localhost로 교체해야 합니다. 이 변경으로 VPS는 MySQL 테이블 내부의 가상 도메인을 사용할 수 있습니다.


#mydestination = example.com, hostname.example.com, localhost.example.com, localhost
mydestination = localhost 

FQDN으로 myhostname 매개변수가 설정되었는지 확인하십시오.


myhostname = hostname.example.com

MySQL 테이블 내부에 나열된 모든 가상 도메인에 대한 로컬 메일 배달을 위해 다음 줄을 추가합니다.

virtual_transport = lmtp:unix:private/dovecot-lmtp

마지막으로 이 세 가지 매개변수를 추가하여 가상 도메인, 사용자 및 별칭을 구성하도록 Postfix에 지시해야 합니다.


virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.

https://www.dropbox.com/s/x9fpm9v1dr86gkw/etc-postfix-main.cf.txt

Postfix에 MySQL과 연결하는 방법을 알리기 위해 main.cf 파일에 추가하는 마지막 세 개의 파일을 만들 것입니다.

먼저 mysql-virtual-mailbox-domains.cf 파일을 만들어야 합니다. 개인 구성에 따라 값을 변경해야 합니다.


nano /etc/postfix/mysql-virtual-mailbox-domains.cf
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

그런 다음 Postfix를 다시 시작해야 합니다.


service postfix restart

Postfix가 도메인을 찾는지 확인해야 하므로 다음 명령으로 테스트해야 합니다. 성공하면 1을 반환해야 합니다.


postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

그런 다음 mysql-virtual-mailbox-maps.cf 파일을 만들어야 합니다.


nano /etc/postfix/mysql-virtual-mailbox-maps.cf 
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

Postfix를 다시 시작해야 합니다.

service postfix restart

이 시점에서 우리는 Postfix가 다음 명령을 사용하여 첫 번째 이메일 주소를 찾도록 할 것입니다. 성공하면 1을 반환해야 합니다.

postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

마지막으로 Postfix와 MySQL 간의 연결을 구성하기 위한 마지막 파일을 생성할 것입니다.


nano /etc/postfix/mysql-virtual-alias-maps.cf
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

접미사 다시 시작

service postfix restart

Postfix가 귀하의 별칭을 찾을 수 있는지 확인해야 합니다. 다음 명령을 입력하면 별칭으로 전달된 메일이 반환됩니다.

postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

이메일 클라이언트와 안전하게 연결하기 위해 포트 587을 활성화하려면 /etc/postfix/master.cf 파일을 수정해야 합니다.


nano /etc/postfix/master.cf

이 줄의 주석을 제거하고 다른 매개변수를 추가해야 합니다.


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

경우에 따라 포트 587이 열려 있는지 확인하기 위해 Postfix를 다시 시작해야 합니다.

service postfix restart

참고: 이 도구를 사용하여 도메인 포트를 스캔하고 포트 25 및 587이 열려 있는지 확인할 수 있습니다(http://mxtoolbox.com/SuperTool.aspx).

4단계: Dovecot 구성

수정하려는 7개의 파일을 복사하여 필요한 경우 기본값으로 되돌릴 수 있습니다. 다음 명령을 하나씩 입력합니다.


cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig

Dovecot에서 구성 파일을 편집합니다.

nano /etc/dovecot/dovecot.conf

이 옵션의 주석이 제거되었는지 확인하십시오.

!include conf.d/*.conf

!include_try /usr/share/dovecot/protocols.d/*.protocol 줄 아래에서 프로토콜을 활성화할 것입니다(원하는 경우 pop3 추가).


!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.


https://www.dropbox.com/s/wmbe3bwy0vcficj/etc-dovecot-dovecot.conf.txt

그런 다음 메일 구성 파일을 편집합니다.

nano /etc/dovecot/conf.d/10-mail.conf

mail_location 줄을 찾아 주석 처리를 해제하고 다음 매개변수를 입력합니다.

mail_location = maildir:/var/mail/vhosts/%d/%n

mail_privileged_group 줄을 찾아 주석 처리를 제거하고 다음과 같이 메일 매개변수를 추가합니다.

mail_privileged_group = mail

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.


https://www.dropbox.com/s/hnfeieuy77m5b0a/etc.dovecot.conf.d-10-mail.conf.txt

권한 확인

다음 명령을 입력하십시오.


ls -ld /var/mail

권한이 다음과 같은지 확인하십시오.

drwxrwsr-x 3 root vmail 4096 Jan 24 21:23 /var/mail

MySQL 테이블에 등록한 각 도메인에 대한 폴더를 만들 것입니다.

mkdir -p /var/mail/vhosts/example.com

ID가 5000인 vmail 사용자 및 그룹 만들기


groupadd -g 5000 vmail 
useradd -g vmail -u 5000 vmail -d /var/mail

/var/mail 폴더의 소유자를 vmail 사용자로 변경해야 합니다.

chown -R vmail:vmail /var/mail

그런 다음 /etc/dovecot/conf.d/10-auth.conf 파일을 편집해야 합니다.

nano /etc/dovecot/conf.d/10-auth.conf

일반 텍스트 인증의 주석을 제거하고 다음 행을 추가하십시오.

disable_plaintext_auth = yes

auth_mechanisms 매개변수 수정:

auth_mechanisms = plain login

이 줄을 주석 처리하십시오.

#!include auth-system.conf.ext

다음 줄의 주석을 제거하여 MySQL 인증을 활성화합니다.

!include auth-sql.conf.ext

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.

https://www.dropbox.com/s/4h472nqrj700pqk/etc.dovecot.conf.d.10-auth.conf.txt

인증을 위해 귀하의 정보로 /etc/dovecot/dovecot-sql.conf.ext 파일을 생성해야 합니다.

nano /etc/dovecot/conf.d/auth-sql.conf.ext

파일에 다음 코드를 입력합니다.


passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
} 

사용자 지정 MySQL 정보로 /etc/dovecot/dovecot-sql.conf.ext 파일을 수정해야 합니다.

nano /etc/dovecot/dovecot-sql.conf.ext

드라이버 매개변수의 주석을 제거하고 mysql을 매개변수로 설정합니다.

driver = mysql

연결 라인의 주석을 제거하고 MySQL 특정 정보를 입력합니다.

connect = host=127.0.0.1 dbname=servermail user=usermail password=mailpassword

default_pass_scheme 줄의 주석을 제거하고 SHA-512로 변경합니다.

default_pass_scheme = SHA512-CRYPT

password_query 줄의 주석을 해제하고 다음 정보를 추가합니다.

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.

https://www.dropbox.com/s/48a5r0mtgdz25cz/etc.dovecot.dovecot-sql.conf.ext.txt

dovecot 폴더의 소유자와 그룹을 vmail 사용자로 변경합니다.


chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot 

/etc/dovecot/conf.d/10-master.conf 파일을 열고 수정합니다(다른 매개변수가 변경될 수 있으므로 주의하십시오).


nano /etc/dovecot/conf.d/10-master.conf

##Uncomment inet_listener_imap and modify to port 0
service imap-login {
  inet_listener imap {
    port = 0
}

#Create LMTP socket and this configurations
service lmtp {
   unix_listener /var/spool/postfix/private/dovecot-lmtp {
	   mode = 0600
	   user = postfix
	   group = postfix
   }
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
} 

다음과 같이 unix_listener 매개변수를 service_auth로 수정합니다.


service auth {

  unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
  }

  unix_listener auth-userdb {
  mode = 0600
  user = vmail
  #group =
  }

  #unix_listener /var/spool/postfix/private/auth {
  # mode = 0666
  #}

  user = dovecot
}

다음과 같이 service au-worker를 수정합니다.


service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = vmail
}

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.

https://www.dropbox.com/s/g0vnt233obh6v2h/etc.dovecot.conf.d.10-master.conf.txt

마지막으로 Dovecot에서 SSL 구성 파일을 수정합니다(기본 구성을 사용하려는 경우 이 단계 건너뛰기).

# nano /etc/dovecot/conf.d/10-ssl.conf

ssl 매개변수를 필수로 변경합니다.

ssl = required

그리고 ssl_certssl_key의 경로를 수정합니다.

ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem

Dovecot 다시 시작

service dovecot restart

포트 993이 열려 있고 작동하는지 확인해야 합니다(pop3를 활성화한 경우 포트 995도 확인해야 함).

telnet example.com 993

축하합니다. 메일 서버를 성공적으로 구성했으며 이메일 클라이언트를 사용하여 계정을 테스트할 수 있습니다.

- Username: email1@example.com
- Password: email1's password
- IMAP: example.com
- SMTP: example.com

참고: 보안 IMAP에는 포트 993을 사용하고 SMTP에는 포트 587 또는 25를 사용하십시오.

5단계: SpamAssassin 구성

먼저 SpamAssassin을 설치해야 합니다.

apt-get install spamassassin spamc

그런 다음 SpamAssassin에 대한 사용자를 생성해야 합니다.

adduser spamd --disabled-login

SpamAssassin을 성공적으로 구성하려면 구성 설정을 열고 수정해야 합니다.

nano /etc/default/spamassassin

SpamAssassin 데몬을 활성화하려면 ENABLED 매개변수를 변경해야 합니다.

ENABLED=1

홈 및 옵션 매개변수를 구성해야 합니다.


SPAMD_HOME="/home/spamd/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log" 

그런 다음 다음과 같이 PID_File 매개변수를 지정해야 합니다.

PIDFILE="${SPAMD_HOME}spamd.pid"

마지막으로 SpamAssassins 규칙이 자동으로 업데이트되도록 지정해야 합니다.

CRON=1

참고: 이러한 변경 사항을 이 파일과 비교하여 실수나 오류를 감지합니다.

https://www.dropbox.com/s/ndvpgc2jipdd4bk/etc.default.spamassassin.txt

스팸 방지 규칙을 설정하려면 /etc/spamassassin/local.cf를 열어야 합니다.

nano /etc/spamassassin/local.cf

SpamAssassin은 각 메일에 점수를 매기고 스팸 검사에서 이 이메일이 5.0보다 큰 것으로 판단되면 자동으로 스팸으로 간주됩니다. 다음 매개 변수를 사용하여 스팸 방지 규칙을 구성할 수 있습니다.


rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe             0
required_score          5.0
use_bayes               1
use_bayes_rules         1
bayes_auto_learn        1
skip_rbl_checks         0
use_razor2              0
use_dcc                 0
use_pyzor               0

Postfix /etc/postfix/master.cf 파일을 변경하여 SpamAssassin으로 각 이메일을 확인하도록 해야 합니다.

nano /etc/postfix/master.cf

그런 다음 다음 줄을 찾아 spamassassin 필터를 추가해야 합니다.


smtp      inet  n       -       -       -       -       smtpd
-o content_filter=spamassassin

마지막으로 다음 매개변수를 추가해야 합니다.


spamassassin unix -     n       n       -       -       pipe
user=spamd argv=/usr/bin/spamc -f -e  
/usr/sbin/sendmail -oi -f ${sender} ${recipient}

이메일에서 스팸 확인을 시작하려면 SpamAssassin을 시작하고 Postfix를 다시 시작해야 합니다.


service spamassassin start
service postfix restart

축하합니다! MySQL 인증을 사용하는 Postfix 및 Dovecot과 SpamAssassin을 사용하는 스팸 필터링으로 메일 서버를 성공적으로 설정했습니다!