Hướng dẫn khắc phục lỗ hổng bảo mật CVE-2019-11477 trên Cloud365
Hướng dẫn khắc phục lỗ hổng bảo mật CVE-2019-11477 trên Cloud365
Nơi chứa các tài liệu tham khảo của dịch vụ Cloud365.
OOM Killer hoặc Out Of Memory Killer là một quá trình mà kernel linux sử dụng khi hệ thống đang trong tình trạng RAM bị quá tải. Như chúng ta đã biết, hệ thống là tập hợp gồm rất nhiều các process (tiến trình) chạy trên đó. Mỗi process đều sử dụng tài nguyên như RAM, CPU, Disk của hệ thống. Tuy nhiên tài nguyên của mỗi hệ thống đều có những giới hạn nhất định, và khi tài nguyên như RAM bị sử dụng tới mức báp động đỏ thì hệ thống phải có những động tác để ngăn chặn việc này.
Quy định của luật giao thông là mỗi xe máy chỉ được phép chở 2. Tiến trình nào kẹp 3, kẹp 4 sẽ lập tức có cách anh CSGT OOM tiến hành tuýt còi, bắt process đó tạm dừng và đưa lên đồn.
OOM Killer hoạt động bằng cách xem xét tất cả các quy trình đang chạy và gán cho chúng điểm số xấu. Quá trình có số điểm cao nhất là quá trình bị giết. OOM Killer chỉ định điểm xấu dựa trên một số tiêu chí. Nguyên tắc như sau:
- Quá trình và tất cả các tiến trình con của nó đang sử dụng rất nhiều RAM
- Số lượng process tối thiểu bị kill (lý tưởng là một) để giải phóng đủ RAM để giải quyết tình huống
- Root, kernel và các process hệ thống quan trọng được cho điểm thấp hơn nhiều
Các tiêu chí được liệt kê ở trên có nghĩa là khi chọn một tiến trình để tiêu diệt OOM Killer sẽ chọn một quy trình sử dụng nhiều RAM và có nhiều tiến trình con và không phải là các tiến trình hệ thống. Một ứng dụng như apache, mysql, ftp server hoặc mail server sẽ tạo ra một ứng cử viên tốt.
Đối với các máy chủ chạy KVM, các tiến trình ưu tiên bị kill đó sẽ là các tiến trình chạy máy ảo. Và ở phần tiếp theo, mình sẽ dựng tình huống OOM Killer sẽ tuýt còi các process chạy máy ảo trên KVM.
Bất cứ khi nào OOM Killer được gọi để xử lý 1 tiến trình, nó sẽ ghi thông tin vào nhật ký hệ thống bao gồm tiến trình nào bị giết và tại sao. Chúng ta kiểm tra như sau :
dmesg | egrep -i "killed process"
Output sẽ như sau :
kernel kernel: Out of Memory: Kills process 2592 (mysql)
Trong trường hợp này, tiến trình đã bị kill là mysql có PID là 2592.
Đối với mỗi OS, thông tin về việc tiến trình bị kill bởi OOM sẽ xuất hiện tại các file khác
Chúng ta sẽ tìm hiểu OOM Killer sẽ xử lý các process chạy máy ảo sử dụng RAM quá tải như thế nào trong KVM.
Mô hình :
Thực hiện test :
top
. Đánh dấu các tiến trình đang chạy máy ảo qemu-kvmyum install epel-release -y
yum install stress -y
stress --vm 2 --vm-bytes 1G --timeout 300s
cat /var/log/messages | grep "Killed process"
Kết quả như sau :
Đối chiếu lại tiến trình máy ảo đã chụp ở trên, chứng tỏ OOM Killer đã thực hiện việc kill 2 tiến trình máy ảo chạy nhiều RAM nhất.
Các hệ thống Cloud OpenStack có hypervisor là KVM, và các máy ảo chạy trên hypervisor đều được coi như là một tiến trình trong hệ thống.
Khi máy ảo trên OpenStack bị Shutdown đột ngột chưa rõ nguyên nhân. Để kiểm tra xem máy ảo có phải bị kill bởi OOM do thiếu RAM hay không, ta cần thực hiện 3 bước sau :
top -c
.Tiếp tục kiểm tra lưu lượng sử dụng RAM của hypervisor trong khoảng thời gian tiến trình bị kill.
Có thể thấy Log về tiến trình qemu-kvm bị kill vào lúc 21 giờ 36 phút.
Có thể thấy trong khoảng thời gian 21 giờ 36 phút, RAM tại hypervisor đã bị hết. Sau thời điểm tiến trình qemu-kvm chạy máy ảo bị OOM kill thì RAM available tại hypervisor đã trở lại ngưỡng ổn định.
Từ những dữ liệu trên, có thể kết luận máy ảo sử dụng RAM nhiều nhất sẽ bị kill bởi OOM Killer nếu hypervisor bị quá tải về RAM.
Thực hiện bởi cloud365.vn