Hướng dẫn cấu hình Automatic Security Updates trên CentOS Stream 9 với dnf-automatic: Tự động vá lỗi bảo mật và gửi thông báo qua email

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

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-livepatch hoặc exclude kernel: thêm exclude=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ần dnf update --cacheonly trong 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.

Share: