การตรวจสอบการเข้าถึงไฟล์ลินุกซ์


20

มีวิธีใดในยูนิกซ์ที่จะค้นหาว่าใครเข้าใช้ไฟล์บางไฟล์ในช่วง 1 สัปดาห์ที่ผ่านมา? อาจเป็นผู้ใช้หรือบางสคริปต์ ftp ไปยังที่อื่น ฉันจะได้รับรายชื่อผู้ใช้ที่เข้าถึงไฟล์บางไฟล์ได้หรือไม่? ฉันจะรู้ได้อย่างไรว่าใครกำลังเข้าถึงไฟล์บางไฟล์

คำตอบ:


39

นอกจากว่าคุณจะมีนโยบายการบันทึกที่ผิดปกติอย่างยิ่งผู้เข้าใช้งานไฟล์ใดที่ไม่ได้บันทึกไว้ (ซึ่งจะเป็นข้อมูลจำนวนมาก) คุณสามารถค้นหาผู้ที่เข้าสู่ระบบในเวลาใดในบันทึกของระบบ lastคำสั่งช่วยให้คุณมีประวัติเข้าสู่ระบบและบันทึกอื่น ๆ เช่น/var/log/auth.logจะบอกคุณว่าผู้ใช้สิทธิ์และจากการที่พวกเขาได้เข้าสู่ระบบ (ซึ่งสถานีหรือที่โฮสต์ถ้าระยะไกล)

วันที่แฟ้มถูกอ่านสุดท้ายคือที่เรียกว่าเวลาในการเข้าถึงหรือ atime สำหรับระยะสั้น ระบบไฟล์ unix ทั้งหมดสามารถจัดเก็บได้ แต่หลาย ๆ ระบบไม่บันทึกเพราะมีประสิทธิภาพ (มักจะเล็ก) ls -ltu /path/to/fileหรือstat /path/to/fileแสดงเวลาเข้าถึงของไฟล์

หากผู้ใช้เข้าถึงไฟล์และไม่ได้พยายามซ่อนแทร็คประวัติเชลล์ของเขา (เช่น~/.bash_history) อาจมีเงื่อนงำ

หากต้องการทราบว่าเปิดไฟล์ใดหรือใครใช้lsof /path/to/fileอยู่

หากต้องการบันทึกสิ่งที่เกิดขึ้นกับไฟล์ในอนาคตมีสองสามวิธี:

  • ใช้inotifywait inotifywait -e access /path/toจะพิมพ์บรรทัดเมื่อมีคนอ่าน/path/to/ ACCESS file fileอินเทอร์เฟซนี้จะไม่บอกคุณว่าใครเข้าใช้ไฟล์บ้าง คุณสามารถโทรได้lsof /path/to/fileทันทีที่บรรทัดนี้ปรากฎ แต่มีสภาพการแข่งขัน (การเข้าถึงอาจจบลงเมื่อเวลาผ่านไป)

  • LoggedFSเป็นระบบไฟล์แบบเรียงซ้อนได้ที่ให้มุมมองของแผนผังระบบไฟล์และสามารถทำการบันทึกที่ยอดเยี่ยมกว่าในการเข้าถึงทั้งหมดผ่านมุมมองนั้น การกำหนดค่าให้ดูLoggedFS ไวยากรณ์แฟ้มการกำหนดค่า

  • คุณสามารถใช้ระบบย่อยการตรวจสอบของ Linux เพื่อบันทึกสิ่งต่าง ๆ จำนวนมากรวมถึงการเข้าถึงระบบไฟล์ ตรวจสอบให้แน่ใจภูตจะเริ่มต้นจากนั้นกำหนดสิ่งที่คุณต้องการเข้าสู่ระบบด้วยauditd auditctlการดำเนินการที่บันทึกไว้แต่ละครั้งจะถูกบันทึกเป็น/var/log/audit/audit.log(ในการแจกแจงทั่วไป) วิธีเริ่มดูไฟล์โดยเฉพาะ:

    auditctl -w /path/to/file
    

    หากคุณวางการเฝ้าดูในไดเรกทอรีไฟล์ในนั้นและไดเรกทอรีย่อยจะถูกเรียกซ้ำด้วยเช่นกัน


ขอบคุณ Gilles .. ฉันมีไฟล์ข้อมูลนี้สร้างโดยสคริปต์ ฉันแค่อยากจะรู้ว่าเกิดอะไรขึ้นกับไฟล์นั้นหลังจากที่มันถูกสร้างขึ้น .. ไม่ใช่สคริปต์อื่น ๆ กำลังหยิบมันขึ้นมาเพื่อดำเนินการต่อไปดังนั้นฉันต้องการดูว่ามีใครบางคนกำลังเข้าถึงไฟล์นั้นด้วยตนเอง
Jack

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

2
เฮ้คุณสามารถสร้างวงวนที่ดีได้ด้วย:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359

7

ตัวอย่างข้างต้นด้วย inotifywait ควรเป็นหนึ่งใน (ดูหน้าคนสำหรับข้อมูลเพิ่มเติม):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

หรือด้วยโหมดการตรวจสอบและการประทับเวลา:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'

6

คำตอบก่อนหน้าไม่ใช่วิธีปฏิบัติที่ดีที่สุดสำหรับการทำสิ่งที่คุณถาม Linux มี API สำหรับสิ่งนี้ inotifyAPI http://linux.die.net/man/7/inotify

  1. คุณสามารถเขียนโปรแกรม C เพื่อทำสิ่งที่คุณต้องการเพียงแค่เรียกinotifyAPI โดยตรง
  2. คุณสามารถใช้ kfsmd, http://www.linux.com/archive/feature/124903 daemon ที่ใช้inotify
  3. หากคุณต้องการบางสิ่งที่ทำงานได้บนแพลตฟอร์มต่างๆ ( inotifyเฉพาะ Linux) และคุณกำลังใช้งาน Java JNotify สามารถทำงานได้บนทุกแพลตฟอร์ม (Linux, Mac, Windows) โดยสรุป API พื้นฐานของระบบปฏิบัติการ

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

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

1
ตามที่อธิบายไว้ในunix.stackexchange.com/a/12251/20336 inotify API ไม่ได้ให้ข้อมูลเกี่ยวกับผู้ที่เข้าถึงไฟล์ที่กำหนด บวกกับการแบ่งส่วนจริงๆไม่ได้ช่วยให้รู้ว่าใครเป็นผู้เข้าถึงไฟล์เมื่อสัปดาห์ที่แล้ว คุณต้องใช้คุณสมบัติการตรวจสอบซึ่งจำเป็นต้องใช้ซอฟต์แวร์ที่เรียกว่าauditd(อย่างไรก็ตามแม้จะไม่ได้ช่วยให้ทราบว่าใครเป็นผู้เข้าถึงไฟล์เมื่อสัปดาห์ที่แล้วเว้นแต่คุณได้auditdทำงานมาแล้วเมื่อสัปดาห์ที่แล้ว
Mikko Rantalainen

3

โดยทั่วไปไม่เป็นไปได้ ฉันเคยเห็นระบบไฟล์ที่มีการตรวจสอบเพียงพอที่จะทำให้เป็นไปได้ในทางเดียวหรืออื่น ๆ แต่มันไม่ใช่สิ่ง Unix ทั่วไปไม่ใช่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.