คำถามนี้แทบไม่เคยเกิดขึ้นลอย ๆ เซิร์ฟเวอร์ช้าลง ผู้ให้บริการโฮสติงส่งจดหมายเรื่องทราฟฟิกขาออก หรือมีการแจ้งเตือนการเข้าสู่ระบบในอีเมลที่คุณไม่ได้ทำ จากนั้นส่วนที่ไม่น่าพอใจก็เริ่มขึ้น: ไม่ชัดเจนว่าต้องดูอะไรและตามลำดับใด และสัญชาตญาณแรก — ลบทิ้งแล้วติดตั้งใหม่ — เกือบทุกครั้งเป็นการรีบร้อนเกินไป
ด้านล่างคือลำดับการตรวจสอบที่ใช้เวลาราวยี่สิบนาทีและในกรณีส่วนใหญ่ให้คำตอบที่ชัดเจน มันไล่จากสิ่งที่ถูกที่สุดไปหาสิ่งที่แพงที่สุด: ก่อนอื่นคือสิ่งที่เห็นได้ทันที แล้วจึงเป็นสิ่งที่ต้องเทียบกับมาตรฐานบางอย่าง
ขั้นที่หนึ่ง: ใครเข้าสู่ระบบ
เริ่มจากการเข้าสู่ระบบ ถ้ามีคนอื่นเข้ามา เกือบแน่นอนว่าเข้ามาทาง SSH และร่องรอยยังอยู่
last -20
lastb | head -20
who
last แสดงการเข้าสู่ระบบสำเร็จล่าสุด lastb แสดงที่ล้มเหลว และ who แสดงว่าตอนนี้ใครเชื่อมต่ออยู่ สิ่งที่สำคัญไม่ใช่จำนวนแต่เป็นรูปแบบ ความพยายามล้มเหลวนับพันครั้งจากที่อยู่ซึ่งไม่เคยกลับมาอีกคือพื้นหลังปกติ มันเกิดขึ้นกับทุกที่อยู่สาธารณะอย่างไม่หยุดหย่อนและไม่ได้บอกอะไรเลย
สิ่งที่ควรกังวลคืออย่างอื่น:
- การเข้าสู่ระบบสำเร็จจากที่อยู่ซึ่งไม่มีคนของคุณอยู่;
- การเข้าสู่ระบบด้วยชื่อผู้ใช้ที่คุณไม่เคยสร้าง;
- ความพยายามล้มเหลวกับชื่อที่มีอยู่จริงบนเครื่องนี้ — นั่นหมายความว่ามีคนรู้รายชื่อผู้ใช้ของคุณแทนที่จะไล่พจนานุกรม;
- เซสชันที่เปิดอยู่ตอนนี้ซึ่งคุณไม่ได้เปิด
ตรวจแยกต่างหากว่ามีคีย์แปลกหน้าปรากฏขึ้นหรือไม่ ไฟล์ ~/.ssh/authorized_keys คือวิธีอยู่ต่อที่พบบ่อยที่สุด: เปลี่ยนรหัสผ่านกี่ครั้งก็ได้ คีย์ยังอยู่
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
ทุกบรรทัดที่นั่นคือสิทธิ์เข้าถึงของใครสักคน ถ้าคุณบอกไม่ได้ว่าของใคร ให้ถือว่าเป็นของคนอื่น
ขั้นที่สอง: อะไรเปลี่ยนไปในระบบ
การบุกรุกเกือบทุกครั้งทิ้งร่องรอยไว้บนดิสก์: ไบนารีที่ถูกแทนที่ บรรทัดพิเศษในไฟล์ตั้งค่า ไฟล์ใหม่ในไดเรกทอรีของเว็บเซิร์ฟเวอร์ การตรวจด้วยตาเปล่านั้นสิ้นหวัง — ต้องมีมาตรฐานเทียบ
บน Debian และ Ubuntu มาตรฐานนั้นมีอยู่แล้ว: ทุกแพ็กเกจรู้ checksum ของไฟล์ตัวเอง
sudo apt install debsums
sudo debsums -c
คำสั่งนี้แสดงรายการไฟล์ที่ต่างจากที่ดิสทริบิวชันติดตั้งไว้ ผลลัพธ์บางส่วนจะชอบธรรม — ไฟล์ตั้งค่าใน /etc มีไว้เพื่อแก้ไข แต่ไฟล์ปฏิบัติการที่เปลี่ยนไปใน /usr/bin, /usr/sbin หรือ /bin บนเซิร์ฟเวอร์ที่คุณไม่เคยแตะด้วยมือคือเรื่องคนละเรื่องกันเลย
แหล่งที่สองคือไฟล์ใหม่ในที่ที่ไม่ควรมี web shell มักนั่งอยู่ในไดเรกทอรีอัปโหลดและดูเหมือน .php ที่ไม่มีพิษภัย:
find /var/www -type f -name '*.php' -mtime -14 -ls
สิบสี่วันเป็นเพียงจุดเริ่มต้น ให้ใช้ช่วงเวลาที่คุณแน่ใจว่าไม่ได้เผยแพร่อะไรเลย
ขั้นที่สาม: อะไรกำลังออกไปข้างนอก
เซิร์ฟเวอร์ที่ถูกยึดแทบไม่เคยถูกเจาะเพื่อตัวมันเอง มันถูกใช้งาน: ส่งสแปม ขุดเหรียญ เข้าถึงเครือข่ายอื่น เก็บไฟล์ของคนอื่น ทั้งหมดนี้สร้างการเชื่อมต่อขาออกที่เมื่อก่อนไม่มี
ss -tulpn
ss -tp state established
คำสั่งแรกแสดงว่าอะไรกำลังรับฟัง คำสั่งที่สองแสดงว่าตอนนี้เชื่อมต่ออะไรอยู่ อ่านคอลัมน์กระบวนการ สิ่งที่ทำให้เกิดคำถาม: กระบวนการแปลกหน้าที่รับฟังบน 0.0.0.0; การเชื่อมต่อขาออกไปยังพอร์ตสูงของที่อยู่ซึ่งแอปพลิเคชันของคุณไม่มีธุระด้วย; และเหนืออื่นใดคือกระบวนการที่เริ่มจาก /tmp หรือ /dev/shm — ไม่มีอะไรที่ชอบธรรมทำงานจากไดเรกทอรีเหล่านั้น
ดูภาระของระบบไปพร้อมกันด้วย ตัวขุดเหรียญเปิดเผยตัวเองด้วยการทำให้โปรเซสเซอร์ยุ่งตลอดเวลาบนเว็บไซต์ที่ไม่มีความนิยมใด ๆ เลย
ถ้าพบสัญญาณเหล่านั้น
แรงกระตุ้นแรกคือรีบทำความสะอาด: ลบคีย์แปลกหน้า หยุดกระบวนการ ลบไฟล์ อย่าทำ — เพราะพร้อมกันนั้นสิ่งที่จะบอกได้ในภายหลังว่าพวกเขาเข้ามาอย่างไรก็ถูกทำลายไปด้วย และถ้าเรื่องนั้นยังไม่กระจ่าง พวกเขาจะกลับมา อาจจะพรุ่งนี้เลย
ลำดับที่รักษาทั้งข้อมูลและภาพรวม:
- ถ่ายสแนปช็อตดิสก์ที่ผู้ให้บริการถ้าทำได้ นี่เป็นขั้นตอนเดียวที่ทำซ้ำภายหลังไม่ได้
- ตัดเครื่องออกจากเครือข่าย หรือปิดทุกอย่างยกเว้น IP ของคุณ — แต่อย่าปิดเครื่อง การชัตดาวน์ทำให้รายการกระบวนการและการเชื่อมต่อที่เปิดอยู่หายไป และนั่นคือครึ่งหนึ่งของหลักฐาน
- คัดลอกล็อกออกจากเครื่อง:
/var/log/auth.log, ล็อกของเว็บเซิร์ฟเวอร์, ผลลัพธ์ของสามคำสั่งข้างต้น - และเมื่อถึงตอนนี้จึงค่อยหาว่าพวกเขาเข้ามาได้อย่างไร
การติดตั้งใหม่ทั้งหมดเป็นบทสรุปที่ถูกต้องถ้าสิทธิ์ที่ได้มาคือสิทธิ์ root ไม่มีการทำความสะอาดใดรับประกันได้ว่าไม่มีอะไรถูกทิ้งไว้เบื้องหลัง แต่การติดตั้งใหม่โดยไม่เข้าใจสาเหตุนั้นไร้ประโยชน์: คุณจะวางรูรั่วเดิมลงบนระบบใหม่
เพื่อไม่ให้คำถามนี้มาแบบฟ้าผ่า
ทุกอย่างข้างต้นคือการตรวจด้วยมือครั้งเดียว และมันตอบคำถามว่า «ตอนนี้กำลังเกิดอะไรขึ้น» ปัญหาคือคำถามนี้มักถูกถามช้าเกินไป: เมื่อผู้ให้บริการเขียนมาแล้วหรือเว็บไซต์ล่มแล้ว
การตรวจแต่ละอย่างมีเครื่องมือแยกที่เฝ้าดูได้ตลอดเวลา: การเข้าสู่ระบบล้มเหลว — fail2ban, การเปลี่ยนแปลงไฟล์ — AIDE, ความสมบูรณ์ของแพ็กเกจ — debsums, พอร์ตที่เปิด — สแนปช็อต ss เป็นประจำ การติดตั้งทีละตัวไม่ยาก สิ่งที่ยากคือการสร้างนิสัยเข้าระบบทุกวันเพื่ออ่านผลลัพธ์หกแบบ และนั่นคือเหตุผลที่ในทางปฏิบัติไม่มีใครอ่าน
ความหมายทั้งหมดของแผงที่รวบรวมสิ่งเหล่านี้ก็คือ: ข้อมูลเดียวกัน แต่อยู่บนหน้าเดียวและมีประวัติ เพื่อให้ «เมื่อวานไม่ได้เป็นแบบนี้» มองเห็นได้เองโดยไม่ต้องไปตามหาเป็นพิเศษ หน้าเดโมด้านล่างแสดงว่าเมื่อประกอบเข้าด้วยกันแล้วหน้าตาเป็นอย่างไร