Dùng systemd-analyze security để ‘siết’ bảo mật Linux Service: Từ 9.6 xuống 2.0 trong 5 phút

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Tại sao bạn nên quan tâm đến bảo mật của từng Service?

Đa số anh em cài Nginx, Database hay app Node.js xong là thôi, miễn chạy được là được. Nhưng thực tế, nhiều service mặc định đang nắm giữ những đặc quyền “thừa thãi”. Nếu app dính lỗi RCE (Remote Code Execution), hacker sẽ ngay lập tức thừa hưởng các quyền đó. Nếu service đang chạy dưới quyền root, coi như toàn bộ server của bạn đã rơi vào tay kẻ xấu.

Sau 6 tháng dùng systemd-analyze security để audit hệ thống production, mình thấy đây là công cụ cực kỳ lợi hại. Nó không chỉ chỉ ra lỗ hổng mà còn chấm điểm cụ thể. Bạn sẽ biết chính xác cần phải “khóa” chỗ nào để giảm thiểu rủi ro bị leo thang đặc quyền.

Quick Start: Chấm điểm bảo mật hệ thống trong 5 phút

Bạn không cần cài thêm bất kỳ tool bên thứ ba nào. Công cụ này đã có sẵn trong các bản phân phối dùng systemd như Ubuntu, CentOS hay Debian. Để kiểm tra nhanh độ an toàn của toàn bộ các service đang chạy, hãy gõ lệnh:

systemd-analyze security

Kết quả trả về là một bảng thống kê gồm: UNIT (tên service), EXPOSURE (mức độ rủi ro) và STATUS. Thang điểm chạy từ 0.0 đến 10.0. Điểm 0.0 nghĩa là service đã được sandbox cực kỳ kỹ lưỡng, còn 10.0 là mức báo động đỏ.

Muốn soi kỹ hơn một service cụ thể, chẳng hạn nginx.service, bạn dùng lệnh:

systemd-analyze security nginx.service

Lúc này, systemd sẽ liệt kê một checklist chi tiết với hàng chục tiêu chí. Cái nào đạt sẽ hiện dấu (✓), cái nào chưa đạt hiện (✗). Đây chính là lộ trình để bạn bắt đầu gia cố hệ thống.

Giải thích các thông số bảo mật “đắt giá” nhất

Bảng phân tích có thể khiến bạn choáng ngợp vì quá nhiều thông số. Tuy nhiên, hãy tập trung vào 5 mục quan trọng sau đây để kéo điểm bảo mật xuống nhanh nhất:

  • PrivateTmp: Khi bật (yes), service sẽ có thư mục /tmp riêng. App A không thể nhìn thấy hoặc can thiệp vào file tạm của App B.
  • ProtectSystem: Chế độ này ngăn service ghi đè vào các thư mục nhạy cảm như /usr, /boot hay /etc.
  • NoNewPrivileges: Đảm bảo tiến trình con không bao giờ có thể chiếm quyền cao hơn tiến trình cha, chặn đứng các đòn tấn công sudo-trick.
  • CapabilityBoundingSet: Thay vì cho phép toàn quyền root, bạn chỉ cấp đúng những quyền kernel tối thiểu mà service cần.
  • ProtectHome: Ngăn service “thò tay” vào dữ liệu cá nhân trong thư mục /home/root.

Thực hành: Thắt chặt quyền hạn cho một Python Service

Giả sử mình có một app Python tự viết đang bị chấm 9.6 điểm (UNSAFE). Để gia cố, mình sẽ dùng lệnh systemctl edit thay vì sửa trực tiếp file trong /lib/systemd/system/. Cách này giúp cấu hình không bị mất khi bạn update package.

sudo systemctl edit my-python-app.service

Thêm đoạn cấu hình sau vào phần [Service]:

[Service]
# Không bao giờ chạy bằng root
User=myuser
Group=mygroup

# Kích hoạt sandbox
PrivateTmp=yes
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes
ProtectControlGroups=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
MemoryDenyWriteExecute=yes

# Chỉ cho phép bind port nếu cần (ví dụ port 80/443)
# CapabilityBoundingSet=CAP_NET_BIND_SERVICE

Lưu lại và áp dụng cấu hình mới bằng lệnh:

sudo systemctl daemon-reload
sudo systemctl restart my-python-app.service

Kiểm tra lại bằng systemd-analyze security, bạn sẽ thấy điểm số giảm mạnh xuống dưới 3.0 (mức SAFE). Đây là kết quả rất ấn tượng chỉ sau vài dòng config.

Kinh nghiệm thực tế khi triển khai Production

Thắt chặt bảo mật quá đà thường khiến app bị lỗi “Permission Denied”. Đừng nóng vội. Hãy áp dụng chiến thuật “sai đâu sửa đó”.

Đầu tiên, hãy bật từng tính năng một. Sau mỗi thay đổi, hãy dùng lệnh journalctl -u my-service -f để theo dõi log thời gian thực. Nếu app không thể ghi file hoặc không kết nối được database, bạn sẽ biết ngay do option nào gây ra.

Thứ hai, đừng quá ám ảnh với con số 0.0 tuyệt đối. Một số service đặc thù buộc phải giữ lại quyền cao để hoạt động bình thường. Mục tiêu cuối cùng là thu hẹp bề mặt tấn công (Attack Surface) chứ không phải làm khó chính mình.

Cuối cùng, khi tạo user riêng để chạy service, hãy dùng các công cụ như password generator để đảm bảo mật khẩu có độ phức tạp cao. Điều này giúp ngăn chặn các đòn tấn công brute-force vào tài khoản service.

Kết luận

systemd-analyze security là trợ thủ đắc lực giúp bạn hiểu rõ “sức khỏe” của server. Dành 15 phút tinh chỉnh các chỉ số này sẽ giúp hệ thống của bạn khó bị xâm nhập hơn gấp nhiều lần. Chúc anh em cấu hình an toàn và có những đêm ngon giấc!

Share: