[PHP] Cấu hình giá trị mail.log trong php.ini để kiểm soát spam mail trên Linux

Cấu hình giá trị mail.log trong php.ini để kiểm soát spam mail trên Linux

Ở bài hướng dẫn này mình sẽ giúp các bạn cấu hình giám sát các file .php có code gọi hàm mail() trong PHP để gửi email. Với chỉ 1 thay đổi nhỏ, nó sẽ giúp bạn có thể audit rõ hơn về vấn đề spam mail trong hệ thống có mã nguồn .php .

Thông thường nếu bạn quản trị 1 hệ thống, khi ta quan tâm đến vấn đề spam mail thì một trong những nguồn gây ra spam mail chính là các file mã nguồn .php có chức năng gửi mail. Các file này có thể hợp lệ hoặc không hợp lệ (kẻ xấu upload lên mã nguồn để spam mail). Mà trên các OS Unix-based thì hàm mail() của PHP sẽ sử dụng chương trình gửi mail MTA mặc định là sendmail trên Linux.

Bắt đầu từ phiên bản PHP 5.3, nhà phát triển PHP đã cho phép kích hoạt tính năng theo dõi việc gọi hàm mail() từ các file mã nguồn PHP.
Bạn có thể tham khảo tài liệu cấu hình giá trị chính thức của PHP tại : http://php.net/manual/en/mail.configuration.php


1. Cấu hình theo dõi hàm mail() được gọi

– Đầu tiên bạn phải tạo 1 file log và gán quyền 777 cho file log này, do tiến trình php thường được sử dụng riêng biệt bởi các user khác nhau trong hệ thống các site độc lập nên cần gán quyền rwx cho phần “others” có thể tương tác file log php.
– Vấn đề bảo mật thì với file log này có quyền 777 cũng không ảnh hưởng gì nhiều.

# mkdir -p /var/log/php/
# touch /var/log/php/php_mail_func.log
# chmod 777 /var/log/php/php_mail_func.log

– Nếu các giá trị sau không có trong file php.ini (tuỳ hệ thống mà file php.ini sẽ có các vị trí khác nhau) thì bạn hãy thêm vào rồi sau đó restart lại dịch vụ PHP :

# vi /usr/local/lib/php.ini
[mail function]
mail.log = /var/log/php/php_mail_func.log
mail.add_x_header = On

Chú thích :
mail.add_x_header : mặc định giá trị là 0. PHP sẽ thêm thông tin header “X-PHP-Originating-Script” bao gồm UID của script và tên của script.
mail.log : chỉ định đường dẫn tuyệt đối của file sẽ chứa log các thông tin file code gọi hàm mail(). File log sẽ log lại đường dẫn tuyệt đối của file code PHP, số dòng gọi hàm mail(), địa chỉ gửi, nhận và header. Chỉ có PHP version 5.3 trở lên mới hỗ trợ tính năng này.

– Khởi động lại dịch vụ PHP.

# /etc/init.d/httpd restart

– Nếu là dịch vụ PHP-FPM, tên file init PHP-FPM không chính xác với mỗi hệ thống về PHP-FPM.

# /etc/init.d/phpfpm restart


1.1 Code test chức năng gửi mail bằng hàm mail()

– Đoạn code dùng để demo test chức năng gọi hàm mail() để gửi mail cho bạn nào muốn test thử.
– Link download đoạn code demo đơn giản : https://cuongquach.com/download/php/mail-function.php.txt

# wget -O mail.php https://cuongquach.com/download/php/mail-function.php.txt

     
     Email:
     Subject:
     Message:
     
           


2. Thông tin header mail.add_x_header

– Khi bạn view header của 1 email bạn sẽ nhận được thêm 1 giá trị Header như sau, với 55 là UID, mail.php là tên file code php gửi mail :

X-PHP-Originating-Script: 55:mail.php

– Giá trị header này được thêm vào tất cả các email gửi ra ngoài.


3. Log output mail.log

– Với đoạn code demo chức năng gửi mail bằng hàm mail() nhằm kiểm tra việc log việc gọi hàm mail() thì khi chúng ta xem đoạn log ở file /var/log/phpmail.log sẽ có thông tin như sau :

# cat /var/log/phpmail.log
mail() on [/home/user/public_html/mail.php:12]: To: someone@example.com -- Headers: From:cuongquach.community@gmail.com
mail() on [/home/user/public_html/mail.php:12]: To: someone@example.com -- Headers: From:cuongquach.community@gmail.com

+ Nhược điểm :
– Không có thời gian (timestamp) cụ thể mà file PHP đó đã gọi hàm mail() PHP để gửi mail.

4. Lưu ý

– Mình thường chỉ cấu hình giá trị “mail.log” thôi, không cần phải cấu hình “mail.add_x_header” chi để lộ ra thông tin file mã nguồn chạy hàm gửi mail hoặc 1 vài vấn đề khác.
– Nếu bạn không phân quyền thì khi các file code PHP gọi hàm mail sẽ bị lỗi như sau :

Warning: mail(/var/log/php/php_mail_func.log): failed to open stream: Permission denied in /home/user/public_html/mail.php on line 12 . 

Chúc các bạn thành công !

Previous article[MySQL] Hướng dẫn liệt kê các user và quyền hạn của user trong MySQL
Next article[cPanel] Hướng dẫn thay đổi DocumentRoot Primary Domain 1 account user trên WHM/cPanel
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !