메일서버 구축테스트

로그띵Logthink·2022년 6월 1일
0

메일서버 구조

메일서버 구축방법 (SMTP/IMAP/POP3/LDBMS/WebMailer)

*오픈소스 라이센스 확인

오픈소스 라이센스 확인

roundcube - GNU General Public License
postfix - IBM Public License 1.0 (IPL-1.0)
dovecot - NonCommercial-ShareAlike 4.0 International License.
MariaDB - GPL license, 버전 2
Apache - Apache License 2.0

*오픈소스 솔루션 버전 확인

설치버전 확인

roundcube - 1.4.8
postfix - 2.10.1
dovecot - 2.2.36
MariaDB - 5.5.68-MariaDB, for Linux (x86_64)
Apache - Apache/2.4.6 (httpd-2.4.6-97.0.1.e17_9.x86_64

1/5. 개요(Overview)
메일을 전달만 하는 게 아닌 상용 메일 솔루션처럼 웹 인터페이스를 통해 메일을 주고받고 할 수 있는 메일서버를 만들어보도록 하겠습니다.

모든 오픈 소스를 동원해 하나의 메일서버처럼 작동을 해야 하므로 매우 복잡한 세팅 과정을 거쳐야 합니다.

최대한 순차적으로 풀어서 이해할 수 있도록 진행하도록 하겠습니다.

  • CentOS 7 버전과 CentOS 8 버전 모두 메일서비스가 정상으로 동작하는 것을 확인했으며, 아래는 CentOS 7 버전으로 가이드 합니다.

  • 웹서버는 Apache가 아니더라도 상관없습니다. (nginx와 같은 다른 플랫폼을 사용한다면, 메일서버에서 웹서버를 엑세스 할 수 있도록 파일 소유자 변경(apache→nginx)등의 설정이 추가로 필요합니다. 왜냐하면 apache가 기본적으로 설치된 경우 퍼미션 에러를 만나게 되더라구요.)

2/5. 기초작업(initialize)
나중에 운영이슈를 막기위해 반드시 초기에 패키지 관리자는 업데이트를 진행합시다.
[root@logthink ~]# yum update
Iptables 방화벽설정

[root@logthink ~]# systemctl stop firewalld //firewalld 중지
[root@logthink ~]# systemctl mask firewalld //firewalld 자동시작 중지
[root@logthink ~]# dnf install -y iptables-services //iptables 서비스 관련 패키지 설치
[root@logthink ~]# systemctl enable iptables //iptables 자동 시작
[root@logthink ~]# systemctl start iptables //iptables 시작

[root@logthink ~]# iptables -nL //적용 확인
[root@logthink ~]# /etc/sysconfig/iptables //설정 기본경로

[root@logthink ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config //비활성화 설정
[root@logthink ~]# cat /etc/selinux/config | grep disabled //변경확인 명령어

//결과 'SELINUX=disabled' 가 나와야함.
[root@logthink ~]# hostnamectl set-hostname mail.demologthink.com //호스트 선언
[root@logthink ~]# hostname //적용확인 명령어
[root@logthink ~]# reboot //설정 반영

3/5. 솔루션 세팅 - Postfix, Apache, PHP, MariaDB
나중에 운영이슈를 막기위해 반드시 초기에 패키지 관리자는 업데이트를 진행합시다.
[root@logthink ~]# yum install httpd postfix postfix-mysql policycoreutils-python-utils epel-release

PHP 설치 (7.4.X 버전 설치를 위해 Remi 저장소 이용)
*PHP5버전은 의존성에러 발생하니 7버전으로 정상화하자
[root@logthink ~]# yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
[root@logthink ~]# module enable php:remi-7.4
[root@logthink ~]# yum install php
[root@logthink ~]# yum install php-common php-json php-xml php-mbstring php-mysqlnd
MariaDB 설치 및 구성
[root@logthink ~]# yum install MariaDB-server MariaDB-client //설치
[root@logthink ~]# systemctl start mariadb //DB 구동
[root@logthink ~]# systemctl enable mariadb //부팅 자동 실행
[root@logthink ~]# mysql_secure_installation //DB세팅 (패스워드 왜 다 'Y'입력하자)
[root@logthink ~]# mysql -uroot -p //DB 접속

웹메일 사용을 위한 DB 스키마 구성
□Postfix 계정을 저장할 데이터베이스 생성
MariaDB [(none)]> create database postfix_accounts;

□방금 생성한 데이터베이스에 접근할 전체 권한 계정을 생성
예시) grant all on 데이터베이스 이름.* to '유저 ID'@'localhost' identified by '패스워드';

MariaDB [(none)]> grant all on postfix_accounts.* to demologthink_admin@localhost identified by 'test123';

MariaDB [(none)]> flush privileges; (바로 적용)

□서버에 도메인을 저장할 테이블 만들기(전체 한 줄)
MariaDB [(none)]> CREATE TABLE postfix_accounts.domains_table ( DomainId INT NOT NULL AUTO_INCREMENT , DomainName VARCHAR(50) NOT NULL , PRIMARY KEY (DomainId)) ENGINE = InnoDB;

□사용자 계정을 보관할 테이블 만들기(전체 한 줄)
MariaDB [(none)]> CREATE TABLE postfix_accounts.accounts_table (
AccountId INT NOT NULL AUTO_INCREMENT,
DomainId INT NOT NULL,
password VARCHAR(300) NOT NULL,
Email VARCHAR(100) NOT NULL,
PRIMARY KEY (AccountId),
UNIQUE KEY Email (Email),
FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

□별칭 사용자 계정을 보관할 테이블 만들기(전체 한 줄)
별칭은 일종의 리다이렉션처럼 A계정이 수신을 받으면 B계정으로 받는 기능

MariaDB [(none)]> CREATE TABLE postfix_accounts.alias_table (
AliasId INT NOT NULL AUTO_INCREMENT,
DomainId INT NOT NULL,
Source varchar(100) NOT NULL,
Destination varchar(100) NOT NULL,
PRIMARY KEY (AliasId),
FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

이제 만든 테이블에 사용할 도메인 및 계정 정보 레코드 입력(각 한 줄씩 명령어)

□demologthink.com 도메인 등록
MariaDB [(none)]> INSERT INTO postfix_accounts.domains_table (DomainName) VALUES ('demologthink.com');

□test1@demologthink.com 계정 생성
MariaDB [(none)]> INSERT INTO postfix_accounts.accounts_table (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('66', SUBSTRING(SHA(RAND()), -16))), 'test1@demologthink.com');

□test2@demologthink.com 계정 생성
MariaDB [(none)]> INSERT INTO postfix_accounts.accounts_table (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('66', SUBSTRING(SHA(RAND()), -16))), 'test2@demologthink.com');

□testfc@demologthink.com ▷ testsc@demologthink.com 별칭 계정 생성
MariaDB [(none)]> INSERT INTO postfix_accounts.alias_table (DomainId, Source, Destination) VALUES (1, 'testfc@demologthink.com', 'testsc@demologthink.com');

□나중에 설치할 RoundCube 데이터베이스 미리 생성하기
MariaDB [none]> create database roundcube;

□동일하게 데이터베이스에 접근할 전체 권한 계정을 생성
MariaDB [none]> grant all on roundcube.* to roundcube_admin@localhost identified by 'test123';
MariaDB [none]> flush privileges; (바로 적용)
MariaDB [none]> quit (끝)

Postfix 구성(1)
*master.cf 파일
[root@logthink ~]# vi /etc/postfix/master.cf
17 submission inet n - n - - smtpd
18 -o syslog_name=postfix/submission
20 -o smtpd_sasl_auth_enable=yes
22 -o smtpd_reject_unlisted_recipient=no
27 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
28 -o milter_macro_daemon_name=ORIGINATING
134 dovecot unix - n n - - pipe
135 flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

[root@logthink ~]# vi /etc/postfix/database-domains.cf.cf
user = demologthink_admin
password = test123
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT 1 FROM domains_table WHERE DomainName='%s'

[root@logthink ~]# chmod 640 /etc/postfix/database-domains.cf
[root@logthink ~]# chmod 640 /etc/postfix/database-users.cf
[root@logthink ~]# chmod 640 /etc/postfix/database-alias.cf

[root@logthink ~]# chown root:postfix /etc/postfix/database-domains.cf
[root@logthink ~]# chown root:postfix /etc/postfix/database-users.cf
[root@logthink ~]# chown root:postfix /etc/postfix/database-alias.cf

[root@logthink ~]# systemctl restart postfix

[root@logthink ~]# vi /etc/postfix/main.cf
96 myhostname = mail.demologthink.com
104 mydomain = demologthink.com
120 myorigin = mydomain 137 inet_interfaces = all 140 inet_protocols = all 185 mydestination = $myhostname, localhost.mydomain, localhost
273 smtpd_recipient_restrictions = permit_mynetworks
440 home_mailbox = Maildir/
712 #smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem (SSL인증서 Cert 파일, 지금은 사용안함으로 주석처리)
718 #smtpd_tls_key_file = /etc/pki/tls/private/postfix.key (SSL인증서 Key 파일, 지금은 사용안함으로 주석처리)
723 smtpd_tls_security_level = may
739 smtp_tls_security_level = may

//데이터베이스에 저장 한 계정 대한 Postfix 액세스 권한 부여
755 virtual_mailbox_domains = mysql:/etc/postfix/database-domains.cf
756 virtual_mailbox_maps = mysql:/etc/postfix/database-users.cf
757 virtual_alias_maps = mysql:/etc/postfix/database-alias.cf

  • /etc/postfix/database-users.cf 파일
    [root@logthink ~]# vi /etc/postfix/database-users.cf
    user = demologthink_admin
    password = test123
    hosts = 127.0.0.1
    dbname = postfix_accounts
    query = SELECT 1 FROM accounts_table WHERE Email='%s'

  • /etc/postfix/database-alias.cf 파일
    [root@logthink ~]# vi /etc/postfix/database-alias.cf
    user = demologthink_admin
    password = test123
    hosts = 127.0.0.1
    dbname = postfix_accounts
    query = SELECT Destination FROM alias_table WHERE Source='%s'

*설정 테스트
[root@logthink ~]# postmap -q demologthink.com mysql:/etc/postfix/database-domains.cf
1
[root@logthink ~]# postmap -q test1@demologthink.com mysql:/etc/postfix/database-users.cf
1
[root@logthink ~]# postmap -q test2@demologthink.com mysql:/etc/postfix/database-users.cf
1
[root@logthink ~]# postmap -q testfc@demologthink.com mysql:/etc/postfix/database-alias.cf

testsc@demologthink.com
※ 응답 값이 숫자 1이 나오거나 끝에는 별칭(리다이렉트) 계정이 표시되면 정상

4/5. 솔루션 세팅 - Dovecot , RoundCube
Dovecot 구성(1)
[root@logthink ~]# yum install dovecot dovecot-mysql
[root@logthink ~]# groupadd -g 6000 vmail
[root@logthink ~]# useradd -g vmail -u 6000 vmail -d /home/vmail -m

[root@logthink ~]# vi /etc/dovecot/dovecot.conf
24 protocols = imap pop3 lmtp
30 listen = , ::
98 !include conf.d/
.conf
102 !include_try local.conf
104 log_path = /var/log/dovecot.log

[root@logthink ~]# chown vmail:dovecot /var/log/dovecot.log
[root@logthink ~]# chown vmail:dovecot /var/run/dovecot/stats-writer

  • 10-auth.conf 설정파일
    [root@logthink ~]# vi /etc/dovecot/conf.d/10-auth.conf
    10 disable_plaintext_auth = yes
    100 auth_mechanisms = plain login
    123 !include auth-sql.conf.ext

  • auth-sql.conf.ext 설정파일
    [root@logthink ~]# vi /etc/dovecot/conf.d/auth-sql.conf.ext
    5 passdb {
    6 driver = sql
    9 args = /etc/dovecot/dovecot-sql.conf.ext
    10 }

     27 userdb {
     28   driver = static
     29   args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
     30 }
     
  • master.conf 설정파일
    [root@logthink ~]# vi /etc/dovecot/conf.d/auth-sql.conf.ext
    17 service imap-login {
    18 inet_listener imap {
    19 port = 143
    20 }
    21 inet_listener imaps {
    24 }
    36 }

    38 service pop3-login {
    39 inet_listener pop3 {
    40 port = 110
    41 }
    42 inet_listener pop3s {
    45 }

    54 service lmtp {
    55 unix_listener /var/spool/postfix/private/dovecot-lmtp {
    56 mode = 0666
    57 user = postfix
    58 group = postfix
    59 }
    67 }

    88 service auth {
    102 unix_listener /var/spool/postfix/private/auth {
    103 mode = 0666
    104 user = postfix
    105 group = postfix
    106 }
    107 unix_listener auth-userdb {
    108 mode = 0600
    109 user = vmail
    110 }
    111 user = dovecot
    120 }
    122 service auth-worker {
    126 user = vmail
    127
    129 service dict {
    132 unix_listener dict {
    136 }
    137 }

  • 별도로 /home/vmail 경로에 이메일을 저장하기 위해 다음과 같은 변수를 이용

%u – 사용자 이름
%n – user@domain의 사용자 부분 , 도메인이 없는 경우 % u와 동일
%d – user@domain의 도메인 부분 , 도메인이 없으면 비어 있음
%h – 홈 디렉토리

  • 메일 사서함(홈디렉터리)에 대한 DB 세부정보 추가
    [root@logthink ~]# mkdir /home/vmail/demologthink.com
    [root@logthink ~]# vi /etc/dovecot/dovecot-sql.conf.ext
    driver = mysql
    connect = "host=127.0.0.1 dbname=postfix_accounts user=demologthink_admin password=test123"
    default_pass_scheme = SHA512-CRYPT
    password_query = SELECT Email as User, password FROM accounts_table WHERE Email='%u';
  • 메일 사서함 및 네임스페이스 index 사용 설정
    [root@logthink ~]# vi /etc/dovecot/conf.d/10-mail.conf
    30 mail_location = maildir:/home/vmail/%d/%n/Maildir
    42 namespace inbox {
    61 inbox = yes
    80 }
    114 mail_privileged_group = mail
    325 mbox_write_locks = fcntl

  • SSL 일단 예외처리
    [root@logthink ~]# vi /etc/dovecot/conf.d/10-ssl.conf
    □[사용 안 함]
    8 ssl = no
    14 #ssl_cert = </etc/pki/dovecot/certs/dovecot.pem (주석 처리)
    15 #ssl_key = </etc/pki/dovecot/private/dovecot.pem (주석 처리)

□[사용할 경우]
8 ssl = required
14 ssl_cert = </etc/pki/dovecot/certs/dovecot.pem (인증서 CRT 경로)
15 ssl_key = </etc/pki/dovecot/private/dovecot.pem (인증서 KEY 경로)

  • vmail 권한 설정
    [root@logthink ~]# chown -R vmail:vmail /home/vmail
    [root@logthink ~]# ls -al /home/vmail | grep demologthink

[root@logthink ~]# chown -R vmail:dovecot /etc/dovecot
[root@logthink ~]# chmod -R o-rwx /etc/dovecot
[root@logthink ~]# ls -al /etc | grep dovecot

  • Dovecot 서비스 실행
    [root@logthink ~]# systemctl restart dovecot

RoundCube 구성(1)

*솔루션 설치 후 설(serving)빙 시작
[root@logthink ~]# wget https://github.com/roundcube/roundcubemail/
releases/download/1.4.11/roundcubemail-1.4.11-complete.tar.gz
[root@logthink ~]# tar xvzf roundcubemail-1.4.11-complete.tar.gz
[root@logthink ~]# mv roundcubemail-1.4.11 roundcube
[root@logthink ~]# mv roundcube /var/www/html/
[root@logthink ~]# chown -R apache:apache /var/www/html/
[root@logthink ~]# systemctl restart httpd

*방화벽 설정
[root@logthink ~]# vi /etc/sysconfig/iptables

WEB ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

MAIL ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
[root@logthink ~]# systemctl restart iptables

RoundCube 구성(2)

(1) 웹 브라우저에서 접속 - http://서버IP/roundcube/installer/

(2) 하단의 Next 클릭

(3) [CREATE CONFIG] 설정에서 [Database setup] 부분만 세팅 후에 다음 진행

MySQL
localhost
roundcube
roundcube_admin
test123

(4) [CREATE CONFIG] 버튼 클릭

(5) 구성 설정 메시지 성공 확인 후 바로 [CONTINUE] 클릭

(6) 데이터베이스 초기화 [Initialize Database] 버튼 클릭후 [Test config] 설정 마무리
*이때 Check DB Config가 전부 'OK' 인지 확인

[root@logthink ~]# vi /var/www/html/roundcube/config/config.inc.php
36 $config['default_host'] = 'localhost';
40 $config['support_url'] = '';
52 $config['plugins'] = array('virtuser_query');
53 $config['virtuser_query'] = "SELECT Email FROM postfix_accounts.accounts_table WHERE Email = '%u'";
54 $config['defautl_port'] = 143;
55 $config['smtp_server'] = 'localhost';
56 $config['smtp_port'] = 587;
57 $config['smtp_user'] = '%u';
58 $config['smtp_pass'] = '%p';
59 $config['smtp_auth_type'] = 'LOGIN';
60 $config['debug_level'] = 1;
61 $config['smtp_debug'] = true;

RoundCube 구성(3) - 최종 메일테스트 진행

웹 브라우저에서 접속 (http://서버IP/roundcube/ ) 후 로그인

→ 지금 부터 메일 서버를 이용하면 된다.

5/5. 메일서버 운영
→ 다만, 대형 외부포털 메일서버에 전송 시 스팸분류가 된다면 참조하길 바랍니다.
( http://confluence.dnco.corp/pages/viewpage.action?pageId=131670042 )

보안설정 적용
*수신이 차단되기 때문에 신뢰되지 않은 SMTP 서버에 도용될 순 없으나, 계정 유무와 관련없이 내부 권한있는 사용자에게 악용될 리스크 존재.

메일캐리어 보안 설정
윈도우 서버 방화벽 설정
릴레이 제한
복잡한 암호 사용 정책
계정 잠금 정책으로 암호 매칭 공격 차단
인트라넷 정의를 통한 인증 제한
발송 큐 모니터링을 통한 메일 서버 보호
암호 세팅 (sendmail 을 통한 건 audit 못함)
발송메일 큐 모니터링 (TBD - ELK 도입)
발송 큐 길이제한 (TBD)
릴레이 서버 줄이기 (None)

메일발송 테스트

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase from email import encoders
 
def send_auth_test(email, password):
     msg = MIMEMultipart()
     msg['From'] = email
     msg['To'] = password
     msg['Subject'] = 'send test - hello'
     body = "TTTT"
     msg.attach(MIMEText(body, 'plain'))
     s=smtplib.SMTP('192.168.5.76', 587)
     s.login(email, password)
     text=msg.as_string()
     s.sendmail(email, password, text)
     s.quit()
 
def send_attach(fromaddr, toaddr, smtpServer):
     msg = MIMEMultipart()
     msg['From'] = fromaddr
     msg['To'] = toaddr
     msg['Subject'] = 'send test - hello'
     body = "TTTT"
     msg.attach(MIMEText(body, 'plain'))
     filename='test.txt'
     attachment = open("test.txt", "rb")
     p = MIMEBase('application', 'octet-stream')
     p.set_payload((attachment).read())
     encoders.encode_base64(p)
     p.add_header('Content-Disposition', 'attachment; filename= %s' %
filename)
     msg.attach(p)
     s=smtplib.SMTP(smtpServer, 25)
     text=msg.as_string()
     s.sendmail(fromaddr, toaddr, text)
     s.quit()
 
def send_simple_text(fromaddr, toaddr, smtpServer):
     msg = MIMEMultipart()
     msg['From'] = fromaddr
     msg['To'] = toaddr
     msg['Subject'] = 'send test - hello'
     text='aaaaaaaaaaaaaaaaaa'
     s = smtplib.SMTP(smtpServer, 25)
     s.ehlo()
     #s.starttls()
     s.sendmail(fromaddr, toaddr, text)
     s.quit()
 
if __name__=="__main__":
     fromaddr = 'logthink@logthink.kr'
     toaddr = 'logthink@logthink.com'
     smtpServer = '192.168.5.76'
     send_attach(fromaddr, toaddr, smtpServer)
     #send_simple_text(fromaddr, toaddr, smtpServer

메일발송 실패확인 가이드

  1. 리턴 메일 보는 방법
  2. NDR(Non-Delivery Reports) 코드표

스팸메일 트러블슈팅

  1. 서론.
    메일서버를 자체적으로 구현한 이후에 발송테스트를 진행했습니다.
    허나, 어째서인지 스팸으로 분류 되거나 전송이 되지 않게되자 리서칭을 진행하게 되었습니다.
    아래 조건을 모두 만족하더라도 스팸으로 무조건 분류되지 않는건 아니지만, 아래 내용을 만족하여 스팸서버로 분류되는 것을 어느정도 예방하기 위한 활동을 해야한다.
    ※ 스팸으로 분류되지 않기 위해서는 최대한 할 수 있는 모든 방법을 동원하는 것이 좋다. 그렇게 해도 스팸으로 빠진다. 따라서 확률을 낮추는데 집중해야 한다.

메일서버 IP차단이 의심되는 대표적 로그 사례
가. 4.3.2 Your ip blocked from this server. Contact to abuse@naver.com or http:/(421)
나. 4.3.2 Your ip blocked from this server(421)
다. 4.4.5 CCRC 123.123.12.123: Connection refused. Server is busy(RC)(421)
라. 5.7.1 DZCNT 123.123.12.123: Message refused. Your domain has sent too many mails:mymailer.co.kr If you need, please contact stamp@daumcorp.com.(554)
마. sorry, your IP is blacklisted.(544)

  1. 국내 메일서비스나 기업으로 대량메일을 발송하기 위해서
    1~8 까지의 도메인설정이 되어 있어야 안정적인 발송이 가능합니다.
    ※ 기본적으로 (1) SSL인증서 적용 (2) 화이트도메인 등록 (3) Ptr(리버스 도메인)등록 (4) DKIM 설정은 기본인것 같습니다.

SPF (Sender Policy Framework)등록 설정완료

  • 개요: SPF 레코드는 도메인을 대표하여 이메일을 보낼 수 있는 메일 서버를 식별하는 DNS(Domain Name Service) 레코드의 한 유형입니다
    쉽게말해, 이메일 발신자가 정말 자기 자신이 맞는지, 즉 위조되지 않았는지 검증하기 위해 널리 사용되는 방법입니다.
  • 목적: 스팸 발송자가 도메인의 위조된 '보낸사람' 주소를 사용하여 메일을 보내지 못하도록 하는 것입니다. 수신자는 SPF 레코드를 참조하여 자신의 도메인에서 보낸 것처럼 위장한 메일이 인증된 메일 서버에서 전송된 것인지를 판별할 수 있습니다.

SPF 추가설명

스티비와 같은 이메일마케팅 서비스를 사용하면, 발신자 이메일 주소와 실제 발송하는 서버의 도메인이 다를 수 밖에 없습니다. 예를 들어, 스티비에서 "user@domain.com"이라는 발신자 이메일 주소로 이메일을 발송한다면, 실제 발송되는 서버는 스티비의 서버인 "stibee.com"이 되는 것이죠.

이런 경우, "stibee.com"에 대한 레코드를 "domain.com"에 등록하여, 발신자가 위조되지 않았다는 것을 네이버, 다음, 구글 같은 이메일 서비스의 수신서버에 알릴 수 있습니다.

스티비는 기본적으로 이메일 인증을 통해 발신자 이메일 주소의 소유를 확인하고 있습니다. 하지만 이메일 서비스의 수신 정책에 따라 SPF와 DKIM 레코드를 등록해야하는 경우가 있습니다.

이메일 발송에 문제가 있거나 콘텐츠, 구독자 DB에 문제가 없음에도 스팸으로 분류되는 문제가 있다면, 아래의 방법을 참고해서 SPF, DKIM을 설정하시기 바랍니다.

👉 본인이 소유한 도메인을 사용하지 않는 이메일 주소(예. user@naver.com, user@daum.net, user@gmail.com)를 사용한다면 SPF, DKIM 설정을 할 수 없습니다.

👉 도메인에 대한 SPF, DKIM 설정을 쉽고 빠르게 조회하고, 필요한 조치사항을 확인할 수 있습니다. → https://lab.stibee.com/domain?name=logthink.com

설정방법(요약)

TXT 레코드에 아래의 값을 추가합니다.

이름(호스트, 별칭): @ 또는 비워둠.

TTL(수명): 3600 또는 기본값으로 둠.

값(응답, 대상): v=spf1 include:mail.stibee.com ~all

값(응답, 대상)에 2개 이상의 도메인을 입력하는 경우, 하나로 합쳐서 입력합니다. (예. v=spf1 include:sub.domain.com include:mail.stibee.com ~all)

리버스도메인(Reverse Domain) 등록 설정완료

  • 개요: 리버스도메인, rDNS, PTR, 역방향DNS 라고 불리며 수신서버의 헤더에 찍히는 발신서버의 아이피를 역으로 조회하여 발송 도메인을 조회하여 스팸머를 거르는 기술을 의미합니다.
  • 설정방법: ISP 업체에 도메인 등록 요청/문의 하며 진행하면 된다.
  • 확인방법: nslookup -type=ptr 121.156.99.135

DKIM (DomainKeys Identified Mail) 등록 미설정

  • 개요: DKIM 표준을 사용하여 발신 메일 헤더에 디지털 서명을 추가하면 스푸핑을 방지하는 데 도움이 됩니다.
    따라서 수신된 메일이 스푸핑되지 않았음을 보증하므로 스팸으로 분류될 확률을 낮추는데 도움이 된다(기술적 의미에서는 스팸과 아무런 연관성이 없으나 스팸 필터에서 DKIM이 적용된 메일의 스팸 지수를 낮추는 정책을 사용하는 곳들이 많다).
  • 설정방법: 직접 생성도 가능하지만, 상용툴(https://dkimcore.org/)을 통해서도 가능하다.

설정방법 (요약)

CNAME 레코드에 아래의 값을 추가합니다.

이름(호스트, 별칭): stb._domainkey.yourdomain.com 또는 stb._domainkey

값(응답 ,대상): dkim.stibee.com

"이름(호스트, 별칭)"의 "yourdomain.com"은 발신자 이메일 주소의 도메인으로 대체합니다.

예를 들어, 발신자 이메일 주소가 "hello@stibee.com"이라면, "이름(호스트, 별칭)"은 "stb._domainkey.stibee.com" 또는 "stb._domainkey"로 입력합니다. "stb._domainkey"는 도메인과 상관없는 고정된 값입니다.

  • 참고: 그런데 DKIM의 경우는 앞서 설명했던 것들과 다르게 설정만하면 완료되는 것이 아니다.
    DKIM 레코드에는 공개키를 제공하는 것이므로 메일 발송시 비공개 도메인 키를 사용하여 도메인의 발신 메일 헤더를 암호화하는 과정이 필요하다.
    이 부분에 대해서는 오픈소스로 제작된 라이브러리들이 다수 있으니 쉽게 찾을 수 있다.
    아니면 직접 구현해도 된다. 다만 RSA를 다루어야 하므로 약간의 지식이 필요하다.

DMARC (Domain-based Message Authentication, Reporting and Conformance) 등록 미설정

  • 개요: DMARC는 이메일 인증 프로토콜로써 도메인 기반 메시지 인증, 보고, 준수를 의미한다.
    DMARC는 SPF, DKIM 두 가지 방법에 의존하여 서명 무결성을 확인한다. 메일이 SPF, DKIM 검사에 실패하면 DMARC 정책이 실행된다.
    어떤 방법을 사용하든 두 가지 검사에 모두 실패하지 않는 한 메일은 DMARC를 통과한 것으로 간주된다.
    그렇다면 DMARC를 통과하지 못하면 어떻게 되는가? 이때 어떻게 대응할 것인지에 대해서 정의하는 것이 DMARC 정책 게시라고 볼 수 있다.

MX Record / 서브도메인 등록등록 설정완료

화이트도메인(KISA) 등록 진행중

  • 개요: KISA RBL에서 통합 White Domain 등록제를 운영하며, 정상적으로 발송하는 대량 이메일이 RBL이력으로 간주되어 차단되는 것을 방지하기 위하여, 사전에 등록된 개인이나 사업자에 한하여 국내 주요 포탈사이트로의 이메일 전송을 보장해주는 제도입니다. ( 무료 )
    단, White Domain으로 등록되었다 하더라도 이후 모니터링을 통해 RBL이력발송 사실이 확인되면, 즉각 차단 조치되며 White 리스트에서도 삭제될 수 있습니다.
    단 , 개인의 경우에는 일부 포탈사이트에서 자사의 정책상 등록을 허용하지 않습니다.
    ※ KISA RBL 이란? KISA-RBL은 메일서버를 운영하는 누구나 손쉽게 효과적으로 스팸을 차단하는데 이용할 수 있도록 한국인터넷진흥원(KISA)에서 무료로 관리ㆍ운영하여 제공하는 실시간 스팸차단리스트입니다.
  • 방법
    단계
    1. 사이트 접속(https://spam.kisa.or.kr/integration/main.do)
    1. White Domain 등록
    1. 등록확인 및 수정
    1. 계정로그인(계정 모를경우 담당자, 이메일, 비번 찾기로 계정확인)
      참고
      화이트리스트 등록하기 위해서 기존 도메인에 인버스도메인, SPF등 아무것도 설정되어 있어서는 안된다 (KISA 문의로 확인)

RBL(Real-Time Blacklist) 등록 조회 진행중
알려진 스팸 블랙리스트 등록확인 필요

등록된 스팸블랙리스트는 'korea.services.net'으로 해제 요청이 필요.
※ 대형 포털 메일서버는 RBL에 스팸유의 IP인지를 참고하므로, 대응이 필요함
※ 아래 내용의 IP차단 의심 시 체크사항 확인바람
4. IP차단 의심 시 체크사항
대량 메일 발송 가이드 라인에 맞게 메일을 전송했는지 확인하기.
발송한 메일의 내용이 스팸메일인지 확인
포털사이트의 고객센터로 문의

  1. 각 포탈 메일서버의 정책 공지
    Daum: http://hanmail-notice.daum.net/notice/746?index=1
    Gmail: https://postmaster.google.com/ ( TXT record: google-site-verification=8Z4_9MMZTaYtKCthUi8kf8msTZ_XuLN6wA5EbFovp88 )
    Kakao: https://mail-notice.kakao.com/mboard/notice/7
    Naver: https://ui.nboard2.naver.com/nboard2/read.nhn?n2_boardId=1100001039&docId=10000000000030667736 (스팸메일정책 바로가기)
    참고사이트 목록

-Postfix+SASL 서버 설정: https://blog.naver.com/bethbang1004/222095965899
-Linux DNS 설정: https://www.tongkni.co.kr/idcplus/plugin/ga_image/Linux%20Server_DNS.pdf
-스팸분류 개선: https://blog.asamaru.net/2015/12/16/how-can-i-prevent-mail-from-being-classified-as-spam/
-호스팅서비스(가비아) DNS 레코드 설정법: https://customer.gabia.com/manual/domain/287/1201
-도메인 상태조회 서비스(SPF, DKIM) : https://lab.stibee.com/domain?name=logthink.com
-RBL 소개: https://spam.kisa.or.kr/rbl/sub1.do
-RBL 정리: http://blog.servis.co.kr/index.php/2019/04/15/dnsbl-rbl-surbl/
-한국 네트워크 차단 목록(http://korea.services.net): http://korea.services.net/
-메일 에러 플래그 설명: https://itstorys.tistory.com/280
-지메일 스팸 대응: https://m.blog.naver.com/andwise/221625703295, https://hiseon.me/server/how-to-solve-spam-mail-problem/
-메일 방화벽 설정: https://blog.softmail.co.kr/532
-POSTFIX 설정: https://devbin.kr/server-postfix-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-smtp-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0/

profile
화이트해커

0개의 댓글