이번주는 리눅스 서버에 NodeJS, Postfix, Dovecot을 설치하여 메일을 보내보았습니다!

57168983.png

Nodejs Installation

$ sudo apt-get update
$ curl -sL https://deb.nodesource.com/setup_10.x | bash -
$ sudo apt-get install -y nodejs

바로 apt-get install nodejs 명령어를 통해 nodejs를 설치하게 된다면 낮은 버전이 깔리게 되므로

curl을 활용하여 nodejs가 설치될 버전을 지정해주어야 함

Postfix

$ sudo apt-get install postfix

그냥 엔터를 계속 눌러준다. 다음 단계에서 다시 설정할 예정

$ sudo dpkg-reconfigure postfix
  • 서버 설정형식을 ‘인터넷사이트’로 선택한다. <Internat Site>
  • 메일서버가 사용할 도메인명(FQDN)을 입력한다. <your-domain.com>
  • root 메일을 수신할 사용자명을 입력한다. <user01>
  • 메일을 수신할 호스트명을 모두 입력한다. <mail.your-domain.com, localhost.localdomain, localhost>
  • 메일큐(queue)에 동기 업데이트의 강제유무를 결정한다. <Yes/No>
  • 메일서버가 이메일을 릴레이할 네트워크 블럭을 지정한다. <127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128>
  • 메일함의 크기 제한을 설정한다. <0>
  • 로컬주소 확장용 문자를 지정한다. <+>
  • 사용할 인터넷 프로토콜을 지정한다. <all>

postfix-internet

postfix3

postfix-domain

Dovecot

$ sudo apt install dovecot-imapd dovecot-pop3d

$ vim /etc/dovecot/dovecot.conf

# 아래 내용을 추가
# 사용할 서비스들을 기재합니다.
protocols = imap imaps pop3 pop3s

# 모든 네트워크에서 메일을 받는다는 것을 뜻합니다.
# IPv6에서 사용하지 않는다면 ::를 지워도 됩니다.
listen = *, ::

각 메일계정 메일함 설정

$ vim /etc/dovecot/conf.d/10-mail.conf

# 기본적으로 Maildir를 사용하면 아래와 같이 설정합니다
mail_location = maildir:~/Maildir

# [다른 예시]
# mbox를 사용하는 방법으로 /var/mail/ 밑에 사용자별로 메일함을 생성합니다.
mail_location = mbox:~/mail:INBOX=/var/mail/%u

# 인덱스를 사용하는 방법으로, /var/indexes/ 밑에 도메인과 사용자별로 구분해서 메일함을 생성합니다.
mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n

설정 후에 dovecot restart

$ sudo systemctl restart dovecot.service
# 또는
$ sudo systemctl restart dovecot

DNS 설정

A (Address Mapping records)
레코드 A는 주어진 호스트에 대한 IP 주소를 알려줌

Domain 이름을 IP주소 변환으로 사용

MX (Mail exchanger)

MX 레코드는 DNS 도메인 이름에 대한 메일 교환 서버를 알려줌.
여러 메일 서버를 이용할 수 있을 경우 메일 전달 우선순위 제어에 사용되는 선호 값을 규정

TXT 레코드

  • SPF 레코드를 입력하고자 하는 경우 위 TXT 레코드 사용.
  • 사용하는 도메인이 스팸으로 차단되는 것을 방지하기 위하여 SPF 레코드 등록

lnPldLT
Hmn8oDf

  • 가비아에서 MX 레코드를 등록해주지 않으면 해당 도메인의 MX 조회시 조회 불가
  • 아래처럼 MX 레코드를 등록해주어야 MX 조회 가능

RlsJKZk

rDgI9ve

mx dns 테스트는 아래 주소에서 할 수 있음
https://mxtoolbox.com/

이제 설정한 도메인으로 메일을 보내면 설정한 메일 디렉토리에 저장됨

메일 parser

Text형태의 메일을 mailparser를 이용하여 parse한후 필요한 내용만 뽑아낼 필요가 있음.

npm init -y
npm install mailparser moment

mail.txt 메일내용 저장

const fs = require('fs');
const moment = require('moment');
const simpleParser = require('mailparser').simpleParser;

const source = fs.readFileSync('mail.txt', 'utf-8');

(async () => {
  let parsed;
  try {
    parsed = await simpleParser(source);
  } catch (error) {
    console.log(error);
    return;
  }
  const {
    headers,
    subject,
    from,
    to,
    cc,
    bcc,
    date,
    messageId,
    inReplyTo,
    references,
    html,
    text,
    textAsHtml,
    attachments,
  } = parsed;

  const content = html || text;
  const localDate = moment
    .utc(date)
    .local()
    .format('YYYY-MM-DD HH:mm:ss');

  const encoded = headers.get('content-transfer-encoding');

  console.log(`보낸사람 ${from.text}`);
  console.log(`받는 사람 ${to.text}`);
  console.log(`보낸 시각 ${localDate}`);
  console.log(`인코딩 ${encoded}`);
  console.log(`제목 ${subject}`);
  console.log(`본문 ${content}`);
  console.log(`파일첨부 ${attachments}`);
})();

메일 보내기

메일 보내는 소스는 아래 주소를 참조 부탁드립니다.
https://jetalog.net/72

위 소스로 지메일에 메일을 보내게 되면 메세지가 암호화 되지 않았습니다. 라는 경고가 뜬다.
경고
이를 해결하기위해서는 아래의 스텝을 진행합니다.

SMTP 인증

다음으로 SMTP-AUTH를 사용하면 클라이언트가 인증 메커니즘 (SASL)을 통해 자신을 식별 할 수 있다. 인증 프로세스를 암호화하려면 TLS (전송 계층 보안)를 사용해야한다. 일단 인증되면 SMTP 서버는 클라이언트가 메일을 릴레이 할 수있도록 허용한다.

