❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Mỗi ngày đều có CVE mới được công bố. Một lỗ hổng nghiêm trọng trong OpenSSL, kernel, hay glibc có thể bị khai thác chỉ vài giờ sau khi thông tin được public. Nếu VPS của bạn không được cập nhật kịp thời, nó trở thành mục tiêu dễ dàng cho các cuộc tấn công tự động.

Auto Update VPS

Vấn đề là không ai ngồi SSH vào server mỗi ngày chỉ để chạy apt upgrade. Và cũng không nên làm vậy, vì con người hay quên, hay bận, hay nghĩ “mai update cũng được”. Giải pháp đúng đắn là để hệ thống tự xử lý việc cập nhật bảo mật, còn bạn chỉ cần theo dõi kết quả.

Bài này sẽ hướng dẫn bạn thiết lập auto-update trên cả Ubuntu (dùng unattended-upgrades) và AlmaLinux (dùng dnf-automatic), kèm theo cách kiểm tra, giám sát, và những trường hợp bạn nên tắt tính năng này.

Tại sao cần tự động cập nhật?

Mình lấy ví dụ thực tế: lỗ hổng CVE-2024-6387 (regreSSHion) trong OpenSSH được công bố vào tháng 7/2024. Bản vá có sẵn trong vài giờ, nhưng nhiều server vẫn chưa update sau cả tuần. Những server đó là target hoàn hảo cho các bot scan tự động.

Quy trình thường thấy ở nhiều người quản trị VPS:

  • Dựng server xong, cài đủ thứ, quên luôn việc update
  • Vài tháng sau mới SSH vào, thấy hàng trăm package cần update
  • Update một lần quá nhiều, sợ hỏng nên… bỏ qua

Auto-update giải quyết vấn đề này bằng cách áp dụng bản vá bảo mật ngay khi có, mỗi ngày, không cần bạn phải nhớ hay can thiệp.

Ubuntu: Thiết lập unattended-upgrades

Cài đặt

Trên Ubuntu, unattended-upgrades thường đã được cài sẵn. Nếu chưa có, cài bằng lệnh:

sudo apt install unattended-upgrades apt-listchanges -y

Sau đó kích hoạt:

sudo dpkg-reconfigure -plow unattended-upgrades

Chọn Yes khi được hỏi. Lệnh này sẽ tạo file /etc/apt/apt.conf.d/20auto-upgrades với nội dung:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Hai dòng này nghĩa là: mỗi ngày hệ thống sẽ tự cập nhật danh sách package và chạy upgrade tự động.

Cấu hình chi tiết

File cấu hình chính nằm ở /etc/apt/apt.conf.d/50unattended-upgrades. Mở file này lên:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Chỉ cho phép security updates:

Tìm block Unattended-Upgrade::Allowed-Origins và đảm bảo chỉ giữ lại dòng security:

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}-security";
        // "${distro_id}:${distro_codename}-updates";    // comment dòng này
};

Việc chỉ bật security updates giúp giảm rủi ro. Các bản update thông thường đôi khi thay đổi behavior của package, còn security updates thường chỉ vá lỗi mà không thay đổi chức năng.

Bật email notification:

Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailReport "on-change";

Để gửi email được, server cần có MTA (Mail Transfer Agent) như Postfix hoặc msmtp. Nếu chưa có, hãy cài mailutils và cấu hình relay qua SMTP provider.

Tự động xóa package không dùng:

Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

Tự động reboot khi cần (sau kernel update):

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Dòng trên sẽ tự reboot server lúc 4 giờ sáng nếu có kernel update yêu cầu reboot. Chọn giờ thấp điểm phù hợp với traffic của bạn.

Kiểm tra hoạt động

Chạy thử để xem unattended-upgrades hoạt động đúng không:

sudo unattended-upgrades --dry-run --debug

Lệnh này chạy giả lập, không thực sự cài gì, nhưng sẽ cho bạn thấy những package nào sẽ được update và có lỗi gì trong cấu hình không.

AlmaLinux: Thiết lập dnf-automatic

Cài đặt

sudo dnf install dnf-automatic -y

Cấu hình

File cấu hình nằm ở /etc/dnf/automatic.conf. Mở lên và chỉnh các phần sau:

sudo nano /etc/dnf/automatic.conf

Phần [commands]:

[commands]
# Chỉ update security
upgrade_type = security
# Tự động áp dụng update
apply_updates = yes
# Tự động download
download_updates = yes

Phần [emitters]:

[emitters]
emit_via = email
[email]
email_from = root@your-server.com
email_to = admin@example.com
email_host = localhost

Nếu không muốn dùng email, bạn có thể đổi emit_via = stdio để log ra syslog, sau đó dùng tool giám sát khác để theo dõi.

Kích hoạt timer

dnf-automatic chạy qua systemd timer. Kích hoạt bằng lệnh:

sudo systemctl enable --now dnf-automatic.timer

Kiểm tra timer đã hoạt động:

systemctl status dnf-automatic.timer
systemctl list-timers dnf-*

Mặc định timer chạy 1 lần/ngày. Bạn có thể xem và điều chỉnh schedule nếu cần:

systemctl cat dnf-automatic.timer

Canonical Livepatch: Kernel update không cần reboot (Ubuntu)

Bình thường, khi kernel được update, bạn phải reboot server để áp dụng kernel mới. Với các server yêu cầu uptime cao, việc reboot có thể gây gián đoạn dịch vụ.

Canonical Livepatch giải quyết vấn đề này bằng cách patch kernel đang chạy trực tiếp trong memory, không cần reboot. Dịch vụ này miễn phí cho tối đa 5 máy với tài khoản Ubuntu One.

Cài đặt và kích hoạt:

# Cài snap nếu chưa có
sudo snap install canonical-livepatch
# Đăng ký token (lấy từ https://ubuntu.com/security/livepatch)
sudo canonical-livepatch enable YOUR_TOKEN

Kiểm tra trạng thái:

canonical-livepatch status --verbose

Livepatch chỉ hỗ trợ kernel chính thức của Ubuntu (generic kernel). Nếu bạn dùng custom kernel hoặc kernel từ bên thứ ba, tính năng này sẽ không hoạt động.

Kết hợp Livepatch với unattended-upgrades, bạn có thể tắt Automatic-Reboot vì hầu hết kernel patch đã được áp dụng trực tiếp mà không cần reboot.

Kiểm tra các bản update đang chờ

Dù đã bật auto-update, đôi khi bạn vẫn muốn kiểm tra xem có package nào chưa được update không. Có thể do update bị lỗi, hoặc package nằm ngoài scope của auto-update.

Ubuntu:

# Cập nhật danh sách package
sudo apt update

# Xem package nào cần update apt list --upgradable

# Chỉ xem security updates apt list --upgradable 2>/dev/null | grep -i security

AlmaLinux:

# Kiểm tra update available
dnf check-update

# Chỉ xem security updates dnf check-update --security

# Xem chi tiết advisory dnf updateinfo list security

Nếu sau khi bật auto-update mà vẫn thấy nhiều package chờ update, có thể cấu hình đang sai. Kiểm tra lại log để tìm nguyên nhân.

Khi nào KHÔNG nên bật auto-update

Auto-update rất tiện, nhưng không phải lúc nào cũng phù hợp. Dưới đây là những trường hợp bạn nên cân nhắc kỹ:

Production database server: MySQL, PostgreSQL, MongoDB khi update có thể thay đổi format dữ liệu hoặc behavior. Một bản update tự động vào lúc 3 giờ sáng có thể khiến database không start lại được. Với database server, nên update thủ công có kiểm soát.

Custom compiled software: Nếu bạn compile nginx, PHP, hay bất kỳ package nào từ source, auto-update có thể cài đè phiên bản từ repo lên bản custom của bạn. Điều này đặc biệt nguy hiểm nếu bạn compile với các module đặc biệt.

Server chạy ứng dụng nhạy cảm với phiên bản: Một số ứng dụng yêu cầu phiên bản cụ thể của thư viện. Ví dụ, ứng dụng Java có thể cần đúng bản OpenJDK 17.0.x, update lên 17.0.y có thể gây lỗi.

Cluster/HA setup: Trong môi trường cluster, các node cần được update lần lượt (rolling update) để đảm bảo availability. Auto-update có thể khiến nhiều node reboot cùng lúc.

Ngay cả khi không bật auto-update, bạn vẫn nên có quy trình update định kỳ (ít nhất hàng tuần). Không update gì cả là lựa chọn tệ nhất.

Testing strategy trước khi update

Nếu bạn lo ngại auto-update gây lỗi, đây là cách giảm thiểu rủi ro:

Dùng staging server

Tạo một server staging có cấu hình giống production. Bật auto-update trên staging trước, để nó chạy 1 tuần. Nếu không có vấn đề gì, áp dụng lên production.

Cách làm đơn giản nhất là tạo VPS nhỏ với cùng OS, cài cùng stack, rồi bật auto-update. Theo dõi log hàng ngày trong tuần đầu.

Snapshot trước update

Hầu hết nhà cung cấp VPS đều hỗ trợ snapshot. Tạo snapshot trước khi update là cách rollback nhanh nhất nếu có sự cố.

Bạn có thể kết hợp snapshot tự động với cron:

# Chạy trước giờ auto-update (ví dụ 3:30 AM, trước reboot lúc 4:00 AM)
# Thêm vào crontab
30 3 * * * /usr/local/bin/create-snapshot.sh

Script create-snapshot.sh sẽ gọi API của nhà cung cấp VPS để tạo snapshot. Chi tiết tùy thuộc provider bạn đang dùng (DigitalOcean, Vultr, Linode đều có API cho việc này).

Exclude package cụ thể

Nếu bạn muốn auto-update nhưng giữ nguyên một số package, có thể exclude chúng:

Ubuntu (trong 50unattended-upgrades):

Unattended-Upgrade::Package-Blacklist {
    "mysql-server";
    "nginx";
    "php8.*";
};

AlmaLinux (trong /etc/dnf/automatic.conf hoặc /etc/dnf/dnf.conf):

[main]
exclude=mysql* nginx* php*

