Phần lớn các vụ đột nhập máy chủ thành công không diễn ra qua một exploit tinh vi mà qua một lỗ hổng đã có bản vá từ vài tháng trước. Nguyên nhân thường không phải là lười: cập nhật bằng tay trên máy chủ đang chạy thật đáng sợ, vì đôi khi apt upgrade khởi động lại những thứ chẳng ai yêu cầu. Cập nhật tự động giải quyết câu hỏi đó, nhưng chúng có tiếng xấu — xứng đáng đúng bằng mức độ chúng được cấu hình vội vàng.

Hãy xem một cách sắp đặt mà bản vá bảo mật tự đến còn phiên bản PHP không đổi qua một đêm.

Cài đặt

sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades

Hộp thoại này tạo ra /etc/apt/apt.conf.d/20auto-upgrades. Hãy kiểm tra xem kết quả là gì:

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

Các số một có nghĩa là «hằng ngày». Tất cả được điều khiển bởi timer của systemd chứ không phải cron cổ điển:

systemctl list-timers | grep apt

Điều quan trọng nhất: chỉ bảo mật

Tệp chính là /etc/apt/apt.conf.d/50unattended-upgrades. Trong đó có danh sách Allowed-Origins (trên Debian là Origins-Pattern), và theo mặc định ở đó chỉ có kho bảo mật được bật. Hãy để nguyên như vậy.

Cám dỗ bỏ chú thích dòng -updates — «cứ cho cập nhật hết đi» — là rất mạnh. Đừng làm: kho updates mang đến các phiên bản mới chứ không chỉ bản sửa lỗi, và những bất ngờ ban đêm đến chính từ đó. Bảo mật và độ mới là hai việc khác nhau, và việc thứ hai nên làm khi bạn đang ngồi trước bàn phím.

Nếu có gói nào không được phép cập nhật tự động thì đã có danh sách đen cho nó:

Unattended-Upgrade::Package-Blacklist {
    "mariadb-server";
    "php8.3-fpm";
};

Hãy dùng nó một cách có ý thức: mỗi dòng ở đây nghĩa là «cái này tôi tự cập nhật» — và đó là lời hứa phải giữ.

Khởi động lại

Dòng then chốt:

Unattended-Upgrade::Automatic-Reboot "false";

Để nó ở false là đúng với máy chủ có trang web: một lần khởi động lại lúc ba giờ sáng không báo trước còn tệ hơn một bản vá hoãn lại một ngày. Nhưng quyết định đó có nửa sau bắt buộc, và chính nửa đó bị người ta quên.

Khi nhân, libc hoặc openssl được cập nhật, hệ thống tạo tệp /var/run/reboot-required. Cho tới khi khởi động lại, phiên bản đã sửa nằm trên đĩa còn phiên bản cũ vẫn chạy trong bộ nhớ — tức là lỗ hổng chẳng đi đâu cả, dù gói được coi là đã cập nhật. Hãy kiểm tra một cách rõ ràng:

ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs

Tệp thứ hai cho biết chính xác cái gì khiến việc khởi động lại là cần thiết. Quy tắc đơn giản: thấy cờ là lên kế hoạch cho một khung thời gian trong một hai ngày tới, chứ không phải «lúc nào đó».

Các thư viện là trường hợp riêng. openssl được cập nhật trong khi nginx và PHP-FPM vẫn chạy với phiên bản cũ trong bộ nhớ, và cờ khởi động lại thậm chí không xuất hiện. Ai cần khởi động lại thì needrestart sẽ cho biết:

sudo apt install needrestart
sudo needrestart -b

Chỉ cần đặt nó ở chế độ «báo cáo, đừng hỏi» — nếu không nó sẽ bắt đầu đặt câu hỏi giữa một lần cài đặt không tương tác và làm treo lần cài đó. Để làm vậy, hãy thả vào /etc/needrestart/conf.d/ một tệp với dòng $nrconf{restart} = 'l';.

Hãy kiểm tra xem nó có hoạt động không

Chạy thử mà không cài:

sudo unattended-upgrade --dry-run --debug

Kết quả cho thấy gói nào khớp quy tắc và gói nào bị loại cùng lý do. Những gì thực sự đã xảy ra thì nằm trong nhật ký:

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

Hiện có bao nhiêu bản cập nhật đang chờ:

apt list --upgradable 2>/dev/null | grep -i security

Lệnh cuối này là hữu ích nhất trong cả nhóm. Cập nhật tự động đã cấu hình có thói quen hỏng một cách lặng lẽ: /boot hết chỗ, kho đổi khóa, timer bị tắt sau một lần chỉnh sửa bằng tay nào đó. Bề ngoài mọi thứ ổn, còn bản vá thì đã nhiều tháng không được cài.

Dung lượng trên /boot

Tình huống kinh điển: các nhân cũ không bị xóa, phân vùng /boot đầy lên, việc cài nhân mới thất bại, và toàn bộ việc cập nhật dừng lại. Vài tháng một lần đáng để nhìn qua:

df -h /boot
sudo apt autoremove --purge

Hoặc bật việc dọn dẹp tự động ngay trong 50unattended-upgrades: Remove-Unused-Kernel-Packages "true"Remove-Unused-Dependencies "true".

Còn lại gì cho con người

Cập nhật tự động loại bỏ công việc lặp đi lặp lại nhưng không loại bỏ việc theo dõi. Hai câu hỏi mà bạn nên trả lời được bất cứ lúc nào: có bao nhiêu bản cập nhật bảo mật đang chờ, và cờ khởi động lại có được đặt không. Cả hai câu trả lời là một dòng trên một trang, và toàn bộ ý nghĩa là dòng đó phải tự đập vào mắt chứ không phải chờ bạn chủ động đi tìm mỗi quý một lần.