จะบันทึกคำสั่ง Bash ทั้งหมดโดยผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์ได้อย่างไร?


21

บริษัท ขนาดเล็กของเราใช้งาน Ubuntu Server 11.10 ซึ่งมีผู้ใช้สองคนที่สามารถเข้าถึง SSH ได้ เทอร์มินัลจริงบางครั้งก็ใช้เช่นกัน เราจะบันทึกการทำงานของคำสั่ง Bash แบบโลคัลพร้อมกับการประทับเวลาของผู้ใช้และผู้ใช้ได้อย่างไร

เราสามารถสันนิษฐานได้ว่าไม่มีใครชั่วร้ายและพยายามหลีกเลี่ยงการบันทึกอย่างแข็งขัน แต่เรายังต้องการให้ผู้ใช้ไม่ให้มีการเข้าถึงการเขียนโดยตรงไปยังไฟล์บันทึกของพวกเขา ต้องจัดการเซสชันพร้อมกันอย่างถูกต้อง

คำตอบ:


32

สำหรับเชลล์ BASH ให้แก้ไขไฟล์กำหนดค่า BASH runtime ทั้งระบบ:

sudo -e /etc/bash.bashrc

ต่อท้ายไฟล์นั้น:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

ตั้งค่าการบันทึกสำหรับ "local6" ด้วยไฟล์ใหม่:

sudo -e /etc/rsyslog.d/bash.conf

และเนื้อหา ...

local6.*    /var/log/commands.log

รีสตาร์ท rsyslog:

sudo service rsyslog restart

ออกจากระบบ. เข้าสู่ระบบ Voila!

แต่ฉันลืมเกี่ยวกับการหมุนบันทึก:

sudo -e /etc/logrotate.d/rsyslog

มีรายการไฟล์บันทึกการหมุนในลักษณะเดียวกันคือ ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

ดังนั้นเพิ่มไฟล์บันทึกคำสั่ง bash-new ในรายการ:

/var/log/commands.log

บันทึก


ลืมเกี่ยวกับการหมุนบันทึกที่ฉันเพิ่มไปยังคำตอบ

1
วิธีนี้ใช้ได้ผล แต่ฉันสามารถประดิษฐ์วิธีการรอบ ๆ (ด้วย csh, .bash_logout) ฉันจะไปกับโซลูชันบัญชีของ Sabacon สิ่งเหล่านี้เป็นการอ่านที่ยอดเยี่ยม: linuxjournal.com/article/6144และbeginlinux.com/blog/2010/01/…

2
ฉันเชื่อว่าสิ่งนี้สามารถปิดการใช้งานได้อย่างง่ายดายโดยผู้ใช้เพียงแค่รีเซ็ตหรือยกเลิกการตั้งค่าหรือการเอ็กซีคิ้วท์PROMPT_COMMANDไปยังเชลล์ที่ไม่ใช่แบช
Stefan Lasiewski

1
@Benubird ดูเหมือนมีสิ่งอำนวยความสะดวกระดับที่ตั้งไว้ไม่กี่ 8 ของพวกเขาถูก local0-local7: en.wikipedia.org/wiki/Syslog 0 หมายถึงฉุกเฉิน 7 หมายถึงการแก้ปัญหาและ 6 เป็นเพียง 7, "ข้อความปฏิบัติการปกติ"
munchybunch

1
@ yukashima เนื่องจากบันทึกอาจกลายเป็นไฟล์ใหญ่หากไม่ถูกลบการหมุนหมายถึงการหมุนไฟล์บันทึกและลบไฟล์เก่า ๆ เพื่อทำให้บันทึกมีขนาดเล็กลง ...
Badr Elmers

4

ระบบบัญชีกระบวนการอาจมีประโยชน์ในเรื่องนี้โดยเฉพาะอย่างยิ่งแพ็กเกจacctที่ให้คำสั่ง lastcomm และ ac

คำสั่ง ac พิมพ์สถิติเกี่ยวกับเวลาการเชื่อมต่อของผู้ใช้เป็นชั่วโมง นี่คือระยะเวลาที่ผู้ใช้เชื่อมต่อกับระบบจากระยะไกลผ่าน SSH หรือเทอร์มินัลอนุกรมหรือขณะอยู่บนคอนโซล

