Trước đây đã từng nhiều lần thử build một email server nhưng luôn luôn làm giữa chừng thì thất bại. Thông thường một email server tối thiểu cần phải cài những package sau: 1. Postfix cho SMTP server 2. Dovecot cho POP và IMAP server 3. PostgreSQL để quản lý email user 4. Amavis để cho việc quét virus email gửi và nhận 5. Spamassassin cho việc lọc thư rác 6. Apache cho Web server 7. Squirrelmail cho web mail client Việc thiết lập tất cả các gói trên không phải là đơn giản, nhưng ơn giời, tất cả các thiết lập trên đều được tự động hóa với script thần thánh ở trang web sau: https://avix.co/blog/creating-your-own-mail-server-amazon-ec2-postfix-dovecot-postgresql-amavis-spamassassin-apache-and-squirrelmail-part-2/ Hướng dẫn thực hiện đã được ghi rõ trong trang web trên. Dưới đây chỉ là memo tóm tắt lại những bước chính cũng như những thiết lập thêm để phù hợp với nhu cầu sử dụng của mình. ### Cần chuẩn bị: Theo như trang web tác giả thì script chỉ chạy đúng trên EC2 instance mới tinh. Do đó mình sẽ tạo mới một EC2 instance luôn, vì dù sao về nguyên tắc bảo mật thì email server cũng nên tách riêng với các server khác. Cần chuẩn bị những thứ sau: 1. Một domain 1. EC2 instance (chọn spec rẻ nhất: t2 nano, OS: Amazon Linux) 1. Security group. Cần thiết lập public inbound cho các port sau: HTTP, HTTPS, IMAP, IMAPS, SMTP, SMTPS, SSH, Custom port 587 1. Elastic IP 1. Thiết lập domain record trỏ tới server vừa tạo. Cần tối thiểu 2 record sau: 1. no name; MX – Mail Exchange; Alias NO; TTL 60 secs; Value 10 mail.yourdomain.com 2. name mail; A -IPv4; Alias NO; TTL 60 secs; Value PASTE ELASTIC IP HERE ### Cài đặt: Theo hướng dẫn ở trang web trên thì gồm các bước cơ bản sau: 1. Chuyển sang quyền root ~~~ $ sudo su ~~~ 1. Tải script về một thư mục bất kỳ ~~~ $ cd /tmp $ git clone https://github.com/Avix101/Mail-Server-Script.git ~~~ 1. Thay đổi nội settings ~~~ $ cd Mail-Server-Script $ vim super.sh # Thay đổi những nội dung sau virtual_mailbox_domains="yourdomain.com secondDomainIfYouHaveOne.com ..." (Only enter one if you only have one) default_password="whateverYouChoose" ~~~ 1. Chạy script ~~~ $ ./super.sh ~~~ Ngoài ra do mình muốn domain chính sẽ trỏ về web server, còn `mail.domain.com` mới trỏ về Squirrelmail trên email server, nên sau khi chạy xong script ở trên, cần thay đổi thiết lập virtualhost của Apache trên email server như sau: ~~~ $ vim /etc/httpd/conf/httpd.conf … ServerName mail.domain.com Redirect permanent /mail https://mail.domain.com/mail … ~~~ Nếu không có lỗi xảy ra, sau khi cài đặt và thiết lập xong, gõ `http://mail.domain.com/mail` sẽ truy cập vào được trang login của Squirrelmail. Thông tin để đăng nhập: ~~~ user: This email address is being protected from spambots. You need JavaScript enabled to view it. password: default password ~~~ Do script cài đặt ở trên sử dụng chứng nhận SSL cá nhân nên khi truy cập vào trang login của Squirrelmail, trình duyệt sẽ báo là chứng nhận không an toàn. Chỉ cần bỏ qua là có thể đăng nhập bình thường. ### Thay chứng nhận SSL xịn: Tới đây là có thể nhận và gửi email được rồi. Tuy nhiên mỗi lần truy cập vào trang login Squirrelmail hay lần đầu thiết lập trên các client gửi nhận email (Thunder Bird chẳng hạn) thì lại hiện thông báo là chứng nhận SSL không an toàn, khá khó chịu. Dưới đây sẽ sử dụng chứng nhận từ Let's Encrypt để bỏ thông báo này (tại mình là người cầu toàn). Làm theo các bước dưới đây để đăng ký một giấy chứng nhận SSL mới: https://blog.nvb-online.com/112-cai-dat-chung-thuc-ssl-cho-domain-voi-lets-ncrypt `certbot-auto` sẽ tự động quét thiết lập của Apache và thay đổi cho phù hợp. Chỉ cần làm theo hướng dẫn trên là xong phần thiết lập cho Apache. Tuy nhiên cũng cần thay đổi chứng nhận SSL xịn các package khác (Postfix...). Về lý thuyết ở đây cần mở file config của các package này lên và đổi đường dẫn trỏ đến file chứng nhận xịn do `certbot-auto` tạo. Tuy nhiên việc đi tìm đường dẫn file config của từng package khá mất thời gian nên ở đây mình chọn cách khác như sau: Các package được cài đặt bởi script thiết lập ở trên đều sử dụng cặp file chứng nhận ở đường dẫn sau: ~~~ /etc/pki/tls/certs/server.pem # Tương ứng với /path/to/letsencrypt/fullchain.pem /etc/pki/tls/private/server.pem # Tương ứng với /path/to/letsencrypt/private.pem ~~~ Do đó mình sẽ xóa 2 file này, sau đó tạo lại symbolic cùng tên trỏ đến file chứng nhận xịn. Đường dẫn file chứng nhận xịn có thể coi trong chỗ thiết lập virtualhost của Apache do `cerbot-auto` tự sửa ở bước đăng ký trước. Thêm dòng sau vào file `/etc/postfix/main.cf` để bật TLS trên Postfix: ~~~ $ sudo vim /etc/postfix/main.cf smtpd_tls_security_level = may ~~~ ### Thêm một tài khoản email mới: Tạo mật khẩu cho tài khoản mới: ~~~ $ doveadm pw -s SSHA512 -p PasswordToEncrypt ~~~ Thêm thông tin tài khoản vào CSDL: ~~~ $ psql mail mailreader # Nhập mật khẩu của admin trong file super.sh ở trên > insert into users (email, password, realname) values ('newemail@domain.com', 'passwordstringFromDOVEADMgen', 'Real name'); ~~~ ### Xóa một tài khoản email: ~~~ # Xóa thông tin tài khoản khỏi CSDL: $ psql mail mailreader # Nhập mật khẩu > delete users where email=This email address is being protected from spambots. You need JavaScript enabled to view it.'; # Xóa thư mục mailbox của user: $ sudo rm /mnt/vmail/domain/user ~~~ Khi nào rảnh sẽ làm một trang web đơn giản để quản lý việc tạo và xóa tài khoản email này. ### Định kỳ dọn dẹp thư mục Delete và Spam: Do dung lượng ổ cứng server có giới hạn nên nếu có nhiều tài khoản email thì nên thiết lập cron để định kỳ xóa các email trong thư mục Delete và Spam, tiết kiệm dung lượng ổ cứng. ~~~ $ sudo su $ vim /etc/dovecot/dovecot-sql.conf # Thêm nội dung sau: iterate_query = SELECT email as user FROM users # Tạo shell chứa command dọn dẹp email $ mkdir /etc/dovecot/etc $ vim /etc/dovecot/etc/expunge.sh # Thêm nội dung sau: #!/bin/bash # DOVEADM="/usr/bin/doveadm"; $DOVEADM expunge -A mailbox Trash savedbefore 30d $DOVEADM expunge -A mailbox Junk savedbefore 30d $DOVEADM expunge -A mailbox INBOX.Trash savedbefore 30d $DOVEADM expunge -A mailbox INBOX.Junk savedbefore 30d # Thêm quyền thực thi cho shell vừa tạo $ chmod u+x /etc/dovecot/etc/expunge.sh # Định nghĩa cron $ crontab -e # Thêm nội dung sau: # dovecot delete spam & trash 40 3 * * * /etc/dovecot/etc/expunge.sh ~~~ ### Thiết lập trên email client: Nếu sử dụng Thunderbird thì chỉ cần nhập địa chỉ email và password là tự động thiết lập được. Nếu sử dụng các client khác (ví Outlook trên iOS), có thể cần phải nhập thủ công các thông tin sau: * IMAP ~~~ host: mail.domain.com:143 user: This email address is being protected from spambots. You need JavaScript enabled to view it. pass: *** ~~~ * SMTP ~~~ host: mail.domain.com:587 user: This email address is being protected from spambots. You need JavaScript enabled to view it. pass: *** ~~~ ### Liên lạc với Amazon để bỏ giới hạn gửi email Về cơ bản tất cả các email gửi từ EC2 instance đều bị các dịch vụ email đánh dấu là spam. Ngoài ra Amazon có đặt giới hạn mỗi ngày một EC2 instance chỉ được gửi tối đa bao nhiêu email đó (cụ thể con số thì không nhớ rõ lắm, google chắc ra). Nếu muốn tạo một server gửi email phục vụ công việc thì cần phải liên lạc với Amazon để bỏ giới hạn gửi email này, đồng thời đăng ký reverse DNS để email gửi từ EC2 không bị đánh dấu là spam. Link form liên lạc: https://aws.amazon.com/forms/ec2-email-limit-rdns-request Amazon sẽ phản hồi sau khoản 1, 2 ngày kể từ khi nhận được form đăng ký. ### Memo các chỗ cần thay đổi khi muốn thêm một domain mới: Memo lại để sau này có gì cần dùng 1. Sửa trong file `/etc/Postfix/main.cf` 2. Sửa trong table `transports` trong database ### Kết: Xong! Từ giờ mỗi tháng sẽ tốn thêm khoảng 800 yên để duy trì cái email server này nhưng bù lại mình có thể sử dụng được email với tên miền riêng của mình. Không biết dzậy là rẻ hay mắc nữa ~.~