Cập nhật Ubuntu xong vẫn dính lỗi bảo mật? Dùng ngay needrestart để xử lý triệt để

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Vấn đề: Tại sao apt upgrade xong hệ thống vẫn chưa thực sự an toàn?

Hồi mới chuyển từ CentOS sang Ubuntu, mình từng vấp một vố khá đau. Dù đã chạy sudo apt upgrade đều đặn và hệ thống báo cập nhật thành công các gói bảo mật quan trọng như OpenSSL hay libc, nhưng khi kiểm tra kỹ bằng lệnh lsof, mình tá hỏa nhận ra các tiến trình Nginx và PHP-FPM vẫn đang nạp các thư viện cũ từ RAM.

Về cơ bản, file trên đĩa cứng đã mới, nhưng code đang chạy trong bộ nhớ vẫn là bản cũ đầy lỗ hổng. Cách giải quyết “xôi thịt” nhất là reboot toàn bộ server. Tuy nhiên, với các hệ thống production yêu cầu uptime 99.99%, việc khởi động lại máy chủ chỉ vì một bản vá nhỏ là điều cực kỳ xa xỉ. Đó là lý do needrestart ra đời. Nó giúp bạn chỉ điểm chính xác dịch vụ nào cần “F5” mà không làm gián đoạn toàn bộ hệ thống.

Cài đặt và sử dụng trong 30 giây

Trên các bản Ubuntu Server hiện đại (từ 20.04 trở đi), needrestart thường có sẵn. Nếu server của bạn chưa có, việc cài đặt chỉ tốn khoảng 10MB dung lượng disk.

1. Cài đặt nhanh

sudo apt update && sudo apt install needrestart -y

2. Kiểm tra thủ công

Để quét xem có “tàn dư” nào đang chạy trong RAM không, bạn dùng lệnh:

sudo needrestart

Nếu hệ thống đã sạch, bạn sẽ nhận được thông báo hóm hỉnh: “Your power is great. I mean… everything is up to date.”. Ngược lại, một giao diện ncurses sẽ hiện ra, liệt kê danh sách các dịch vụ đang dùng thư viện cũ để bạn chọn khởi động lại ngay lập tức.

Cơ chế hoạt động: Tại sao nó thông minh?

Khi bạn cập nhật một file .so (shared object), APT sẽ ghi đè file mới lên đĩa cứng. Tuy nhiên, các tiến trình (process) đang chạy vẫn giữ một “handle” trỏ vào vùng nhớ chứa nội dung file cũ. needrestart quét thư mục /proc để tìm các mapping bộ nhớ trỏ vào các file đã bị đánh dấu là ‘deleted’.

Công cụ này tập trung vào 4 nhiệm vụ chính:

  • Library check: Quét các tiến trình đang nạp thư viện lỗi thời.
  • Kernel check: So sánh phiên bản Kernel đang chạy (với uname -r) và bản mới nhất vừa cài.
  • Microcode check: Kiểm tra xem CPU có cần nạp microcode mới để vá các lỗi như Spectre hay Meltdown không.
  • APT Hook: Tự động nhảy ra nhắc nhở mỗi khi bạn kết thúc lệnh apt upgrade.

Cấu hình cho môi trường Production

Mặc định, needrestart sẽ chặn tiến trình update để hỏi ý kiến người dùng qua màn hình xanh (interactive). Điều này khá phiền nếu bạn đang chạy script tự động hoặc dùng Ansible.

Hãy điều chỉnh file cấu hình tại:

sudo nano /etc/needrestart/needrestart.conf

Tùy chỉnh chế độ Restart

Tìm tham số $nrconf{restart} và chọn một trong ba giá trị:

  • 'i' (interactive): Hỏi qua giao diện (mặc định).
  • 'a' (automatic): Tự động restart luôn. Cảnh báo: Có thể gây gián đoạn dịch vụ đột ngột.
  • 'l' (list only): Chỉ ghi log và liệt kê, không làm gì cả. Đây là lựa chọn an toàn nhất cho server quan trọng.

Đưa dịch vụ nhạy cảm vào Blacklist

Nếu không muốn needrestart chạm vào Database (như MySQL hay PostgreSQL) vì sợ hỏng dữ liệu khi shutdown đột ngột, bạn có thể cấu hình bỏ qua:

$nrconf{override_rc} = {
    qr(^mysql) => 0,
    qr(^postgresql) => 0,
};

Kinh nghiệm thực tế từ hiện trường

Đừng phớt lờ cảnh báo Kernel

Khác với thư viện ứng dụng, Kernel không thể khởi động lại từng phần. Nếu needrestart báo cần reboot Kernel, hãy lên kế hoạch bảo trì sớm. Các bản vá Kernel thường liên quan đến quyền root hoặc thoát khỏi container (container escape).

Tận dụng Batch Mode cho Automation

Nếu quản lý hàng chục server, bạn không thể ngồi soi từng màn hình. Hãy dùng flag -b để lấy output dạng máy học:

sudo needrestart -b

Kết hợp với grep, bạn có thể viết một script nhỏ để đẩy thông báo qua Telegram mỗi khi có server cần can thiệp.

Lưu ý về Docker và Container

Một điểm yếu nhỏ là needrestart đôi khi quét nhầm cả các tiến trình chạy bên trong Docker container nếu chạy trực tiếp trên Host. Với Docker, quy tắc vàng vẫn là: Build lại Image mới -> Pull -> Restart Container. Đừng cố dùng needrestart để khởi động lại dịch vụ bên trong một container đang chạy.

Lời kết

needrestart là trợ thủ đắc lực giúp bạn quản trị Ubuntu chuyên nghiệp hơn. Nó loại bỏ việc phỏng đoán và giúp bạn biết chính xác khi nào cần hành động. Với mình, đây là công cụ “phải có” (must-have) ngay sau khi cài đặt OS để đảm bảo mọi bản vá bảo mật thực sự phát huy tác dụng chứ không chỉ nằm chờ trên ổ cứng.

Share: