Tạo lập mail server trên hệ thống GNU/Linux (Phần 5)

Đây là bài tiếp tục của bài này

Secure mail server

Ngăn chặn hackers, phishers, spammers, sếp hay hàng xóm của bạn truy cập vào server của bạn là vấn đề rất quan trọng nhưng không khó để làm

Authentication

Cái giao dịch email thông thường giữa client và server thường được thực hiện ở dạng plain text. Bao gồm cả password và nội dung của một email.

SASL

SASL bảo vệ việc authentication (login) bằng cách mã hoá password để nó không bị truy cập một cách dễ dàng. Tuy nhiên phần còn lại của email vẫn là ở dạng plain text.

Tất nhiên nó không phải là lý tưởng vì vậy có một số cách để kết hợp SASL và lưu trữ password đã được mã hoá. Trong tương lai, các package của Ubuntu có thể sẽ hỗ trợ các tuỳ chọn thiết lập password_format cho SASL. Cho đến lúc đó bạn có thể thiết lập SASL để yêu cầu PAM so sánh password:

Cài đặt:

sudo apt-get install libsasl2-modules libsasl2-modules-sql libgsasl7\
				libauthen-sasl-cyrus-perl sasl2-bin libpam-mysql

Thiết lập:

Cho phép postfix truy cập vào file SASL

sudo adduser postfix assl

Tạo file sasl có thể truy cập được bằng chrooted Postfix

sudo mkdir -p /var/spool/postfix/var/run/saslauthd

Thêm các thiết lập SASL cho Post fix

sudo vi /etc/postfix/main.cf
# SASL
smtpd_sasl_auth_enable = yes
# If your potential clients use Outlook Express or other older clients
# this needs to be set to yes
broken_sasl_auth_clients = no
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =

Thay đổi các configuration đã có:

# Add permit_sasl_authenticated to you existing  smtpd_sender_restrictions
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks,
		warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain,
		reject_unauth_pipelining, permit
# Add permit_sasl_authenticated to you existing  smtpd_recipient_restrictions
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks,
		permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain,
		reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit

Thay đổi cách SASLAUTHD được chạy:

sudo vi /etc/default/saslauthd
# Toggle this to yes
START=yes
# Switch this to be under postfix's spool
# And add -r so that the realm(domain) is part of the username
OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"

Hướng dẫn Postfix cách giao tiếp với SASL

sudo vi /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login cram-md5 digest-md5
log_level: 7
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: mailPASSWORD
sql_database: maildb
sql_select: select crypt from users where id='%[email protected]%r' and enabled = 1

(Khi SASL hoạt động, bạn có thể bỏ dòng log_level (Chú ý: Trong khi sql_passw là tên parameter ban đầu(không có d), một parameter là sql_passwd cũng hoạt động ở version mới hơn)

Hướng dẫn PAM cách authenticate smtp thông qua mysql:

sudo vi /etc/pam.d/smtp

Ở đây bắt buộc chỉ có 2 dòng, tôi chia nó ra chỉ để dễ đọc:

auth required pam_mysql.so user=mail passwd=mailPASSWORD
			host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1
account sufficient pam_mysql.so user=mail passwd=mailPASSWORD
			host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1

Thêm vào đó, việc tailing var/log/mail.log/var/log/mysql/mysql.log khá hữu dụng để tail auth.log khi test SASL

tail -f /var/log/auth.log

Khởi động lại Postfix và saslauthd để cho phép SASL gửi emails.

sudo /etc/init.d/saslauthd restart
sudo /etc/init.d/postfix restart

Imap SASL / Courier

Tôi thường không dùng SASL cho authentication ở Courrier, vì tôi đã bắt buộc sử dụng TLS cho tất cả các clients. Tuy nhiên nếu bạn có nhiều chính sách nới lỏng truy cập vì nó tốt hơn khi bạn có nhiều user, thì bạn có thể sẽ muốn có SASL ở Courier.

sudo vi /etc/courier/imapd

Phần này có thể đã có sẵn và chỉ bị comment out. Nếu không thì thay line hiện tại bằng cách thêm vào UTH=CRAM-MD5 AUTH=CRAM-SHA1 để nó giống như sau:

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
			THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"
sudo /etc/init.d/courier-authdaemon restart;
sudo /etc/init.d/courier-imap restart;
sudo /etc/init.d/courier-imap-ssl restart

Encryption

TLS

Việc mã hoá traffic giúp ngăn cản người khác nghe trộm việc giao tiếp của bạn, và rất được khuyến khích. Có nhiều kiểu giao tiếp khác nhau cần phải mã hoá: Data traffic giữa ứng dụng email và server khi bạn đọc và gửi email, giao tiếp giữa các email server khác và server mail của bạn. Để mã hoá email thì bạn cần thiết lập Courier. Để gửi đi giữa các server mã hoá bạn cần Postfix.

TLS trong Postfix

Để mã hoá, bạn cần các certificate. Ubuntu tạo sẵn cho bạn một vài cái để bạn có thể dùng khi thiết lập server. Tuy nhiên trước khi bạn chạy server, thì tôi khuyên bạn nên tạo certificate riêng ứng với tên domain của bạn.

vi /etc/postfix/main.cf

Đã có sẵn một vài TLS setting ở version debian/ubuntu mặc định của file này. Tôi đưa nó xuống cuối file, nhưng bạn có thể đặt ở đâu tuỳ ý.

# TLS parameters
# smtp_use_tls = no
smtp_tls_security_level = may
# smtpd_use_tls=yes
smtpd_tls_security_level = may
# smtpd_tls_auth_only = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
# smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
# smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Tiếp theo chúng ta cần nhìn vào file master.cf

vi /etc/postfix/master.cf

Mặc định, chỉ có service smtp bình thường được bật lên. Nhưng tôi thích bật submission (port 587) lên, để client có thể sử dụng nó, và tôi có thể giới hạn họ chỉ dùng TLS. Cũng cần cho phép smtps service (port 465), để tương thích với một vài clients cũ (ví dụ như outlook express...)

submission inet n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
# if you do not want to restrict it encryption only, comment out next line<
  -o smtpd_tls_auth_only=yes
# -o smtpd_tls_security_level=encrypt
#  -o header_checks=
#  -o body_checks=<
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous
# -o milter_macro_daemon_name=ORIGINATING<
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous
#  -o milter_macro_daemon_name=ORIGINATING

TLS trong Courier

Ubuntu lại đã tạo sẵn certificate cho bạn, nhưng nếu bạn muốn tạo cái riêng cho mình, đặc biệt là để cho một domain name chuẩn, thì hãy làm như sau:

cd /etc/courier
openssl req -x509 -newkey rsa:1024 -keyout imapd.pem \
  -out imapd.pem -nodes -days 999

Và bạn cần sửa

vi /etc/courier/imapd-ssl

Mặc định Ubuntu đã chỉ sẵn vào certificate của bạn

TLS_CERTFILE=/etc/courier/imapd.pem

Hãy thay đổi cái này nếu cần thiết.

Nếu bạn cũng muốn giới hạn các người dùng của IMAP cho SSL/TLS, chỉ cần chỉnh setting này sang 1

IMAP_TLS_REQUIRED=1