ฉันใช้เซิร์ฟเวอร์ที่ใช้งานจริง (Debian 10, แพ็คเกจ OpenSSH มาตรฐาน) ที่มี Pure-FTPD ที่ทำงานสำหรับการเชื่อมต่อแบบดั้งเดิมและ SFTP สำหรับการเชื่อมต่อปัจจุบันทั้งหมดของเรา เซิร์ฟเวอร์ SFTP ได้รับการตั้งค่าด้วยคุก chroot ที่บันทึกผ่านอุปกรณ์ที่ผูกไว้ในคุก chroot ของผู้ใช้ สิ่งนี้ถูกเลือกโดย rsyslog และส่งไปยัง /var/log/sftp.log หลังจากนั้นฉันใช้ logstash เพื่อแยกวิเคราะห์ไฟล์นั้นและส่งต่อทุกอย่างไปยังเซิร์ฟเวอร์การแสดงภาพสำหรับผู้ใช้ขั้นสูงของเรา ผู้ใช้ขั้นสูงเข้าสู่ระบบการแสดงภาพเพื่อดูบันทึก SFTP และ FTP/FTPS ทั้งหมดในที่เดียว
บันทึก Pure-ftpd ได้รับการจัดรูปแบบในลักษณะที่ผู้ใช้ขั้นสูงของเราชอบ:
ftpd บริสุทธิ์: (testuser@hostname) [ประกาศ] /home/ftpusers/testuser//outbound/testfile.pdf ดาวน์โหลด (1765060 ไบต์, 5989.55KB/วินาที)
สิ่งนี้ดีมากเพราะในบรรทัดเดียวจะแสดงผู้ใช้และไฟล์ที่แน่นอนที่พวกเขาอัปโหลดหรือดาวน์โหลด อย่างไรก็ตาม สำหรับ SFTP สถานการณ์ไม่ดีนัก:
internal-sftp[8848]: เซสชันเปิดสำหรับผู้ใช้ทดสอบภายในเครื่องจาก [{ip_address}]
ภายใน sftp [8848]: opendir "/ ขาเข้า"
internal-sftp[8848]: realpath "/ขาเข้า/"
internal-sftp[8848]: เปิดแฟล็ก "/inbound/testfile.pdf" WRITE, CREATE, TRUNCATE 0666
internal-sftp[8848]: ปิด "/inbound/testfile.pdf" ไบต์อ่าน 0 เขียน 1734445
ในกรณีนี้ สามารถติดตามบันทึกได้ง่าย ผู้ทดสอบ
เข้าสู่ระบบ เขียนไฟล์ เสร็จแล้ว แต่เรามีผู้ใช้จำนวนมากที่เข้าสู่ระบบพร้อมกัน และบันทึกจากอินสแตนซ์ของ sftp ภายในหลายรายการสามารถเกิดขึ้นได้พร้อมกัน ในกรณีนี้ วิธีเดียวที่จะติดตามกิจกรรมของผู้ใช้คือการค้นหาชื่อผู้ใช้ ผู้ทดสอบ
ค้นหา ID กระบวนการที่บันทึก (8848
ในตัวอย่างด้านบน) จากนั้นค้นหาข้อความที่มี ID กระบวนการนั้น ผู้ใช้จำนวนมากเข้าสู่ระบบผ่าน cronjob ดังนั้นสิ่งนี้จะเกิดขึ้นทุกๆ 2 นาทีหรือมากกว่านั้น...เมื่อเรามีผู้ใช้ 300 รายเข้าสู่ระบบในช่วงเวลาปกติ คุณสามารถจินตนาการได้ว่าการตามล่า ID กระบวนการจำนวนมากนี้จะเป็นเรื่องที่เจ็บปวด
คำถามของฉัน
มีวิธีนำหน้าข้อความบันทึกแต่ละรายการจาก sftp-internal ด้วยชื่อผู้ใช้ที่สร้างบันทึกหรือไม่ สิ่งนี้จะต้องทำงานในคุก chroot ฉันไม่พบสิ่งใดเกี่ยวกับวิธีแก้ไขข้อความที่ rsyslog สร้างขึ้นเพื่อรวมชื่อผู้ใช้
ฉันต้องการเห็นสิ่งที่คล้ายกันจากบันทึก SFTP ของฉัน:
internal-sftp[8848]: (testuser) เปิดแฟล็ก "/inbound/testfile.pdf" WRITE, CREATE, TRUNCATE 0666
internal-sftp[8848]: (testuser) ปิด "/inbound/testfile.pdf" ไบต์ อ่าน 0 เขียน 1734445
สถานะปัจจุบันของการกำหนดค่า
ห่วงโซ่กระบวนการของฉันไป:
ssh -> sftp-internal -> rsyslog (บน local3.*) -> ไฟล์ /var/log/sftp.log -> logstash -> ส่งออกไปยังเซิร์ฟเวอร์การแสดงภาพ
ตัดตอนมาจากกลุ่ม chroot ของฉันใน /etc/ssh/sshd_config
จับคู่กลุ่ม sftpusers
ไดเรกทอรี Chroot %h
AuthorizedKeysFile %h/.ssh/authorized_keys
ForceCommand internal-sftp -f local3 -l INFO
# ForceCommand internal-sftp -l VERBOSE
อนุญาตให้ Tcp ส่งต่อหมายเลข
X11หมายเลขการส่งต่อ
และ /etc/rsyslog.d/sftp.conf ของฉัน
local3.* -/var/log/sftp.log
คำถามที่คล้ายกัน:
คำถามนี้ เป็นเรื่องเกี่ยวกับการบันทึก SFTP เพื่อแยกไฟล์ แต่มันกล่าวถึง นี้ รายการ waybackmachine สำหรับบทความเก่าที่มีรายการบันทึก SFTP ที่มีรูปแบบสวยงามเพื่อให้ดูเหมือน xferlog มาตรฐานบทความนี้กล่าวถึงสคริปต์ Perl (จอกศักดิ์สิทธิ์) ที่จะจัดรูปแบบให้คุณ แต่อนิจจา ลิงก์เสีย ฉันสามารถเขียนสคริปต์ Python หรือ Perl เพื่อค้นหาข้อความเฉพาะสำหรับการถ่ายโอน จับรหัสกระบวนการ และค้นหาย้อนกลับเพื่อค้นหาผู้ใช้ จากนั้นพิมพ์ข้อความ xfer ที่จัดรูปแบบใหม่พร้อมชื่อผู้ใช้ออกไปยังไฟล์ แต่แน่นอนว่ามีคนแก้ปัญหานี้มาก่อนและมีวิธีแก้ไขที่ดีกว่า
ขอบคุณสำหรับความช่วยเหลือใด ๆ