Security

Cấu hình unattended-upgrades tự động cập nhật bảo mật cho VPS Linux

SSH vào VPS Linux mới, lệnh đầu tiên của mình không phải cài stack web hay Docker, mà là bảo đảm hệ thống sẽ tự động vá lỗi bảo mật khi mình không để ý. Bạn quên cập nhật một tuần, đủ để CVE công bố rồi bị khai thác. Unattended-upgrades là bước tối thiểu để biến VPS từ con tin thành máy chủ biết tự bảo vệ. Bài này hướng dẫn trên Ubuntu 24.04 LTS, nhưng cách làm áp dụng được cho Debian 12/13 với sai lệch nhỏ.

Mình đã dùng unattended-upgrades suốt 5 năm qua, chỉ gặp đúng một lần phiền phức khi nó tự upgrade kernel và quên chạy reboot. Từ đó mình học cách cấu hình đúng, bật vá kernel nhưng không tự reboot, hoặc reboot có kiểm soát. Dưới đây là cách làm ổn định nhất.

Tóm tắt nhanh

  • Unattended-upgrades cập nhật tự động các gói thuộc kho bảo mật Ubuntu (jammy-security), không đụng vào upgrade phiên bản chính (dist-upgrade).
  • Mặc định chỉ update security, không tự động reboot sau cập nhật kernel. Bạn muốn reboot không? Cấu hình thêm.
  • Kiểm tra trạng thái bằng systemctl status unattended-upgrades.service và log tại /var/log/unattended-upgrades/unattended-upgrades.log.
  • Dễ dàng whitelist hoặc blacklist gói cụ thể, điều chỉnh tần suất chạy của APT timer systemd.

Yêu cầu trước khi bắt đầu

  • VPS chạy Ubuntu 24.04 LTS (hoặc Debian 12/13) với quyền sudo/root.
  • Đã cấu hình APT sources.list mặc định (không xoá kho security).
  • Hiểu cơ bản về APT và systemd, nhưng mình sẽ giải thích từng lệnh.

Bước 1 - Cài đặt unattended-upgrades

Gói unattended-upgrades có sẵn trong kho Ubuntu chính thức. Thực tế trên bản desktop nó đã được cài sẵn, nhưng trên Ubuntu Server (ảo hoá KVM) thì chưa chắc. Chạy lệnh này để cài:

sudo apt update
sudo apt install unattended-upgrades apt-listchanges -y

apt-listchanges là gói phụ giúp hiển thị changelog của gói trước khi cập nhật, tuyến log, hữu ích để kiểm tra sau.

Verify:

sudo systemctl status unattended-upgrades.service

Output mong đợi: Active: active (running). Nếu inactive, chạy sudo systemctl enable --now unattended-upgrades.service để kích hoạt và chạy ngay.

Bước 2 - Cấu hình cơ bản: chỉ cập nhật bản vá bảo mật

File cấu hình chính là /etc/apt/apt.conf.d/50unattended-upgrades. Mình sẽ chỉnh sửa để đảm bảo chỉ update từ kho security, hiếm khi tự động upgrade bản phát hành (như 24.04 lên 26.04).

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

Trong file, tìm dòng khai báo Unattended-Upgrade::Allowed-Origins. Đây là danh sách các origin (kho) được phép cập nhật. Giữ nguyên các dòng mặc định, chúng đã đúng cho Ubuntu:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    // "${distro_id}:${distro_codename}-updates";
    // "${distro_id}:${distro_codename}-proposed";
    // "${distro_id}:${distro_codename}-backports";
};

