Câu hỏi này hiếm khi xuất hiện từ hư không. Máy chủ chậm đi, nhà cung cấp hosting gửi thư về lưu lượng đi ra, hoặc trong hộp thư có thông báo đăng nhập mà bạn không hề thực hiện. Sau đó phần khó chịu bắt đầu: không rõ phải xem gì và theo thứ tự nào, còn phản xạ đầu tiên — xóa sạch rồi cài lại — gần như luôn là vội vàng.
Dưới đây là trình tự kiểm tra mất khoảng hai mươi phút và trong đa số trường hợp cho câu trả lời rõ ràng. Nó đi từ thứ rẻ nhất đến thứ đắt nhất: trước hết là những gì thấy được ngay, rồi mới đến những gì phải so với một chuẩn mực.
Bước một: ai đã đăng nhập
Hãy bắt đầu từ các lần đăng nhập. Nếu có người khác vào được, gần như chắc chắn họ vào qua SSH, và dấu vết vẫn còn.
last -20
lastb | head -20
who
last hiển thị các lần đăng nhập thành công gần đây, lastb hiển thị các lần thất bại, còn who cho biết ai đang kết nối lúc này. Điều quan trọng không phải là số lượng mà là hình dạng của nó. Hàng nghìn lần thử thất bại từ những địa chỉ không bao giờ quay lại là nền nhiễu bình thường; nó chạy liên tục với mọi địa chỉ công khai và chẳng nói lên điều gì.
Điều đáng lo là chuyện khác:
- đăng nhập thành công từ một địa chỉ mà không có người nào của bạn ở đó;
- đăng nhập dưới một tên người dùng mà bạn chưa từng tạo;
- các lần thử thất bại với một tên thực sự tồn tại trên máy này — điều đó nghĩa là ai đó đã biết danh sách người dùng của bạn thay vì dò từ điển;
- một phiên đang mở ngay lúc này mà bạn không mở.
Hãy kiểm tra riêng xem có khóa lạ nào xuất hiện không. Tệp ~/.ssh/authorized_keys là cách ở lại phổ biến nhất: đổi mật khẩu bao nhiêu lần cũng được, khóa vẫn còn đó.
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
Mỗi dòng ở đó là quyền truy cập của một ai đó. Nếu bạn không nói được là của ai, hãy coi đó là của người lạ.
Bước hai: những gì đã thay đổi trong hệ thống
Một cuộc xâm nhập gần như luôn để lại dấu vết trên đĩa: một tệp nhị phân bị thay, một dòng thừa trong tệp cấu hình, một tệp mới trong thư mục của máy chủ web. Kiểm tra bằng mắt là vô vọng — cần có chuẩn mực để đối chiếu.
Trên Debian và Ubuntu chuẩn mực đó đã có sẵn: mỗi gói đều biết checksum các tệp của chính mình.
sudo apt install debsums
sudo debsums -c
Lệnh này liệt kê những tệp khác với những gì bản phân phối đã cài. Một phần kết quả sẽ là hợp lệ — các tệp cấu hình trong /etc sinh ra là để sửa. Nhưng một tệp thực thi bị thay đổi trong /usr/bin, /usr/sbin hay /bin trên máy chủ mà bạn chưa từng động tay vào lại là chuyện hoàn toàn khác.
Nguồn thứ hai là các tệp mới ở nơi lẽ ra không có gì mới. Một web shell thường nằm trong thư mục tải lên và trông như một tệp .php vô hại:
find /var/www -type f -name '*.php' -mtime -14 -ls
Mười bốn ngày chỉ là điểm khởi đầu; hãy dùng khoảng thời gian mà bạn chắc chắn đã không đăng gì.
Bước ba: những gì đang đi ra ngoài
Một máy chủ bị chiếm hiếm khi bị đột nhập vì chính nó. Nó bị sử dụng: để gửi thư rác, để đào tiền mã hóa, để với tới các mạng khác, để chứa tệp của người khác. Tất cả những việc đó tạo ra các kết nối đi ra vốn trước đây không có.
ss -tulpn
ss -tp state established
Lệnh đầu cho thấy cái gì đang lắng nghe, lệnh sau cho thấy cái gì đang kết nối lúc này. Hãy đọc cột tiến trình. Những gì gây thắc mắc: một tiến trình lạ lắng nghe trên 0.0.0.0; các kết nối đi ra tới cổng cao của những địa chỉ mà ứng dụng của bạn chẳng có việc gì phải liên hệ; và trên hết là tiến trình khởi chạy từ /tmp hoặc /dev/shm — không có thứ hợp lệ nào chạy từ những thư mục đó.
Nhân tiện hãy xem cả tải hệ thống. Kẻ đào tiền tự lộ diện bằng việc giữ bộ xử lý bận liên tục trên một trang web chẳng có chút mức độ phổ biến nào.
Nếu các dấu hiệu đã xuất hiện
Thôi thúc đầu tiên là dọn dẹp thật nhanh: xóa khóa lạ, dừng tiến trình, xóa tệp. Đừng làm vậy — cùng lúc đó bạn hủy đi chính thứ có thể giải thích sau này họ đã vào bằng cách nào. Và nếu điều đó vẫn chưa sáng tỏ, họ sẽ quay lại, có thể ngay ngày mai.
Trình tự giữ được cả dữ liệu lẫn bức tranh:
- Chụp ảnh đĩa tại nhà cung cấp nếu có thể. Đây là bước duy nhất không thể lặp lại về sau.
- Ngắt máy khỏi mạng, hoặc đóng mọi thứ trừ IP của bạn — nhưng đừng tắt máy. Tắt máy làm mất danh sách tiến trình và các kết nối đang mở, và đó là một nửa bằng chứng.
- Sao chép nhật ký ra khỏi máy:
/var/log/auth.log, nhật ký của máy chủ web, kết quả của ba lệnh phía trên. - Và chỉ đến lúc này mới tìm hiểu họ đã vào bằng cách nào.
Cài lại sạch sẽ là cái kết đúng đắn nếu quyền truy cập đã đạt được với quyền root. Không có công cuộc dọn dẹp nào bảo đảm rằng không còn gì sót lại. Nhưng cài lại mà không hiểu nguyên nhân thì vô nghĩa: bạn sẽ đặt đúng cái lỗ hổng ấy lên hệ thống mới.
Để câu hỏi này không đến bất ngờ
Tất cả những điều trên là một lần kiểm tra thủ công, và nó trả lời câu hỏi «ngay lúc này đang xảy ra chuyện gì». Rắc rối là câu hỏi ấy thường được đặt ra quá muộn: khi nhà cung cấp đã viết thư hoặc trang web đã sập.
Mỗi phép kiểm tra trong số đó đều tồn tại như một công cụ riêng có thể theo dõi liên tục: đăng nhập thất bại — fail2ban, thay đổi tệp — AIDE, tính toàn vẹn của gói — debsums, cổng mở — ảnh chụp ss định kỳ. Cài từng cái một không khó; cái khó là tạo thói quen đăng nhập mỗi ngày để đọc sáu kết quả khác nhau, và vì vậy trên thực tế chẳng ai đọc.
Ý nghĩa của một bảng điều khiển gom chúng lại chính là ở chỗ đó: cùng dữ liệu ấy, nhưng trên một trang và có lịch sử, để «hôm qua không như thế này» tự đập vào mắt mà không cần đi tìm riêng. Các trang demo bên dưới cho thấy khi ghép lại thì nó trông ra sao.