มีวิธีง่าย ๆ ในการบันทึกคำสั่งทั้งหมดที่ดำเนินการรวมถึงอาร์กิวเมนต์บรรทัดคำสั่งหรือไม่


11

ฉันกำลังพยายามค้นหาวิธีการบันทึกอินสแตนซ์เฉพาะของrrdtoolเพื่อดูว่าเส้นทางที่ได้รับนั้นไม่ถูกต้อง

ฉันรู้ว่าฉันสามารถตัดคำสั่งปฏิบัติการในเชลล์สคริปต์ที่จะบันทึกพารามิเตอร์ แต่ฉันสงสัยว่ามีวิธีเฉพาะเคอร์เนลเพิ่มเติมเพื่อตรวจสอบว่าอาจจะโทรกลับระบบไฟล์ที่เห็นเมื่อเฉพาะ / proc / pid / exe ตรงกับไบนารีที่กำหนด?


มีวิธีรับauditdบันทึกบรรทัดคำสั่งรวมทั้งโปรแกรมทำงานหรือไม่ serverfault.com/questions/765179/…
Neil

คำตอบ:


16

ใช่มีสิ่งอำนวยความสะดวกเคอร์เนล: ระบบย่อยการตรวจสอบ auditdภูตไม่เข้าสู่ระบบและคำสั่งauditctlตั้งค่ากฎการเข้าสู่ระบบ คุณสามารถบันทึกการโทรทั้งหมดไปยังระบบที่ระบุโดยมีการกรองบางอย่าง หากคุณต้องการบันทึกคำสั่งทั้งหมดที่ดำเนินการและอาร์กิวเมนต์ให้บันทึกการexecveโทรของระบบ:

auditctl -a exit,always -S execve

หากต้องการติดตามการเรียกใช้ของโปรแกรมเฉพาะให้เพิ่มตัวกรองในโปรแกรมที่เรียกใช้งานได้:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

บันทึกจะปรากฏใน/var/log/audit.logหรือที่ใดก็ตามที่การกระจายของคุณทำให้พวกเขา คุณต้องเป็นรูทเพื่อควบคุมระบบย่อยการตรวจสอบ

เมื่อคุณตรวจสอบเสร็จแล้วให้ใช้บรรทัดคำสั่งเดียวกัน-dแทน-aการลบกฎการบันทึกหรือเรียกใช้auditctl -Dเพื่อลบกฎการตรวจสอบทั้งหมด

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


ทำไม-F path=/ust/bin/rrdtool? ฉันไม่เข้าใจว่าrrdtoolเป็นซอฟต์แวร์ที่เกี่ยวข้องได้อย่างไร
แกรม

@Graeme rrdtoolปัญหาที่อธิบายไว้ในคำถามที่ได้รับการติดตามการภาวนาของ หากคุณต้องการบันทึกการเรียกใช้ของทุกโปรแกรมให้ลบ-F path=…ส่วน (คุณจะได้รับบันทึกจำนวนมาก)
Gilles 'หยุดชั่วร้าย'

ใช่ ... บรรทัดแรกของคำถาม ขอบคุณ
แกรม

ทั้งหมดนี้ยอดเยี่ยม แต่ฉันจะรีเซ็ตการกำหนดค่าเป็นสถานะเริ่มต้นได้อย่างไร ไม่เช่นนั้นจะเติมบันทึกด้วยคำสั่งใหม่และใหม่ที่เปิดตัว ... หรือauditctlคำสั่งนี้จะมีผลจนกว่ารีบูตหรือไม่
Ruslan

@Ruslan ผลกระทบของการauditctlมีชีวิตรอดเท่านั้นจนกระทั่งรีบูต แต่นั่นเป็นจุดที่ดีต่อไปฉันได้เพิ่มคำแนะนำในการลบออกโดยไม่ต้องรีบูตเพื่อตอบ
Gilles 'หยุดชั่วร้าย'

6

คุณสามารถใช้ด้อม

Snoopy เป็นโซลูชันที่มีน้ำหนักเบากว่าเนื่องจากไม่ต้องการความร่วมมือเคอร์เนล ทั้งหมดที่จำเป็นต้องมีสำหรับรถตักดินแบบไดนามิก (ดล) ที่ preloads Snoopy /etc/ld.so.preloadห้องสมุดเส้นทางที่ระบุไว้ใน

การเปิดเผยข้อมูล: ฉันเป็นผู้ดูแลด้อมในปัจจุบัน


เป็นไปได้หรือไม่ที่จะทำการบันทึกสำหรับคำสั่งทั้งโดยตรงและโดยอ้อมวางไข่จากเชลล์เฉพาะเท่านั้น?
rv

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณหรือไม่คุณหมายถึง "shell" เป็นโปรแกรมเฉพาะที่ใช้เป็นเชลล์ (bash, dash, zsh ฯลฯ ) หรือคุณต้องการบันทึกเฉพาะ PTY หรือไม่ สนูปปี้ให้กรองกรอบ แต่ขณะนี้มีเพียงคู่ของฟิลเตอร์ขั้นพื้นฐานมากจะดำเนินการดูที่นี่สำหรับรายการ: การเชื่อมโยง หากคุณมี usecase ที่เป็นรูปธรรมซึ่งอาจใช้ได้กับผู้อื่นโปรดอธิบายในคำขอคุณลักษณะและยินดีต้อนรับ btw, แพทช์ :) :)
Bostjan Skufca

ฉันหมายถึงเฉพาะ PTY ที่เฉพาะเจาะจง
rv

ไม่มีตัวกรองเฉพาะสำหรับ ATM ของ PTY ที่ใช้งานได้ อย่างไรก็ตามคุณสามารถใช้สนูปปี้เพื่อบันทึกทุกอย่างรวมถึงเหตุการณ์ PTY ที่เกิดขึ้นจากนั้นทำการกรองใน syslog daemon ของคุณ ฉันไม่ทราบว่าคุณใช้อันไหน แต่ syslog-ng (ตัวอย่าง) สามารถทำการจับคู่ regex บวกหรือลบได้
Bostjan Skufca

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

2

ระบบย่อย "ตรวจสอบ" เคอร์เนล Linux สามารถทำสิ่งที่คุณต้องการ

เช่นถ้าคุณใช้คำสั่งเหล่านี้:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

จากนั้นเหตุการณ์การดำเนินการทุกถูกบันทึกไว้และจำนวนมากของข้อมูลที่ให้ไว้รอบว่า

เช่นนี่คือผลลัพธ์ของฉันที่ทำงานอยู่ tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

มีคุณค่าที่น่าสนใจที่สามารถมองเห็นได้ เช่น "auid" คือ 500 ซึ่งเป็นชื่อเข้าสู่ระบบของฉันแม้ว่า "uid" จะเป็นศูนย์ ('เพราะฉันกำลังทำงานอยู่su) ดังนั้นแม้ว่าผู้ใช้อาจเปลี่ยนบัญชีด้วยsuหรือsudoเรายังสามารถติดตามกลับไปที่ "ID การตรวจสอบ" ของพวกเขา

ตอนนี้auditctlคำสั่งเหล่านั้นจะหายไปเมื่อรีบูต คุณสามารถใส่ลงในไฟล์กำหนดค่า (เช่นใน/etc/audit/rules.d/ไดเรกทอรีบน CentOS 7) ตำแหน่งที่แน่นอนจะขึ้นอยู่กับเวอร์ชั่นของระบบปฏิบัติการของคุณ auditctlหน้าคู่มือที่จะช่วยให้ที่นี่

แต่ระวัง ... สิ่งนี้จะทำให้มีการสร้างข้อความบันทึกจำนวนมาก ตรวจสอบให้แน่ใจว่าคุณมีพื้นที่เพียงพอในดิสก์!

หากจำเป็นกฎสามารถ จำกัด ผู้ใช้เฉพาะหรือคำสั่งเฉพาะ

และระวังด้วย; หากผู้ใช้ใส่รหัสผ่านในการดำเนินการคำสั่ง (เช่นmysql --user=username --password=passwd) จากนั้นจะถูกบันทึกไว้

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