ฉันจะติดตามไฟล์ประมวลผลที่สร้างโดยผู้ใช้ของฉันบน Linux ได้อย่างไร


11

ใช้ Linux ฉันต้องการติดตามไฟล์ที่เรียกใช้งานในชื่อของฉันรวมถึงบรรทัดคำสั่งทั้งหมด (ในทางปฏิบัติทุก ๆ exec * () ทำในฐานะผู้ใช้ของฉันเอง) ควรมีโปรแกรมที่ฉันไม่ได้ควบคุมเพื่อจัดการงานเพื่อดำเนินการโปรแกรมที่ฉันผ่าน แต่ฉันต้องการให้แน่ใจว่ามันทำเช่นนั้นและตัวเลือกที่ใช้ โปรแกรมที่ฉันไม่ควบคุมนั้นดูถูกและดูเหมือนว่าจะเปลี่ยนพฤติกรรมขึ้นอยู่กับชื่อของโปรแกรมที่ควรจะเรียกใช้งานดังนั้นฉันจึงไม่สามารถส่งผ่านเชลล์สคริปต์ที่จะบันทึกข้อมูลและเรียกใช้งานจริง โปรแกรม.

เป็นไปได้หรือไม่ที่ฉันจะได้รับแจ้งให้ทราบถึงการดำเนินการทั้งหมด * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * sdpdbb เป็นของผู้ใช้ทั้งหมดในระบบบน Linux รวมถึงบรรทัดคำสั่งเต็มรูปแบบ? สั้นในการทำงานpsในวงนั่นคือ ฉันอยากจะทำโดยตรงกับระบบที่ฉันทำงานและไม่จำเป็นต้องใช้การเข้าถึงรูท แต่ถ้าจำเป็นฉันสามารถวางไข่ระบบที่ฉันมีการเข้าถึงรูทได้ให้ติดตั้งโปรแกรมและตรวจสอบที่นั่น

ใช้ Ubuntu 12.4 LTS


ฉันถามที่นี่มากกว่าถาม Ubuntu เพราะเป็นคำถาม Unix / Linux มากกว่าคำถาม Ubuntu จริง
Pierre Lebeaupin

1
โปรแกรมลับ ๆ ล่อใจเป็นอย่างไร? มันพยายามตรวจจับหรือเลี่ยงผ่าน debuggers หรือไม่? มันเชื่อมโยงแบบไดนามิกหรือไม่ หากส่อเสียดเกินไปคุณอาจต้องใช้เครื่องเสมือนที่คุณรูต (นี่อาจเป็นกลยุทธ์ที่ง่ายที่สุดแม้สำหรับโปรแกรมที่ไม่ได้ลับๆล่อๆ)
Gilles 'หยุดความชั่วร้าย'

@Gilles ที่เป็นไปได้จริง ๆ ฉันจะลองใช้ VM จากนั้นอัปเดตคำถามว่ามันจะใช้การได้หรือไม่
Pierre Lebeaupin

หมายเหตุ: คุณต้องการให้ชื่อโปรแกรมและอาร์กิวเมนต์ที่คำตอบauditให้จริง ๆ แต่ 'บรรทัดคำสั่งทั้งหมด' ในเชลล์อาจส่งผลกระทบต่อกระบวนการลูกโดยใช้การเปลี่ยนเส้นทาง / การวางท่อและการตั้งค่า envvar รวมถึงการแทนที่ / การขยาย และระยะห่างและโครงสร้างการควบคุมเช่นdoa && dobและคุณจะไม่ได้รับเหล่านั้น
dave_thompson_085

คำตอบ:


10

คุณต้องกำหนดค่าauditdให้บันทึกexecveกิจกรรม ตัวอย่างใน RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

ฉันไม่สนใจคำเตือนส่วนโค้งและดูเหมือนจะไม่สำคัญ แต่คุณสามารถใช้-F arch=b64หรือ-F arch=b32ตั้งค่าหากคุณต้องการ

ผลลัพธ์ที่ได้คือ:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

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

หวังว่าจะช่วยผลักดันคุณไปในทิศทางที่ถูกต้อง

แก้ไข:

เนื่องจากคำถามของคุณเกี่ยวข้องกับการดูผู้ใช้คนหนึ่งฉันสามารถแสดงให้คุณเห็นว่า:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

เหมือนด้านบน แต่เฉพาะexecveผู้ที่ใช้งานด้วย ID ผู้ใช้ที่มีประสิทธิภาพ16777216เท่านั้นที่จะได้รับการบันทึก หากคุณจำเป็นต้องระบุloginuidค่าของผู้ใช้(ผู้ที่พวกเขาเข้าสู่ระบบในตอนแรกเป็น) จากนั้นคุณกรองตามauid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

ตัวกรอง AUID / loginuid จะมีประโยชน์เช่นถ้าผู้ใช้จะทำsuหรือsudoไปที่รูท ในสถานการณ์นั้นจะมีสิ่งต่าง ๆ มากมายที่ทำงานในฐานะรูท แต่คุณเป็นห่วงเฉพาะสิ่งที่ผู้ใช้เป็นกังวล auditctlยังช่วยให้คุณสามารถกรองสแต็กเพื่อให้คุณสามารถกรองทั้งeuidและauid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"

1
“ โปรดทราบว่าฉันไม่สามารถเข้าถึงรูทได้” (มิฉะนั้นจะเป็นคำตอบที่ดี)
Gilles 'หยุดความชั่วร้าย'


ขอบคุณที่ทำงาน ฉันควรเพิ่มว่าฉันต้องติดตั้ง auditctl โดย apt-get มันไม่ได้ติดตั้งไว้ล่วงหน้าบน Ubuntu
Pierre Lebeaupin

ขอบคุณ ตัวอย่างที่ดี แต่มีวิธีใดที่จะได้รับรหัสออกจากบันทึกการตรวจสอบหรือไม่
Kaos

0

คุณถามอะไรง่าย ๆ ฉันได้ทำตัวอย่างด้วยmplayerแต่ฉันคิดว่ามันสามารถปรับให้เข้ากับสถานการณ์อื่น ๆ :

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

ในขณะที่คุณสามารถดูนี้ง่ายมาก: มันแยกอาร์กิวเมนต์แรกเป็นไฟล์บันทึกถูกสร้างเป็นไฟล์กลาง$LOGและตัดแบ่งเป็นไฟล์ (ซึ่งมีชื่อเดียวกันเสมอmplayer.logในไดเรกทอรีเดียวกัน

ดังนั้นผู้ใช้อาจได้รับภาพยนตร์เรื่องล่าสุดที่เขาได้อ่านในแต่ละไดเรกทอรี


Q กล่าวโดยเฉพาะว่าการแทนที่สคริปต์จะไม่ทำงาน
dave_thompson_085

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