Chỉ dòng -security không bị comment (//). Các dòng khác nếu mở comment sẽ cho phép cập nhật từ kho updates (gói ổn định hằng ngày), proposed (gói thử nghiệm) hoặc backports. Mình khuyên giữ nguyên chỉ security, đỡ rủi ro, vì updates đôi khi vẫn gây regression.

Tiếp theo, tìm và sửa dòng Unattended-Upgrade::Remove-Unused-Kernel-Packages thành true:

Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

Việc này giúp dọn kernel cũ sau khi cập nhật, tránh đầy phân vùng /boot.

Verify cấu hình: không có lệnh kiểm tra trực tiếp. Bạn có thể chạy dry-run để xem unattended-upgrades sẽ làm gì với các gói hiện tại:

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

Output dài, tìm dòng Allowed origins are: .... Nếu chỉ thấy jammy-security, bạn đã đúng.

Bước 3 - Cấu hình hành vi: gửi email, reboot, tần suất

Ngoài origin, file 50unattended-upgrades còn có vài tham số quan trọng:

Tham sốGiá trị mình dùngGiải thích
Unattended-Upgrade::Automatic-RebootfalseKhông tự reboot. Kernel mới sẽ chờ reboot thủ công hoặc theo lịch.
Unattended-Upgrade::Automatic-Reboot-Time"02:00"Nếu bật reboot, đặt giờ. Mình để false nên dòng này không dùng.
Unattended-Upgrade::Mail"root"Gửi email cho root khi có lỗi hoặc cập nhật. Cần MTA (postfix, msmtp).
Unattended-Upgrade::Remove-Unused-Dependencies"true"Dọn các gói phụ không còn cần, giống apt autoremove.

Mình thích để Automatic-Reboot false và tự reboot khi đã kiểm tra thủ công. Nếu bạn có nhiều VPS, có thể bật reboot vào 4h sáng. Nhưng nếu có dịch vụ critical, mình khuyên đừng tự reboot, dùng livepatch hoặc reboot khi bảo trì định kỳ.

Nếu muốn gửi email, cài postfix kiểu satellite:

sudo apt install postfix -y
# Trong quá trình cài, chọn "Satellite system" và nhập SMTP relay của bạn

Chỉnh Unattended-Upgrade::Mail "[email protected]"; trong file 50unattended-upgrades. Test bằng cách chạy:

sudo unattended-upgrades --dry-run --debug 2>&1 | grep -i mail

Nếu thấy dòng gửi mail, cấu hình đúng.

Tần suất chạy được quản lý bởi systemd timer apt-daily.timerapt-daily-upgrade.timer. Mặc định, APT kiểm tra update mỗi 12 tiếng. Bạn có thể xem cấu hình:

systemctl cat apt-daily-upgrade.timer

Output mặc định Ubuntu 24.04: OnCalendar=*-*-* 6:0012:00. Không cần đổi trừ khi có nhu cầu đặc biệt. Nếu muốn chạy mỗi ngày 1 lần, chỉnh file /lib/systemd/system/apt-daily-upgrade.timer (nhưng mình giữ mặc định, 2 lần/ngày là an toàn).

Bước 4 - Chặn gói cụ thể không cho tự động cập nhật

Có gói bạn không muốn động đến: ví dụ nginx tự custom, docker-ce từ repo riêng, hoặc php8.3-fpm đang chạy ổn định. Blacklist dễ dàng:

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

Thêm dòng này:

Unattended-Upgrade::Package-Blacklist {
    "nginx";
    "docker-ce";
    "php8\\.3";
};

Lưu ý: blacklist dùng regex, nên php8\.3 (dấu chấm escape) không trùng php8.3-fpm nhưng cần thoát đúng. Test bằng dry-run để coi nó có ignored không.

Ngược lại, nếu bạn chỉ muốn tự động update một vài gói (ví dụ libssl, openssh-server) thì dùng Unattended-Upgrade::Package-Whitelist, nhưng mình ít dùng, vì rủi ro bỏ lỡ bản vá không có trong whitelist.

Bước 5 - Kiểm tra và theo dõi log thường xuyên

Unattended-upgrades ghi log vào /var/log/unattended-upgrades/unattended-upgrades.log. Xem nó thường xuyên, mỗi sáng SSH vào chạy lệnh:

sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

Bạn sẽ thấy dạng:

2026-04-10 03:15:01,231 INFO Starting unattended upgrades script
2026-04-10 03:15:01,233 INFO Allowed origins are: o=Ubuntu,a=jammy-security
2026-04-10 03:15:04,067 INFO Packages that will be upgraded: libssl3 openssh-server
2026-04-10 03:15:04,068 INFO Writing dpkg log to /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
2026-04-10 03:15:07,891 INFO All upgrades installed

Nếu thấy dòng INFO All upgrades installed, yên tâm. Nếu thấy ERROR hoặc WARNING, cần xem nguyên nhân.

Log dpkg chi tiết hơn:

sudo tail -100 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log

Để nhận thông báo qua Telegram, bạn có thể viết script Bash kiểm tra log và gửi alert, mình làm thế cho mấy VPS production, vì không muốn phụ thuộc vào email hệ thống. Bài gửi cảnh báo qua Telegram bot có thể kết hợp để giám sát log unattended-upgrades.

Xử lý lỗi thường gặp

Lỗi 1: Unattended-upgrades không chạy, kiểm tra trạng thái thấy inactive

Nguyên nhân thường do gói chưa enable systemd unit. Chạy:

sudo systemctl enable --now unattended-upgrades.service

Kiểm tra lại:

sudo systemctl status unattended-upgrades.service

Nếu vẫn dead, xem journalctl -u unattended-upgrades.service -n 20 --no-pager để đọc log lỗi chi tiết. Thường thiếu gói phụ hoặc Python version conflict, cài lại gói là hết.

Lỗi 2: "dpkg was interrupted" sau lần chạy trước bị crash

sudo dpkg --configure -a
sudo apt install -f
sudo systemctl restart unattended-upgrades.service

Sau đó kiểm tra log.

Lỗi 3: Không tìm thấy kho security, thường do custom sources.list sai

grep -r security /etc/apt/sources.list /etc/apt/sources.list.d/

Output phải có dòng chứa jammy-security hoặc noble-security. Nếu thiếu, thêm:

echo "deb http://archive.ubuntu.com/ubuntu noble-security main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/security.list
sudo apt update

Thay noble = jammy nếu là Ubuntu 22.04. Kiểm tra codename VPS của bạn bằng lsb_release -cs.

Câu hỏi thường gặp

Unattended-upgrades có tự động cài kernel update không?

Có, nếu bản vá kernel nằm trong kho security (thường là CVE cao), nó sẽ được cập nhật và cài đặt. Nhưng mặc định không reboot; bạn cần reboot thủ công hoặc cấu hình Automatic-Reboot "true" để kernel mới có hiệu lực.

Tôi có thể dùng unattended-upgrades cho các kho không phải security không?

Được. Bạn mở comment dòng -updates hoặc thêm custom origin trong Allowed-Origins. Nhưng mình khuyên chỉ mở security trên production, risk của updates thông thường thấp nhưng đôi khi gây regression khó debug.

Làm sao để biết unattended-upgrades đã chạy thành công hôm qua?

Dùng lệnh: sudo journalctl -u unattended-upgrades.service --since "yesterday" --no-pager. Hoặc đọc log file: sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log. Nếu thấy All upgrades installed, tức là đã thành công.

Unattended-upgrades có làm downtime service không?

Có thể, khi cập nhật các service nhạy (nginx, mysql, ssh…), APT restart chúng sau khi cài gói mới. Với service được cấu hình đúng (systemd restart on-failure), downtime chỉ vài giây. Nếu không chấp nhận downtime, bạn nên dùng canary deployment hoặc cập nhật thủ công theo lịch bảo trì.

Tôi có thể chạy unattended-upgrades trên VPS Windows Server không?

Không. Unattended-upgrades là công cụ dành riêng cho Debian/Ubuntu APT. Trên Windows Server, bạn dùng chính sách Windows Update hoặc WSUS. Nếu bạn đang dùng VPS Windows, bật tự động cập nhật qua Settings > Windows Update.

Nếu VPS của tôi hết dung lượng /boot, unattended-upgrades có bị fail không?

Có, và đó là lỗi thường gặp. Khi /boot đầy vì kernel cũ, unattended-upgrades không thể cài kernel mới. Giải pháp: bật Remove-Unused-Kernel-Packages true và kiểm tra thường xuyên. Thêm script dọn /boot tự động trong crontab nếu cần.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.