เข้ารหัสการส่งอีเมล์ด้วยการคอนฟิก TLS ใน postfix บน CentOS 6

หลังจากที่ คอนฟิก postfix เบื้องต้น บน CentOS 6

ในตอนนี้เราจะเพิ่มความปลอดภัยในการส่งเมล์ (SMTP) เข้าเมล์เซิร์ฟเวอร์ที่รัน postfix ด้วยการให้ผู้ส่งเข้ารหัสการส่งเมล์ด้วยการคอนฟิก TLS

ก่อนจะเริ่มคอนฟิกกัน ขอทำความเข้าใจก่อนว่า postfix จะทำหน้าที่เป็น SMTP Server หลักๆ อยู่สองกรณีคือ

  • กรณีแรก รับอีเมล์จากโปรแกรมเมล์ไคลเอ้นต์ เช่น Outlook, Thunderbird หรือโปรแกรมส่งเมล์อื่นๆ ที่ผู้ใช้ระบุ SMTP Server ในกรณีนี้เมื่อ postfix ได้รับอีเมล์แล้วก็จะส่งต่อไปยังเมล์เซิร์ฟเวอร์ปลายทางที่ผู้ส่งระบุ
  • กรณีที่สอง รับอีเมล์จากเมล์เซิร์ฟเวอร์ที่อื่น ที่ผู้ส่งระบุชื่ออีเมล์โดเมนว่าเป็นเครื่องเซิร์ฟเวอร์ของเรา ในกรณีนี้ postfix จะรับอีเมล์มาแล้วเก็บไฟล์ไว้บนเซิร์ฟเวอร์

ในที่นี้เราจะคอนฟิกการเข้ารหัสเฉพาะกรณีแรกเท่านั้น เนื่องจากเราสามารถบังคับผู้ใช้เมล์เซิร์ฟเวอร์ของเราให้เข้ารหัสการส่งอีเมล์ได้ แต่กรณีที่สองนั้น เมล์เซิร์ฟเวอร์ส่วนใหญ่ยังไม่รองรับการเข้ารหัส และเราก็ไม่สามารถไปบังคับคนอื่นได้ด้วย

เนื่องจากมีสองรูปแบบ คือทั้งแบบเข้ารหัสและไม่เข้ารหัส จำเป็นต้องแยกคอนฟิก พอร์ตเดิม TCP 25 จะรองรับอีเมล์จากเมล์เซิร์ฟเวอร์เครื่องอื่น ในส่วนนี้ไม่มีการเปลี่ยนแปลงคอนฟิก

ส่วนพอร์ตที่จะคอนฟิกเพิ่มและจะใส่คอนฟิกการเข้ารหัสแบบ TLS ด้วย คือพอร์ต TCP 587 มีชื่อเรียกตามมาตรฐานว่า submission เพื่อรองรับการส่งเมล์จากโปรแกรมเมล์ไคลเอ้นต์ โปรแกรมบน iphone, android ก็รองรับการส่งแบบนี้

สร้างไฟล์ private key, certificate สำหรับ postfix

ก่อนจะคอนฟิก TLS ใน postfix ต้องสร้างไฟล์ private key, certificate สำหรับใช้ใน postfix ก่อน

cd เข้าไปในไดเร็คทอรี /etc/pki/tls/ แล้วรันคำสั่ง openssl genrsa เพื่อสร้างไฟล์ private key

[root@cent6 ~]# cd /etc/pki/tls/
[root@cent6 tls]# openssl genrsa -out postfix.key
Generating RSA private key, 512 bit long modulus
..........................++++++++++++
...++++++++++++
e is 65537 (0x10001)

ใช้คำสั่ง openssl req เพื่อสร้าง self-sign certificate จากไฟล์ private key ที่สร้างไว้

[root@cent6 tls]# openssl req -new -x509 -key postfix.key -out postfix.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:TH
State or Province Name (full name) []:Bangkok
Locality Name (eg, city) [Default City]:Bang Na
Organization Name (eg, company) [Default Company Ltd]:Test Company
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:smtp.example.com
Email Address []:

ย้ายไฟล์ private และ certificate ที่สร้างไปไว้ในไดเร็คทอรี private/ และ certs/ ตามลำดับ

[root@cent6 tls]# mv postfix.key private/
[root@cent6 tls]# mv postfix.crt certs/

แก้ไขไฟล์ /etc/postfix/main.cf ใส่คอนฟิกที่อยู่ของไฟล์ private key และ certificate โดยอาจเพิ่มต่อบรรทัดสุดท้ายของไฟล์นี้

[root@cent6 ~]# vi /etc/postfix/main.cf
...
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.crt

แก้ไขไฟล์ /etc/postfix/master.cf โดยการเอาเครื่องหมาย # หน้าบรรทัดคอนฟิกของ submission และส่วนอื่นๆ เพื่อเปิดการใช้ TLS

[root@cent6 ~]# vi /etc/postfix/master.cf
...
submission inet n - n - - smtpd
 -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
...

หมายเหตุ ในที่นี้ทดสอบแค่ TLS ก่อน ยังไม่ได้คอนฟิก AUTH เพื่อตรวจสอบ login, password ของผู้ส่งเมล์ (ตอนต่อไป)

รีสตาร์ตเซอร์วิส postfix เพื่อให้คอนฟิกใหม่มีผล

[root@cent6 ~]# service postfix restart
Shutting down postfix:               [ OK ]
Starting postfix:                    [ OK ]

ถ้าใช้คำสั่ง netstat -a ดู จะเห็นชื่อพอร์ต submission หรือ TCP 587 รันขึ้นมา

[root@cent6 ~]# netstat -a
Active Internet connections (servers and established)
Proto  Recv-Q  Send-Q  Local Address     Foreign Address   State
tcp    0       0       *:submission      *:*               LISTEN
...

หรือทดสอบด้วยคำสั่ง telnet เข้าพอร์ต 587 เพื่อดูว่าพอร์ตนี้มีคอนฟิกรองรับ TLS หรือไม่

พิมพ์คำสั่ง EHLO ตามด้วยชื่อโดเมน ผลลัพธ์จะแสดงคอนฟิกพอร์ตของเมล์เซิร์ฟเวอร์ ถ้ารองรับ TLS จะขึ้นคำว่า STARTTLS

[root@cent6 ~]# telnet 127.0.0.1 587
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 cent6.example.com ESMTP Postfix
EHLO example.com
250-cent6.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
[root@cent6 ~]#

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.