설정하는 방법은 두가지가 있는데, 하나는 postconf를 활용하여 설정하는 것이고

다른 하나는 /etc/postfix/main.cf 파일 내에서 직접 수정 및 추가해주는 것이다

postconf 명령어는 해당 설정값이 존재하면 수정해주고 존재하지 않다면 자동으로 추가해주는 편리한 명령어이기 때문에 안전하게 postconf 명령어를 활용하여 설정해주자

$ sudo postconf -e 'smtpd_sasl_type = dovecot'
$ sudo postconf -e 'smtpd_sasl_path = private/auth'
$ sudo postconf -e 'smtpd_sasl_local_domain ='
$ sudo postconf -e 'smtpd_sasl_security_options = noanonymous'
$ sudo postconf -e 'broken_sasl_auth_clients = yes'
$ sudo postconf -e 'smtpd_sasl_auth_enable = yes'
$ sudo postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination'

TLS/SSL 인증서 생성

Let’s Encrypt는 HTTPS를 통해 암호화 통신을 할 수 있도록 무료 SSL 인증서를 제공해주는 프로젝트로서 ISRG(Internet Security Research Group)라는 비영리기관에 의해 운영되고 있다.LetsEncrypt는 크롬, 모질라, 시스코 등 여러 기업들로 부터 후원을 받고 있고, 이미 상당한 숫자의 사용자를 확보하고 있다.단, 인증서 유효기간이 90일이라 짧은 편이지만 자동갱신 설정이 가능하다. 또한, *.domain.com과 같이 일괄적인 서브도메인 등록은 불가하고, 각각의 서브 도메인에 대한 등록이 필요하다.

우분투 16.04에는 패키지가 기본 포함되어 있어 apt로 간단하게 설치가 가능하다.

$ sudo apt install letsencrypt
$ sudo letsencrypt certonly --standalone -d mail.yourdomain.com

두번째 명령어를 실행하고 조금 기다리면 발급이 완료되었다는 메세지가 뜹니다.

발급받은 인증서는 /etc/letsencrypt/archive/도메인명/ 의 디렉토리에 저장되어 있고, 실제 사용할 때에는 /etc/letsencrypt/live/도메인명/ 의 디렉토리에 있는 symlink들을 사용할 것을 추천합니다.

입출력 메일에 대한 TLS 암호화 사용을 위한 설정

$ sudo postconf -e 'smtp_tls_security_level = may'
$ sudo postconf -e 'smtpd_tls_security_level = may'
$ sudo postconf -e 'smtp_tls_note_starttls_offer = yes'
$ sudo postconf -e 'smtpd_tls_key_file=/etc/letsencrypt/live/mail.your-domain.com/privkey.pem'
$ sudo postconf -e 'smtpd_tls_cert_file=/etc/letsencrypt/live/mail.your-domain.com/fullchain.pem'
$ sudo postconf -e 'smtpd_tls_loglevel = 1'
$ sudo postconf -e 'smtpd_tls_received_header = yes'
$ sudo postconf -e 'myhostname = mail.your-domain.com'

smtps(465)와 submission(587)을 사용할 수 있도록 해준다.

$ vim /etc/postfix/master.cf

# ...
smtp      inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
# ...

설정을 마친 후 postfix 서비스 재시작

$ sudo systemctl restart postfix.service
# 또는
$ sudo systemctl restart postfix

SASL 설정하기

Dovecot SASL 이용을 위하여 dovecot-common 패키지를 설치해준다

$ sudo apt install dovecot-common

다음으로 아래 부분을 찾아 주석 제거 및 수정을 통해 smtp-auth를 설정해 준다

$ vim /etc/dovecot/conf.d/10-master.conf

# ...
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0660
  user = postfix
  group = postfix
}
# ...

TLS/SSL 암호화 설정

$ vim /etc/dovecot/conf.d/10-auth.conf

# ...
disable_plaintext_auth = yes # SSL/TLS 암호화가 사용되지 않으면 일반 텍스트 인증이 비활성화
# ...
auth_mechanisms = plain login # 클라이언트가 SMTP 사용자 인증을 사용
# ...

위의 설정이 끝난 후에 dovecot restart

$ sudo systemctl restart dovecot.service
# 또는
$ sudo systemctl restart dovecot

SMTP 사용자 인증이 잘 설정 되었는지 테스트

$ telnet mail.your-domain.com smtp

접속 후에 아래의 명령어를 입력

ehlo mail.your-domain.com

아래의 내용처럼 AUTH가 뜬다면 성공적으로 SMTP 사용자 인증이 설정된 것이다

# ...
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
# ...

기존 app.js에서

const mailOption = {
        host: 'mail.your-domain',
        port: 465,
        secure: true,
        auth: {
            user: 'userid',
            pass: 'userpw'
        }
    };

혹은

const mailOption = {
    host: 'mail.your-domain',
    port: 587,
    secure: false,
    auth : {
      user : 'userid',
      pass : 'userpw'
    }
  };

으로 수정해서 메일을 보냅니다

465 와 587 차이

Referenced

Dovecot : Install / Configure
메일 서버 세팅하기 - postfix, dovecot, roundcube
DNS 설정
SPF 레코드로 이메일 위장 방지하기
SPF(Sender Policy Framework)란 무엇인가요 ?
Letsencrypt 에서 SSL 인증서를 무료로 발급 받아 웹 서버에 적용하기
[리눅스 서버] Postfix, Dovecot, SSL/TLS 인증 메일서버 구축미니PC와 리눅스 활용
우분투 메일서버 구축
nodemailer
465 와 587 차이