คำสั่ง lastcomm แสดงข้อมูลเกี่ยวกับคำสั่งที่เรียกใช้ก่อนหน้านี้ รายการล่าสุดจะได้รับที่ด้านบนของรายการ ที่แสดงยังเป็นจำนวนเวลา CPU ทั้งหมดที่แต่ละกระบวนการใช้

บทช่วยสอนเก่าที่อาจมีประโยชน์อยู่ที่นี่:

http://www.linuxjournal.com/article/6144?page=0,1

คำสั่งการบัญชีอื่น ๆ เช่นล่าสุดและอื่น ๆ สามารถพบได้ในบทช่วยสอนนี้:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377


lastcomm ค่อนข้างไร้ประโยชน์ในฐานะตัวบันทึกคำสั่ง มันบันทึกเฉพาะปฏิบัติการที่ถูกเรียกใช้ ไม่มีการโต้เถียงสวิตช์หรือพา ธ
Phil_1984_

3

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

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

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


โปรดให้คำแนะนำเกี่ยวกับการติดตั้งและใช้งานในคำตอบ
muru

1
คำแนะนำการติดตั้งโดยละเอียดที่มีอยู่บนหน้าด้อม GitHub ซึ่งเป็นทรัพยากรที่ด้อมหลักตอนนี้: github.com/a2o/snoopy ฉันต้องให้คำแนะนำในการติดตั้งในสถานที่อื่นเนื่องจากสถานที่หลักได้รับการดูแลโดยการออกแบบและอื่น ๆ ไม่ใช่ BTW Readme ได้รับการปรับปรุงให้มีโครงสร้างมากขึ้น
Bostjan Skufca

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

1
ฉันให้ตัวชี้ไปยังโซลูชันทางเลือกและทำงานได้ หากนี่ไม่ใช่สิ่งที่เกี่ยวกับเว็บไซต์นี้โดยทั้งหมดหมายความว่ามันควรจะถูกลบพร้อมกับบัญชีของฉัน
Bostjan Skufca

2
@BostjanSkufca ไม่จำเป็นต้องโกรธเคือง มันเป็นเพียงการแลกเปลี่ยนของสแต็คเพื่อให้ได้คำตอบที่มีในตัวเอง หากคุณไม่เห็นด้วยอย่างยิ่งกับการเพิ่มขั้นตอนนั่นคือความปรารถนาของคุณ downvote ของฉันยังคงอยู่ อาจมีคนโหวตขึ้น
muru

3

คุณสามารถค้นหาสคริปต์ที่นี่เพื่อบันทึกคำสั่งbash / บิวด์อินทั้งหมดลงในไฟล์ข้อความหรือเซิร์ฟเวอร์syslogโดยไม่ต้องใช้แพตช์หรือเครื่องมือปฏิบัติการพิเศษ

ง่ายมากที่จะปรับใช้มันเป็นสคริปต์เชลล์ง่ายๆที่จะต้องมีการเรียกว่าครั้งหนึ่งในการเริ่มต้นของการทุบตี

มันฟรีและฉันหวังว่ามันจะเหมาะกับความต้องการของคุณ


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

2
ไม่สามารถใช้งานไซต์ได้ในขณะนี้
Gaia

0

ในการดูแลหลายเซสชันที่ไม่เขียนทับไฟล์ประวัติคุณจะต้องใส่ "shopt -s histappend" ในไฟล์ Bash startup ดูคำถามนี้เกี่ยวกับปัญหาเดียวกันด้วย


0

ลองใช้วิธีนี้ (วิธีแก้ปัญหาด้านบนจะไม่ทำงาน 100% กับ bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

นี่เป็นการบันทึกและมันป้องกันการบันทึกเวลาที่ใช้สำหรับไฟล์ประวัติทุบตี กับดักจำเป็นเนื่องจาก bash จะส่งสัญญาณไปยัง "subjob" หลังจากกด strg + c หลายครั้ง (ทดสอบด้วย bash 4.3) สิ่งนี้จะบังคับให้ออกจากระบบของผู้ใช้ปัจจุบัน (เช่นเข้าสู่ระบบด้วย sudo)


0

คุณสามารถลองติดตั้งบัญชี บัญชีตรวจสอบรายละเอียดการตรวจสอบสิ่งที่กำลังทำบนระบบ Linux ของคุณ

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