Allow user to send outoing email through Postfix
Relaying
Mail server hầu như đã sẳn sàng để dùng, nhưng còn thiếu một mảnh ghép. Người dùng đã lấy được email nhưng chưa thể gởi email.
Có một vài khác biệt khi emails được gởi internet. Mail servers làm điều đó khác nhau tùy theo end users:
- mail server tìm MX record của domain trên địa chỉ email để biết mail server, kế đến kết nối qua SMTP và gởi email.
- end user dùng ứng dụng mail như Thunderbird, Evolution hay Mutt không thể dùng cách trên. Mail clients không được trang bị chức năng lấy MX record. Cùng với việc người dùng hầu hết có IP động nên mail server không thể có cơ sở để xác tín hay từ chối. Client nói với mail server của họ, gởi thông tin để tự chứng thực và gởi email. Điều này gọi là relaying bởi vì mail server đóng vai trò relay giữa người dùng và mail server trên internet. Vì lý do bảo mật, người dùng cũng phải được chứng thực để được phép gởi email.
- end user dùng webmail là trường hợp đơn giản. Nếu firewall chạy trên chính mail server thì nó chỉ cần nói với Postfix trên localhost để chứng thực webmail., không cần qui trình chứng thực.
Sau đây là một vài minh họa ưa thích để giải thích nó:
Mail gởi đến
Một khi ai đó trên internet gửi email đến John@example.org, thông thường mailserver sẽ gửi email bằng cách sử dụng SMTP đến mailserver của bạn. Postfix sẽ xác định rằng nó có trách nhiệm với các địa chỉ email trong domain example.org và chấp nhận email. John sau đó có thể sử dụng POP3 hoặc IMAP để lấy email từ mailserver của bạn.
Mail gởi đi (không chứng thực)
John muốn gửi email đến lisa@example.com. mailserver của chúng ta không chịu trách nhiệm đối với tên miền của “example.com“, vì vậy nó nhận được email của John thì sẽ phải chuyển tiếp đến máy chủ thư chịu trách nhiệm về example.com. Điều này có vẻ như là một kịch bản vô hại nhưng mailserver của bạn phải từ chối.
Tại sao? Bởi vì bất cứ ai cũng có thể tự xưng là John và khiến máy chủ thư của bạn chuyển tiếp thư. Nếu kẻ tấn công (như kẻ gửi thư rác) sẽ gửi hàng triệu email spam trong tên John của bạn thông qua mailserver của bạn thì các tổ chức khác sẽ buộc tội bạn là nhà điều hành máy chủ thư rác. Máy chủ thư của bạn sẽ là những gì mọi người gọi là chuyển tiếp mở. Đây không phải là những gì bạn muốn bởi vì máy chủ thư của bạn sẽ bị đưa vào danh sách đen và bạn sẽ không thể gửi thư đến hầu hết các máy chủ khác. Vì vậy, khi không có bất kỳ bằng chứng nào cho thấy John thực sự là John, máy chủ của bạn phải từ chối email.
Mail gởi đi (có chứng thực)
Vậy làm thế nào để John chứng minh danh tính của mình? Anh ta cần phải sử dụng SMTP xác thực. Điều này tương tự như trường hợp trước nhưng chương trình email của John sẽ gửi tên người dùng và mật khẩu của anh ấy.
Chúng ta đang đảm bảo rằng xác thực của anh ấy xảy ra qua một kết nối được mã hóa để mật khẩu John không bị lộ.
Postfix cài đặt “mynetworks”
Ngoài việc sử dụng xác thực SMTP, bạn có thể yêu cầu Postfix luôn chuyển tiếp email cho một số địa chỉ IP nhất định. Cài đặt mynetworks chứa danh sách các mạng IP hoặc địa chỉ IP mà bạn tin tưởng. Thông thường bạn xác định mạng cục bộ của riêng bạn ở đây. Lý do John phải xác thực trong ví dụ trên là vì anh ta không gửi email từ mạng cục bộ của bạn.
Nếu người dùng đang sử dụng giao diện webmail chạy trên mailserver của bạn thì họ sẽ không cần xác thực. Roundcube gửi email đến localhost, được tin cậy theo cài đặt mynetworks.
Làm cho Postfix dùng Dovecot để chứng thực
Kích hoạt xác thực SMTP trong Postfix rất dễ dàng. Bạn đã cấu hình Dovecot để xác thực người dùng. Vì vậy, hãy để Postfix yêu cầu máy chủ Dovecot xác minh tên người dùng và mật khẩu. Postfix chỉ cần một số cấu hình bổ sung. Chạy các lệnh này trên shell:
postconf smtpd_sasl_type=dovecot
postconf smtpd_sasl_path=private/auth
postconf smtpd_sasl_auth_enable=yes
Điều này cho phép xác thực SMTP và thông báo cho Postfix rằng nó có thể nói chuyện với Dovecot thông qua file socket nằm ở /var/spool/postfix/private/auth. May mắn là trong phần trước chúng ta đã chỉnh sửa tệp /etc/dovecot/conf.d/10-master.conf và cho Dovecot đặt một file socket vào /var/spool/postfix/private/auth để cho phép giao tiếp từ Postfix.
Cho phép mã hóa
postconf smtpd_tls_security_level=may
postconf smtpd_tls_auth_only=yes
postconf smtpd_tls_cert_file=/etc/letsencrypt/live/${hostname}/fullchain.pem
postconf smtpd_tls_key_file=/etc/letsencrypt/live/${hostname}/privkey.pem
postconf smtp_tls_security_level=may
systemctl restart postfix
Chứng thực SMTP như thế nào nào?
Bạn có tò mò làm thế nào xác thực SMTP ở mức độ thấp? Bạn có thể không. Nhưng hãy làm điều đó. Chỉ cần một lần để bạn có được ý tưởng.
Cài đặt telnet nếu chưa có
apt install telnet
Mã hóa bằng Base64
Thông thường trong SMTP bạn chỉ có thể chuyển các ký tự ASCII. Nhưng địa chỉ email có thể chứa các ký tự đặc biệt. Và mật khẩu có thể chứa hầu như mọi thứ không phải là một phần của ASCII. Vì vậy, trong phương thức PLAIN, thông tin được mã hóa Base64.
Những gì thực sự được chuyển đổi sang Base64:
## NULL-BYTE + USERNAME + NULL-BYTE + PASSWORD ##
Submission port
sed '/#\?submission inet /{ s/#\?\(submission inet.*\)/\1/
:x; n; /#\? *-o / { s/#\?\( *-o .*\)/\1/; tx }
}' -i /etc/postfix/master.cf
systemctl restart postfix
Chống lại địa chỉ người gửi giả mạo
postconf smtpd_sender_login_maps=mysql:/etc/postfix/mysql-email2email.cf
Script
#!/bin/bash
# Tên script: 06.mail2postfix.sh
# Cấu hình gởi mail qua Postfix
# © 2020 LNT <lnt@lyle.info>
# version 20200801
#
echo 'Cấu hình gởi mail qua Postfix...'
HOSTNAME=$(hostname)
sed '/^smtpd_sasl_type/d
/^smtpd_sasl_path/d
/^smtpd_sasl_auth_enable/d
/^smtpd_tls_security_level/d
/^smtp_tls_security_level/d
/^smtpd_tls_auth_only/d
/^smtpd_tls_cert_file/d
/^smtpd_tls_key_file/d
/^smtpd_relay_restrictions/d
/^smtpd_sender_login_maps/d
' -i /etc/postfix/main.cf
cat >> /etc/postfix/main.cf <<EOF
#Postfix chứng thực qua Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
#Cho phép mã hóa
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/${HOSTNAME}/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/${HOSTNAME}/privkey.pem
smtpd_relay_restrictions = permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-email2email.cf
smtpd_client_restrictions = permit_mynetworks,reject_unauth_pipelining,reject_unknown_client_hostname,permit
smtpd_sender_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unknown_sender_domain,reject_unknown_reverse_client_hostname,reject_unknown_client_hostname
smtpd_helo_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_invalid_helo_hostname,reject_non_fqdn_helo_hostname,reject_unknown_helo_hostname
EOF
sed '/#\?submission inet /{ s/#\?\(submission inet.*\)/\1/
:x; n; /#\? *-o / { s/#\?\( *-o .*\)/\1/; tx }}' -i /etc/postfix/master.cf