Xử lý kernel update và needrestart

Kernel update là loại update đặc biệt vì kernel mới chỉ có hiệu lực sau khi reboot. Ngoài kernel, nhiều thư viện (như glibc, openssl) cũng yêu cầu restart các service đang dùng chúng.

Tool needrestart giúp bạn biết sau khi update có cần reboot hay restart service nào không:

# Ubuntu
sudo apt install needrestart -y
# Kiểm tra
sudo needrestart

Output sẽ cho biết:

  • Kernel hiện tại có phải bản mới nhất không
  • Có service nào cần restart không
  • Có cần reboot toàn bộ không

Trên AlmaLinux, bạn có thể kiểm tra tương tự với:

# Kiểm tra kernel đang chạy vs kernel mới nhất đã cài
uname -r
rpm -q kernel --last
# Nếu hai phiên bản khác nhau → cần reboot
# Tool needs-restarting (từ yum-utils)
sudo dnf install yum-utils -y
sudo needs-restarting -r    # check reboot needed
sudo needs-restarting -s    # list services cần restart

Cấu hình needrestart để tự động restart service sau update (không hỏi):

# Tạo config override
sudo tee /etc/needrestart/conf.d/auto-restart.conf > /dev/null <<'EOF'
$nrconf{restart} = 'a';    # 'a' = auto restart, 'i' = interactive
EOF

Cài đặt này quan trọng vì nếu để chế độ interactive (mặc định), unattended-upgrades sẽ bị treo khi needrestart hỏi xác nhận. Đặt thành 'a' để service tự restart sau update.

Giám sát và kiểm tra log

Bật auto-update xong mà không theo dõi thì cũng như không. Bạn cần biết nó có chạy đúng không, có lỗi gì không.

Log trên Ubuntu

# Log chính của unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log

# Xem log gần nhất tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

# Log dpkg (tất cả hoạt động cài/gỡ package) cat /var/log/dpkg.log

# Xem lịch sử update zcat /var/log/apt/history.log.*.gz | head -100

Log trên AlmaLinux

# Log dnf-automatic
journalctl -u dnf-automatic.service --since today
# Lịch sử dnf
dnf history
dnf history info last

Alerting khi update fail

Ngoài email notification tích hợp, bạn có thể tạo script đơn giản để kiểm tra và alert:

#!/bin/bash
# /usr/local/bin/check-update-status.sh

LOG="/var/log/unattended-upgrades/unattended-upgrades.log" TODAY=$(date +%Y-%m-%d)

# Kiểm tra log hôm nay có lỗi không if grep -q "$TODAY.*ERROR\|$TODAY.*WARNING" "$LOG" 2>/dev/null; then echo "Auto-update có lỗi trên $(hostname)" | \ mail -s "[ALERT] Update failed on $(hostname)" admin@example.com fi

# Kiểm tra có update pending quá lâu không PENDING=$(apt list --upgradable 2>/dev/null | grep -c upgradable) if [ "$PENDING" -gt 10 ]; then echo "$PENDING packages chờ update trên $(hostname)" | \ mail -s "[WARNING] $PENDING pending updates on $(hostname)" admin@example.com fi

Thêm vào crontab để chạy hàng ngày:

0 8 * * * /usr/local/bin/check-update-status.sh

Nếu bạn dùng monitoring stack như Prometheus + Grafana hoặc Zabbix, có thể tích hợp metric số package pending update vào dashboard để theo dõi trực quan hơn.

Checkpoint: Xác nhận mọi thứ hoạt động

Sau khi thiết lập xong, chạy qua checklist này để đảm bảo auto-update hoạt động đúng:

1. Kiểm tra service/timer đang chạy:

# Ubuntu
systemctl status unattended-upgrades
apt-config dump | grep -i periodic
# AlmaLinux
systemctl status dnf-automatic.timer
systemctl list-timers dnf-*

2. Chạy dry-run:

# Ubuntu
sudo unattended-upgrades --dry-run --debug
# AlmaLinux — chạy dnf-automatic thủ công 1 lần
sudo dnf-automatic

3. Kiểm tra email notification:

# Test gửi mail
echo "Test auto-update notification" | mail -s "Test from $(hostname)" admin@example.com
# Kiểm tra mail queue
mailq

4. Xem log lần update gần nhất:

# Ubuntu
tail -20 /var/log/unattended-upgrades/unattended-upgrades.log
# AlmaLinux
journalctl -u dnf-automatic.service --since "24 hours ago"

5. Verify cấu hình:

# Ubuntu — kiểm tra allowed origins
grep -v "^//" /etc/apt/apt.conf.d/50unattended-upgrades | grep -A5 "Allowed-Origins"
# AlmaLinux — kiểm tra config
grep -E "^(apply_updates|upgrade_type|emit_via)" /etc/dnf/automatic.conf

Nếu tất cả các bước trên đều cho kết quả đúng, bạn đã có một hệ thống tự động cập nhật bảo mật hoạt động ổn định. Từ giờ, thay vì lo lắng về việc quên update, bạn chỉ cần thỉnh thoảng kiểm tra log để đảm bảo mọi thứ vẫn chạy tốt.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI