Bỏ quên patch bảo mật — rủi ro không đáng
Có một thực tế khá phổ biến ở các team DevOps nhỏ: server chạy ổn định vài tháng, rồi ai cũng quên việc cập nhật security patch. Đến khi xảy ra sự cố, nhìn lại log mới thấy lỗ hổng đã được công bố từ 3 tháng trước và có bản vá sẵn rồi.
Mình từng gặp tình huống này. Công ty mình vẫn còn vài con server chạy CentOS 7, và việc migrate sang AlmaLinux là bài toán mình đã xử lý — nhưng trong thời gian chờ migration, mình cần một cơ chế tự động vá lỗi bảo mật mà không cần SSH vào từng máy mỗi tuần. Sau khi thử vài cách, dnf-automatic là lựa chọn mình tin dùng nhất cho các server RHEL-based, đặc biệt CentOS Stream 9.
Bài này mình chia sẻ cách setup hoàn chỉnh: cài đặt, cấu hình chỉ apply security updates, và bật email notification để biết mỗi ngày server vá cái gì.
dnf-automatic là gì và tại sao dùng nó?
dnf-automatic là công cụ chính thức của hệ sinh thái DNF, được thiết kế để tự động hóa việc cập nhật package. Khác với việc chạy dnf update thủ công, tool này tích hợp thẳng với systemd timer — không cần cron job tự dựng, không cần script wrapper phức tạp.
Điểm mạnh so với các giải pháp khác:
- Granular control: có thể chọn chỉ download, chỉ apply security updates, hoặc update toàn bộ
- Email notification tích hợp sẵn: không cần pipe output ra ngoài
- Systemd timer: chạy đúng giờ, có log, có retry nếu hệ thống offline
- Random delay: tránh N server cùng hit mirror repo một lúc
Mình thường dùng nó theo chế độ apply security updates only — an toàn nhất cho production, tránh việc update một package nào đó làm break ứng dụng.
Thực hành: Cài đặt và cấu hình từng bước
Bước 1: Cài dnf-automatic
Package này có trong repo mặc định của CentOS Stream 9, cài thẳng:
sudo dnf install -y dnf-automatic
Kiểm tra version và file config mặc định:
dnf-automatic --version
cat /etc/dnf/automatic.conf
Bước 2: Cấu hình automatic.conf
File cấu hình chính nằm tại /etc/dnf/automatic.conf. Mình sẽ chỉnh từng section quan trọng:
sudo cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.bak
sudo nano /etc/dnf/automatic.conf
Nội dung cần chỉnh trong section [commands]:
[commands]
# Chỉ download security updates, không apply ngay
# Dùng cho môi trường cần review trước
# upgrade_type = security
# download_updates = yes
# apply_updates = no
# --- Hoặc: Apply security updates tự động (khuyến nghị cho production) ---
upgrade_type = security
download_updates = yes
apply_updates = yes
# Random delay tối đa 60 phút — tránh tất cả server cùng update một lúc
random_sleep = 3600
Section [emitters] — cấu hình cách gửi thông báo:
[emitters]
# Gửi thông báo qua email (cần SMTP hoặc local MTA)
emit_via = email
# Chỉ gửi email khi có update (tránh spam mỗi ngày)
# available: always, never, only-if-updated
email_to = [email protected]
email_from = [email protected]
email_host = localhost
# Nếu dùng port khác (ví dụ Gmail SMTP):
# email_host = smtp.gmail.com
# email_port = 587
Section [base] — cấu hình chung:
[base]
debuglevel = 1
# Đường dẫn log
# /var/log/dnf.log tự động capture output từ dnf
Bước 3: Kích hoạt systemd timer
dnf-automatic đi kèm 3 timer khác nhau, chọn đúng timer theo nhu cầu:
# Xem các timer có sẵn
ls /usr/lib/systemd/system/dnf-automatic*.timer
# dnf-automatic.timer — apply updates (dùng cái này)
# dnf-automatic-download.timer — chỉ download, không apply
# dnf-automatic-install.timer — alias của cái đầu tiên
Bật timer cho apply security updates:
# Enable và start timer
sudo systemctl enable --now dnf-automatic.timer
# Kiểm tra trạng thái
systemctl status dnf-automatic.timer
systemctl list-timers dnf-automatic*
Output mẫu khi timer đang chạy đúng:
NEXT LEFT LAST PASSED UNIT
Wed 2026-07-02 06:42:15 JST 18h left Tue 2026-07-01 06:12:03 JST 5h ago dnf-automatic.timer
Bước 4: Cấu hình email notification qua Postfix (local MTA)
Nếu server chưa có MTA, cài Postfix để gửi email qua relay:
sudo dnf install -y postfix mailx
sudo systemctl enable --now postfix
Test gửi email nhanh:
echo "Test from CentOS Stream 9" | mail -s "dnf-automatic test" [email protected]
Nếu server cần relay qua Gmail hoặc SMTP ngoài, thêm cấu hình relay vào /etc/postfix/main.cf:
# Thêm vào cuối /etc/postfix/main.cf
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
# Tạo file credentials
echo "[smtp.gmail.com]:587 [email protected]:app-password" | sudo tee /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl restart postfix
Lưu ý: Với Gmail cần dùng App Password (không phải password chính), vào Google Account → Security → App passwords để tạo.
Bước 5: Test thủ công trước khi để chạy tự động
Luôn test thủ công một lần để chắc chắn config đúng:
# Chạy dnf-automatic ngay, không chờ timer
sudo dnf-automatic /etc/dnf/automatic.conf
# Xem log chi tiết
sudo journalctl -u dnf-automatic -f
# Hoặc trigger timer ngay
sudo systemctl start dnf-automatic
Kiểm tra log xem có update nào được apply không:
sudo cat /var/log/dnf.log | grep -E "(Upgraded|Installed|security)"
# Xem lịch sử update
sudo dnf history list | head -20
Bước 6: Điều chỉnh lịch chạy (tùy chọn)
Mặc định timer chạy lúc 6h sáng + random delay. Để đổi giờ, override timer:
sudo systemctl edit dnf-automatic.timer
Thêm nội dung override (ví dụ chạy lúc 3h sáng):
[Timer]
OnCalendar=
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=1800
sudo systemctl daemon-reload
sudo systemctl restart dnf-automatic.timer
Một số tips từ thực tế
- Kernel updates: Security update đôi khi include kernel. Nếu không muốn auto-reboot, cân nhắc dùng
kernel-livepatchhoặc exclude kernel: thêmexclude=kernel*vào[base]section của automatic.conf và handle kernel update thủ công trong maintenance window. - Staging trước: Với production quan trọng, dùng chế độ
download_updates = yes, apply_updates = no— update sẽ được download sẵn, bạn chỉ cầndnf update --cacheonlytrong maintenance window. - Monitoring: Ngoài email, có thể bổ sung alert qua Slack/Telegram bằng cách tạo systemd service wrapper gửi webhook sau khi dnf-automatic chạy xong.
- Nhiều server: Với fleet lớn, mình khuyến nghị kết hợp với Ansible để push config automatic.conf đồng bộ, thay vì SSH từng máy.
Kết luận
Setup dnf-automatic mất khoảng 15 phút nhưng giúp tiết kiệm rất nhiều công sức về sau. Quan trọng nhất là chọn đúng upgrade_type = security — chỉ vá lỗ hổng bảo mật, không đụng đến feature updates có thể gây ra breaking changes.
Sau khi bật, mình thường để nguyên vài tuần rồi mới check lại log — email notification sẽ tự báo nếu có gì xảy ra. Đây là cách tiếp cận thực dụng nhất cho các server production mà team không có thời gian patch thủ công thường xuyên.

