Máy chủ được cấu hình một lần rồi sau đó tự sống tiếp. Một tháng sau, vài gói đang chờ nâng cấp, chứng chỉ đã tiến vào khoảng ba tuần trước hạn, sau khi cài một thứ chẳng liên quan thì trong cấu hình SSH xuất hiện thêm một dòng thừa, còn cái jail lẽ ra phải canh các lần đăng nhập thì đã dừng mà không ai hay. Chẳng thứ nào trong số đó kêu lên. Tất cả chỉ lặng lẽ thôi còn đúng.

Dưới đây là mười hai thứ đáng kiểm tra đều đặn, kèm câu lệnh. Một vòng mất chừng mười lăm phút. Thứ tự đi từ cái người ta vào qua đó đến cái tự hỏng.

SSH: năm dòng

Thứ cần xem không phải tệp mà là cấu hình có hiệu lực: nó được ghép từ /etc/ssh/sshd_config, toàn bộ thư mục sshd_config.d và các giá trị mặc định của bản dựng.

sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'

Những gì chúng ta muốn thấy: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries ở mức 3–4 và x11forwarding no. Ba dòng đầu là cánh cửa, hai dòng cuối là bản lề của nó — một mức trần cho số lần thử trên mỗi kết nối, và việc chuyển tiếp đồ họa mà máy chủ chẳng dùng vào việc gì.

Hai lưu ý, cả hai đều là cách dễ dàng để tự khóa mình ở ngoài. Thứ nhất: đừng tắt đăng nhập bằng mật khẩu và đăng nhập root trước khi đã xác nhận khóa của bạn hoạt động — trong một phiên riêng, không đóng phiên hiện tại. Nếu bạn đang đọc điều này khi đăng nhập với tư cách root bằng mật khẩu, chính hai dòng ấy sẽ khóa bạn ở ngoài.

Thứ hai: thứ tự các tệp. OpenSSH lấy giá trị của một tham số mà nó gặp đầu tiên, còn các tệp trong sshd_config.d được đọc theo thứ tự chữ cái. Ảnh đám mây thường để lại ở đó một 50-cloud-init.conf, và nó sẽ thắng tệp của bạn nếu bạn đặt tên kiểu 90-hardening.conf. Thiết lập của bạn nên nằm dưới một con số nhỏ hơn — 00- hoặc 10-. Còn kết quả thì kiểm bằng sshd -T, chứ không phải bằng cách đọc tệp.

Tường lửa: một lần kiểm tra

sudo ufw status verbose

Ở đây cần nhớ rằng kết xuất này cho thấy ý định chứ không phải kết quả. Một quy tắc có thể nằm trong danh sách mà chẳng đóng gì: bản thân UFW đang tắt, cổng được phục vụ bởi thứ gì đó do Docker công bố (nó ghi quy tắc riêng vào iptables bên dưới UFW), hoặc lưu lượng đến máy chủ theo đường khác. Vì vậy nên đối chiếu danh sách quy tắc với thứ thực sự đang lắng nghe ra bên ngoài:

sudo ss -tulpn | grep -v '127.0.0.1\|::1'

fail2ban: hai lần kiểm tra

Dịch vụ chạy thôi chưa đủ — còn cần một jail hoạt động cho SSH.

sudo fail2ban-client status
sudo fail2ban-client status sshd

Rắc rối hay gặp nhất ở đây là một jail câm lặng. Trên Debian 12 và các bản Ubuntu mới, /var/log/auth.log có thể không tồn tại: rsyslog không được cài và các bản ghi chỉ sống trong journald. Jail với logpath mặc định khi ấy vẫn khởi động, vẫn báo mình đang hoạt động, và không bao giờ chặn ai. Cách chữa là trỏ nó vào journal của systemd:

printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban

Dấu hiệu bắt được chuyện này mà không cần lục cấu hình: trong fail2ban-client status sshd, «Currently failed» và «Total failed» đứng ở số không trong khi journal rõ ràng có những lần đăng nhập thất bại.

Cập nhật: ba lần kiểm tra

Riêng rẽ: tổng cộng bao nhiêu gói đang chờ, trong đó bao nhiêu thuộc về bảo mật, và hệ thống có đòi khởi động lại sau khi cập nhật nhân hay không.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'cần khởi động lại'

Lần kiểm tra thứ ba là xem cập nhật bảo mật tự động có đang bật không, để hai lần đầu không biến thành nghi thức hằng tháng:

systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades

Trong tệp đó cả hai dòng đều phải là 1. Nếu thiếu gói: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Chứng chỉ: một lần kiểm tra

Chứng chỉ Let's Encrypt sống chín mươi ngày, và việc gia hạn thường tự chạy cho đến đúng cái ngày nó thôi chạy. Thứ cần xem không phải bảng của nhà đăng ký mà là thứ máy chủ thực sự phục vụ:

echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run

Lệnh thứ nhất cho biết ngày hết hạn của chứng chỉ được phục vụ cho tên đó; lệnh thứ hai xác nhận việc gia hạn sẽ trót lọt mà không phải đợi tới hạn thật. Nên đi qua tất cả các tên mà máy chủ phục vụ, không chỉ tên miền chính: thứ hay bị quên là tên miền phụ được thêm vào sau.

Đĩa: một lần kiểm tra

df -h
df -i

Hai lệnh, vì dung lượng và bản ghi tệp cạn kiệt độc lập với nhau. Trên phần lớn máy chủ, cái thứ hai chạm trần trước — hàng triệu tệp nhỏ trong các phiên PHP hoặc trong bộ đệm ứng dụng đẩy IUse% lên 100 trong khi vẫn còn trống hàng gigabyte. Về cả hai trường hợp chúng tôi có một bài riêng.

Danh sách này có gì không ổn

Danh sách thì đúng, nhưng nó có một tính chất: nó đòi phải có ai đó nhớ tới nó. Mười lăm phút mỗi tuần không nhiều, chừng nào máy chủ còn một và chừng nào còn lý do. Sau hai tháng yên ả, vòng kiểm tra bị bỏ, và chuyện jail đã dừng thì biết được từ nhật ký của người khác.

Vì vậy chúng tôi gom đúng mười hai lần kiểm tra này vào một bảng miễn phí riêng — Arcivéo FREE. Nó cài bằng một lệnh, chạy trên máy chủ của bạn, không gửi gì cho chúng tôi và không cần đăng ký. Một bộ thu chạy từ cron mỗi năm phút và ghi đúng những thứ đó vào một cơ sở dữ liệu cục bộ: đăng nhập SSH và các kết nối bị từ chối, trạng thái của UFW và fail2ban, cập nhật bảo mật đang chờ, hạn của chứng chỉ, dung lượng đĩa. Lịch sử là bảy ngày, giao diện có 34 ngôn ngữ. Giá bằng không, kể cả trên máy chủ công việc: giấy phép cho phép cài bảng này lên máy của bạn, gồm cả máy của công ty, và không cho phép bán lại hay vận hành nó như một dịch vụ cho máy chủ của người khác.

Ngăn xếp của bản miễn phí khá khiêm tốn: nó cài và bật UFW cùng fail2ban, rồi từ đó hiển thị trạng thái. ModSecurity, Suricata, AIDE và các mô-đun còn lại không có trong đó, chúng thuộc về bản trả phí. Nhưng để thôi mang vòng kiểm tra hằng tuần trong đầu thì thế là đủ. Cùng những dữ liệu ấy trông ra sao trên bảng đầy đủ — xem các trang demo bên dưới.