จะบันทึกคำสั่งภายใน“ sudo su -” ได้อย่างไร?


12

ถ้าฉัน:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

จากนั้นฉันจะเห็นว่าในบันทึก:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

แต่ถ้าฉัน:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

ฉันไม่เห็นในบันทึก:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

คำถามของฉัน: ฉันจะเปิดการบันทึกสำหรับคำสั่งภายใน "sudo su -" ได้อย่างไร

ระบบปฏิบัติการเป็น Ubuntu 12.04 แต่คำถามทั่วไป

UPDATE # 1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

หากใครบางคนที่เป็นอันตราย (หรือแม้แต่ไม่น่าไว้วางใจ) มีสิทธิ์เข้าถึงsudo su -พวกเขาก็สามารถลบรายการบันทึกทั้งหมดที่คุณสามารถทำได้จากการกระทำของพวกเขา หากคุณต้องการความมั่นใจ 100% ในการบันทึกของคุณคุณต้อง จำกัดsudoอย่างมากและไม่อนุญาตsudo suทั้งหมด
Wildcard

คำตอบ:


17

เมื่อคุณอยู่ใน Ubuntu 12.04 ให้ดูที่ความสามารถในการบันทึก I / O ที่เปิดใช้งานผ่านทางlog_inputและlog_outputตัวเลือกต่างๆ

log_input

    หากตั้งค่าsudoจะเรียกใช้คำสั่งในหลอก tty และบันทึกการป้อนข้อมูลของผู้ใช้ทั้งหมด หากอินพุตมาตรฐานไม่ได้เชื่อมต่อกับ tty ของผู้ใช้เนื่องจากการเปลี่ยนเส้นทาง I / O หรือเนื่องจากคำสั่งเป็นส่วนหนึ่งของไพพ์ไลน์อินพุตนั้นจะถูกดักจับและเก็บไว้ในล็อกไฟล์แยกต่างหาก

    การป้อนข้อมูลจะถูกบันทึกไปยังไดเรกทอรีที่ระบุโดยiolog_dirตัวเลือก ( /var/log/sudo-ioโดยค่าเริ่มต้น) โดยใช้ ID เซสชั่นที่ไม่ซ้ำกันที่รวมอยู่ในบรรทัดบันทึก sudo TSID=ปกตินำหน้าด้วย iolog_fileตัวเลือกที่อาจจะใช้ในการควบคุมรูปแบบของหมายเลขเซสชั่น

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

log_output

    หากตั้งค่าsudoจะเรียกใช้คำสั่งในหลอก tty และบันทึกเอาต์พุตทั้งหมดที่ส่งไปยังหน้าจอคล้ายกับคำสั่ง script (1) หากเอาต์พุตมาตรฐานหรือข้อผิดพลาดมาตรฐานไม่ได้เชื่อมต่อกับ tty ของผู้ใช้เนื่องจากการเปลี่ยนทิศทาง I / O หรือเนื่องจากคำสั่งเป็นส่วนหนึ่งของไพพ์ไลน์เอาต์พุตนั้นจะถูกดักจับและเก็บไว้ในล็อกไฟล์แยกต่างหาก

    เอาท์พุทจะถูกบันทึกไปยังไดเรกทอรีที่ระบุโดยiolog_dirตัวเลือก ( /var/log/sudo-ioโดยค่าเริ่มต้น) โดยใช้ ID เซสชั่นที่ไม่ซ้ำกันที่รวมอยู่ในบรรทัดบันทึก sudo TSID=ปกตินำหน้าด้วย iolog_fileตัวเลือกที่อาจจะใช้ในการควบคุมรูปแบบของหมายเลขเซสชั่น

    บันทึกการแสดงผลอาจดูได้ด้วยยูทิลิตี sudoreplay (8) ซึ่งสามารถใช้เพื่อแสดงรายการหรือค้นหาบันทึกที่มีอยู่

การดำเนินการ: รุ่น Sudo อย่างน้อย: 1.7.4p4 ที่จำเป็น

/etc/sudoersmodifcation: สิ่งที่คุณต้องทำคือการเพิ่มสองแท็กในรายการ sudoers ที่ต้องการทั้งหมด (โดยระบุ "su" ด้วยคำสั่งหรือนามแฝง) LOG_INPUT และ LOG_OUTPUT

