คำถามนี้แทบไม่เคยเกิดขึ้นลอย ๆ เซิร์ฟเวอร์ช้าลง ผู้ให้บริการโฮสติงส่งจดหมายเรื่องทราฟฟิกขาออก หรือมีการแจ้งเตือนการเข้าสู่ระบบในอีเมลที่คุณไม่ได้ทำ จากนั้นส่วนที่ไม่น่าพอใจก็เริ่มขึ้น: ไม่ชัดเจนว่าต้องดูอะไรและตามลำดับใด และสัญชาตญาณแรก — ลบทิ้งแล้วติดตั้งใหม่ — เกือบทุกครั้งเป็นการรีบร้อนเกินไป

ด้านล่างคือลำดับการตรวจสอบที่ใช้เวลาราวยี่สิบนาทีและในกรณีส่วนใหญ่ให้คำตอบที่ชัดเจน มันไล่จากสิ่งที่ถูกที่สุดไปหาสิ่งที่แพงที่สุด: ก่อนอื่นคือสิ่งที่เห็นได้ทันที แล้วจึงเป็นสิ่งที่ต้องเทียบกับมาตรฐานบางอย่าง

ขั้นที่หนึ่ง: ใครเข้าสู่ระบบ

เริ่มจากการเข้าสู่ระบบ ถ้ามีคนอื่นเข้ามา เกือบแน่นอนว่าเข้ามาทาง 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 — ไม่มีอะไรที่ชอบธรรมทำงานจากไดเรกทอรีเหล่านั้น

ดูภาระของระบบไปพร้อมกันด้วย ตัวขุดเหรียญเปิดเผยตัวเองด้วยการทำให้โปรเซสเซอร์ยุ่งตลอดเวลาบนเว็บไซต์ที่ไม่มีความนิยมใด ๆ เลย

ถ้าพบสัญญาณเหล่านั้น

แรงกระตุ้นแรกคือรีบทำความสะอาด: ลบคีย์แปลกหน้า หยุดกระบวนการ ลบไฟล์ อย่าทำ — เพราะพร้อมกันนั้นสิ่งที่จะบอกได้ในภายหลังว่าพวกเขาเข้ามาอย่างไรก็ถูกทำลายไปด้วย และถ้าเรื่องนั้นยังไม่กระจ่าง พวกเขาจะกลับมา อาจจะพรุ่งนี้เลย

ลำดับที่รักษาทั้งข้อมูลและภาพรวม:

  1. ถ่ายสแนปช็อตดิสก์ที่ผู้ให้บริการถ้าทำได้ นี่เป็นขั้นตอนเดียวที่ทำซ้ำภายหลังไม่ได้
  2. ตัดเครื่องออกจากเครือข่าย หรือปิดทุกอย่างยกเว้น IP ของคุณ — แต่อย่าปิดเครื่อง การชัตดาวน์ทำให้รายการกระบวนการและการเชื่อมต่อที่เปิดอยู่หายไป และนั่นคือครึ่งหนึ่งของหลักฐาน
  3. คัดลอกล็อกออกจากเครื่อง: /var/log/auth.log, ล็อกของเว็บเซิร์ฟเวอร์, ผลลัพธ์ของสามคำสั่งข้างต้น
  4. และเมื่อถึงตอนนี้จึงค่อยหาว่าพวกเขาเข้ามาได้อย่างไร

การติดตั้งใหม่ทั้งหมดเป็นบทสรุปที่ถูกต้องถ้าสิทธิ์ที่ได้มาคือสิทธิ์ root ไม่มีการทำความสะอาดใดรับประกันได้ว่าไม่มีอะไรถูกทิ้งไว้เบื้องหลัง แต่การติดตั้งใหม่โดยไม่เข้าใจสาเหตุนั้นไร้ประโยชน์: คุณจะวางรูรั่วเดิมลงบนระบบใหม่

เพื่อไม่ให้คำถามนี้มาแบบฟ้าผ่า

ทุกอย่างข้างต้นคือการตรวจด้วยมือครั้งเดียว และมันตอบคำถามว่า «ตอนนี้กำลังเกิดอะไรขึ้น» ปัญหาคือคำถามนี้มักถูกถามช้าเกินไป: เมื่อผู้ให้บริการเขียนมาแล้วหรือเว็บไซต์ล่มแล้ว

การตรวจแต่ละอย่างมีเครื่องมือแยกที่เฝ้าดูได้ตลอดเวลา: การเข้าสู่ระบบล้มเหลว — fail2ban, การเปลี่ยนแปลงไฟล์ — AIDE, ความสมบูรณ์ของแพ็กเกจ — debsums, พอร์ตที่เปิด — สแนปช็อต ss เป็นประจำ การติดตั้งทีละตัวไม่ยาก สิ่งที่ยากคือการสร้างนิสัยเข้าระบบทุกวันเพื่ออ่านผลลัพธ์หกแบบ และนั่นคือเหตุผลที่ในทางปฏิบัติไม่มีใครอ่าน

ความหมายทั้งหมดของแผงที่รวบรวมสิ่งเหล่านี้ก็คือ: ข้อมูลเดียวกัน แต่อยู่บนหน้าเดียวและมีประวัติ เพื่อให้ «เมื่อวานไม่ได้เป็นแบบนี้» มองเห็นได้เองโดยไม่ต้องไปตามหาเป็นพิเศษ หน้าเดโมด้านล่างแสดงว่าเมื่อประกอบเข้าด้วยกันแล้วหน้าตาเป็นอย่างไร