ตัวอย่าง:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

เพิ่มโครงสร้าง dir บันทึกเริ่มต้นต่อไปนี้sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}

มันยอดเยี่ยม แต่ไม่ทำงานกับระบบเก่า .. : \
newuser999

ใช่อาจจะสร้างแพ็คเกจของเวอร์ชั่น sudo ปัจจุบันหรืออัพเกรดระบบ?
Martin M.

13

ของคุณgrepเมื่อทำsudo su -ล้มเหลวเพราะคุณไม่ได้ทำงานecho 1234567zzคุณกำลังทำงานsu -ซึ่งเปิดตัวเปลือก echoเปลือกแล้วการทำงานของคุณ

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

หากคุณเปลี่ยน grep เป็นgrep 'COMMAND=/bin/su -' *คุณจะเห็นมัน


sudo su -suนอกจากนี้ยังมีการใช้งานที่ไร้ประโยชน์ sudo -iทำสิ่งเดียวกัน


แต่ฉันจะเข้าสู่ระบบ "sudo su -" ได้อย่างไร
newuser999

1
มันถูกบันทึกไว้ คุณลองใช้grep 'COMMAND=/bin/su -' *(หรือไม่มีไวด์การ์ด:) grep 'COMMAND=/bin/su -' /var/log/auth.logหรือไม่
Patrick

ฉันอัพเดทคำถาม ฉันต้องทำอะไรอีกเพื่อพิสูจน์ว่าเมื่อใช้ "sudo su -" คำสั่งจะไม่ถูกบันทึก?
newuser999

4
คำสั่ง ( sudo -) ถูกบันทึกและผลลัพธ์ที่อัปเดตของคุณจะแสดงสิ่งนี้ นั่นคือทั้งหมดที่เรากำลังพูดถึงที่นี่ คำสั่งอื่น ๆเช่นechoหลังจากที่คุณเปลี่ยนผู้ใช้ที่มีsudo -, ไม่ได้ sudo คำสั่งและด้วยเหตุนี้ (ตามคำตอบของฉัน) auth.logจะไม่ได้เข้าสู่ระบบ คำสั่งแต่ละคำสั่งsudoล่วงหน้าอย่างชัดเจนด้วยจะถูกบันทึกไว้ ดังนั้นsudo echoถูกบันทึกไว้ แต่เพียงธรรมดาechoไม่ได้โดยไม่คำนึงถึงข้อเท็จจริงที่ว่าคุณได้เปลี่ยนไปใช้ superuser
goldilocks

12

ในการเพิ่มความซับซ้อนนี่คือสามวิธีในการบันทึกคำสั่งที่ออกภายใน "sudo su -":

  1. พึ่งพาประวัติคำสั่ง bash
  2. ติดตั้ง wrapper การบันทึก execve
  3. ใช้การตรวจสอบของ SELinux

ตามที่เหมาะสมมันขึ้นอยู่กับสิ่งที่คุณพยายามที่จะบรรลุด้วยการเข้าสู่ระบบ

1) ประวัติคำสั่ง Bash

คุณต้องการกำหนดค่า facitlity ประวัติเพื่อให้แน่ใจว่ามีบรรทัดเพียงพอไม่เขียนทับจากเซสชันต่าง ๆ ไม่ละเว้นคำสั่งและเวลาประทับที่เหมาะสม (ดูตัวแปร HIST * ในคู่มือทุบตี ) ล้มล้างได้อย่างง่ายดายด้วยการแก้ไขไฟล์ประวัติจัดการสภาพแวดล้อมหรือใช้เชลล์อื่น

2) wrapper execve

snoopyloggerเป็นหนึ่ง เพิ่มการตรวจสอบ/etc/profileว่าไลบรารีตัวบันทึกอยู่ในแผนผังหน่วยความจำของกระบวนการ ( /proc/<pid>/maps) และหากไม่ใช่ให้ตั้งค่าLD_PRELOADและรีสตาร์ท (ด้วยexec $SHELL --login "$@") หรือคุณอาจเพิ่มรายการใน /etc/ld.so.preload ด้วย$LIB/snoopy.soหรือพา ธ ที่เทียบเท่ากับsnoopy.so เวอร์ชัน 32/64 บิต

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

ควรส่ง Syslog แบบออฟไลน์เพื่อให้เนื้อหาเชื่อถือได้

3) ตรวจสอบ

ตรงไปตรงมามากกว่าการกำหนดค่าเล็กน้อยกว่า wrapper execve แต่ยากที่จะดึงข้อมูลจาก นี่คือคำตอบสำหรับคำถามที่คุณน่าจะถามจริง ๆ : "มีวิธีบันทึกสิ่งที่มีผลต่อผู้ใช้ในระบบหลังจากออกมาหรือไม่sudo su -" ควรส่ง Syslog แบบออฟไลน์เพื่อให้เนื้อหาเชื่อถือได้

คำตอบ Serverfaultนี้ดูเหมือนจะเป็นการกำหนดค่าที่ครอบคลุมพอสมควรสำหรับใช้กับ auditd

มีบางข้อเสนอแนะอื่น ๆ ที่จะเป็นคำถามที่คล้ายกันใน ServerFault


9

ทำไม?

เพราะมันsudoกำลังทำการบันทึก มันบันทึกคำสั่ง sudo ในกรณีแรกsudo echoจะถูกบันทึก ในกรณีที่สองsudo suเข้าสู่ระบบ (ค้นหาใน/var/log/auth.log)

suคือ "สลับผู้ใช้" โดยค่าเริ่มต้นเป็นรูท สิ่งที่คุณทำหลังจากที่ไม่ผ่าน sudo มันเหมือนกับว่าคุณเข้าสู่ระบบในฐานะ root การล็อกอินนั้นถูกบันทึกไว้ แต่ไม่ใช่ทุกคำสั่ง


5

อย่างที่คนอื่นพูดsudoไม่สามารถทำได้

auditdแต่การใช้งาน หากคุณต้องการบันทึกทุกสิ่งที่ทำโดยรูท (รวมถึงสิ่งที่ทำโดย crontab) ให้ใช้สิ่งนี้:

sudo auditctl -a exit,always -F euid=0

การทางพิเศษแห่งประเทศไทย: โปรดทราบว่าการบันทึกทุกอย่างจะส่งผลต่อประสิทธิภาพดังนั้นคุณอาจต้อง จำกัด มันสักหน่อย ดูman auditctlตัวอย่าง

หากคุณต้องการบันทึก syscalls โดยที่ uid การเข้าสู่ระบบดั้งเดิมไม่ได้เป็นรูทให้ใช้สิ่งนี้แทน:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

บันทึกมักจะสิ้นสุดใน /var/log/audit/audit.log ausearchคุณสามารถค้นหาพวกเขาด้วย

มีข้อมูลเพิ่มเติมได้ในหน้าคนสำหรับauditctl, และaudit.rulesausearch


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

แม้ว่าคุณจะไม่สามารถไว้วางใจในสิ่งที่ทำหรือไม่ได้มาจากเซิร์ฟเวอร์ที่ถูกบุกรุก
Matt

แต่คุณจะมีร่องรอยจนกระทั่งถึงเวลาที่มันถูกบุกรุก
เจนนี่ D

2
ซึ่งในกรณีของ op เป็นเทคนิคทันทีที่พวกเขาทำงานsudo su -ดังนั้นคุณกลับมาที่จตุรัสหนึ่ง
Matt

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

2

sudo su -จะอยู่ใน~/.bash_historyถ้าเปลือกของคุณถูกทุบตี

echo 1234567zzจะอยู่ใน/root/.bash_historyถ้าเปลือกของรากทุบตี

คำอธิบายของเรื่องนี้ถูกโพสต์โดย goldilocks แล้ว


2

คุณต้องการที่จะเข้าสู่ระบบซูเพราะคุณรู้สึกว่ามันเป็นข้อบกพร่องด้านความปลอดภัยหรือไม่? คุณคิดเกี่ยวกับคำสั่งนี้หรือไม่? sudo bashเช่นเดียวกับ imho ที่ไม่ดี

หากคุณกังวลเกี่ยวกับสิ่งที่ผู้คนสามารถทำได้กับ sudo คุณจะต้อง จำกัด การใช้งาน คุณสามารถ จำกัด คำสั่งที่พวกเขาสามารถดำเนินการได้เช่นกัน จำกัด การเข้าถึง / bin / su หากคุณกังวล


1

เกี่ยวกับสิ่งนี้:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

หรือ

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

หรือยาวหนึ่งซับ:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E รักษาสภาพแวดล้อม PROMPT_COMMAND จะถูกดำเนินการก่อนแต่ละพรอมต์


อันแรกไม่ได้ให้คอนโซลฉันและถ้าฉันใส่อันที่สองลงใน /root/.bashrc ฉันต้องกด CTRL + C ถ้าฉันต้องการรูทคอนโซลหลังจาก "sudo su -": D โอกาสใด ๆ เพื่อแก้ไขปัญหานี้ (หรือเพื่อเพิ่ม "วันที่" ฟังก์ชั่นมันได้หรือไม่) ขอบคุณมาก!
newuser999

ฉันกลัวว่าคุณใช้ผิด แก้ไขให้ชัดเจนยิ่งขึ้น
Costa

1

หากสิ่งนี้ช่วยได้คุณสามารถใช้ตัวเลือก "NOEXEC" ของ sudoers

คุณจำเป็นต้องกำหนดเป็น

USER_NAME         ALL=(ALL) NOEXEC : ALL

วิธีนี้จะช่วยป้องกันการหลบหนีของเชลล์และผู้ใช้จะไม่สามารถใช้ sudo -i หรือ sudo -s หรือ sudo su -

สิ่งนี้มาพร้อมกับข้อเสียอย่างไรก็ตามการหลีกเลี่ยงเชลล์ใด ๆ จะถูกปิดใช้งาน สำหรับสคริปต์ที่ดำเนินการจากภายในสคริปต์จะถูกปฏิเสธเช่นกัน


0

อย่าทำให้ซับซ้อนนี้: เมื่อใดก็ตามที่sudoถูกเรียกมันจะรายงานข้อเท็จจริงนี้ในไฟล์บางไฟล์ใน/var/log(ในระบบของคุณคือauth.logบนกล่อง OS X ของฉันsystem.log) sudoรายงานข้อโต้แย้ง commandline ของมัน suแต่มันมีความรู้ในสิ่งที่อาจจะเกิดขึ้นภายในคำสั่งแบบโต้ตอบที่ไม่เหมือนใคร

นี่ไม่ได้หมายความว่าไม่มีการบันทึกสิ่งที่เกิดขึ้นในเชลล์ย่อย: คำสั่งเชลล์จะถูกบันทึกไว้ในประวัติของเชลล์ ในระบบของฉันการบันทึกประวัติของรูทจะเปิดใช้งานตามค่าเริ่มต้นดังนั้นสิ่งที่ฉันต้องทำคือมองหา~root/.sh_historyบันทึกสิ่งที่ทำ (เว้นแต่มีคนดัดแปลงแก้ไขแน่นอน แต่ก็สามารถแก้ไขได้/var/log)

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดสำหรับคุณ ถ้าไม่ไปเมืองด้วยauditdตามที่ @Jenny แนะนำ

PS หากยังไม่ได้เปิดใช้งานประวัติของรูทการเปิดใช้จะขึ้นอยู่กับว่าใช้เชลล์ใด สำหรับbashตั้งค่าHISTORYและHISTFILESIZEจำนวนที่มากพอ (ค่าเริ่มต้นคือ 500 คู่มือของฉันบอกว่า) หากคุณต้องการคุณสามารถระบุตำแหน่งที่บันทึกประวัติโดยการตั้งค่าHISTFILEเป็นเส้นทาง (ค่าเริ่มต้น$HOME/.sh_history)


0

คุณอาจต้องการสร้าง typescript ของเซสชันของคุณโดยใช้script(1):

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

ตอนนี้คุณสามารถgrep(โปรดทราบว่า#มีการบันทึกพร้อมท์จริง/tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

หรือคุณสามารถดูเซสชันทั้งหมดอีกครั้งด้วยscriptreplay(1):

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

ไฟล์/tmp/my_typescript.timingมีข้อมูลเมื่อแต่ละคำสั่งถูกเรียกใช้ มีเครื่องมือเพิ่มเติมเช่นttyrecหรือshelrที่มีระฆังและนกหวีดมากขึ้น

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