คุณจะเตะผู้ใช้ที่เป็นพิษเป็นภัยออกจากระบบของคุณได้อย่างไร?


66

ฉันกำลังทำ Google เมื่อไม่นานมานี้และสังเกตเห็นสองวิธี แต่ฉันเดาว่า google ไม่รู้จักเลย ดังนั้นคุณจะเตะผู้ใช้ออกจากกล่อง Linux ของคุณได้อย่างไร คุณจะเห็นว่าพวกเขาเข้าสู่ระบบได้อย่างไรตั้งแต่แรก? และที่เกี่ยวข้อง ... วิธีการของคุณใช้งานได้หรือไม่หากผู้ใช้ลงชื่อเข้าใช้ X11 DE (ไม่ใช่ข้อกำหนดที่ฉันอยากรู้)


3
เปลี่ยนคำถามเพื่อสะท้อนสมมติฐานที่ได้รับคำตอบที่ยอมรับ ในบริบทของการละเมิดความปลอดภัยวิธีเดียวที่จะกำจัดผู้ใช้ที่เป็นอันตรายออกจากระบบของคุณคือฉลาดกว่าผู้ใช้นั้น ผู้ใช้ที่ฉลาดจะไม่ปล่อยให้ตัวเองแสดงใน utmp หรือได้รับการค้นพบโดยสิ่งที่เป็นที่น่ารำคาญเป็นหรือwho(1) w(1)วิธีที่ไม่สามารถป้องกันได้เพียงวิธีเดียวที่จะกำจัดรูทคิทที่อาจติดตั้งได้คือการล้างและติดตั้งระบบใหม่อย่างสมบูรณ์
jw013

คำตอบ:


140

อาจเป็นวิธีที่ง่ายกว่า แต่ฉันทำสิ่งนี้:

  1. ดูว่าใครลงชื่อเข้าใช้เครื่องของคุณ - ใช้whoหรือw:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. ค้นหา ID กระบวนการของเชลล์ที่ TTY เชื่อมต่ออยู่กับ:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. หัวเราะเยาะการตัดการเชื่อมต่อที่กำลังจะเกิดขึ้นของพวกเขา

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. ฆ่ากระบวนการที่เกี่ยวข้อง:

    > kill -9 30737
    

ฉันเพิ่งค้นพบคุณสามารถรวมขั้นตอนที่ 1 และ 2 โดยให้ธง; PID คือหมายเลขที่อยู่ด้านขวา:who-u

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)

61
+1 สำหรับ "หัวเราะกับการขาดการเชื่อมต่อที่กำลังจะเกิดขึ้น (ขั้นตอนนี้เป็นทางเลือก แต่ได้รับการสนับสนุน)"
Josh

9
kill -9ใช่มั้ย คุณอยู่ในโหมด BOFH ในโหมดนี้จริงๆ
Jander

12
@ Jander คุณกำลังเตะผู้ใช้ออกจากระบบ คุณต้องดีแค่ไหน?
Michael Mrozek

6
โดยปกติฉันจะบอกว่าไม่สนับสนุนให้คนทำผิดกฎkill -9และเริ่มต้นด้วยสัญญาณที่นุ่มนวลแทน แต่ฉันคิดว่าในบริบทนี้มันไม่สำคัญมากนัก ฉันแค่แสดงความคิดเห็นในกรณีที่ผู้คนพลาดเรื่องตลก
jw013

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

32

คุณสามารถใช้whoเพื่อค้นหาว่าใครเข้าสู่ระบบอย่างไรก็ตามถ้ามีหลายกระบวนการมีวิธีที่สะดวกกว่าการฆ่าแต่ละกระบวนการ: คุณสามารถใช้killall -u usernameเพื่อฆ่ากระบวนการทั้งหมดโดยผู้ใช้นั้น


+1 การใช้killallจะเหมาะสมกว่าเล็กน้อยในสภาพแวดล้อมแบบกราฟิกเนื่องจากมีมากกว่าเปลือกที่จะฆ่า
จอห์น WH สมิ ธ

3
คำเตือน: หากคุณใช้สิ่งนี้กับผู้ใช้รูทคุณจะฆ่ากระบวนการรูททั้งหมดและคุณจะต้องรีสตาร์ทเซิร์ฟเวอร์จริง
Kunok

1
@Kunok ภายใต้คำบรรยายใดที่คุณต้องการเตะผู้ใช้รูทออกจากเครื่อง? เช่นถ้าบัญชีนั้นถูกไฮแจ็กหรืออะไร?
Alexej Magura

23

เวทมนตร์!

ฉันซาบซึ้งถึงอารมณ์ขันของคำตอบที่ได้รับ แต่มืออาชีพฉันไม่สามารถสนับสนุนได้

วิธีการที่สง่างามที่สุดที่ฉันรู้คือการส่ง -HUP ไปยังเชลล์เพื่อจำลอง hangup ผู้ใช้ คุณสามารถส่งสิ่งนี้ไปยัง idle sshd ของผู้ใช้เพื่อจำลองการเชื่อมต่อของพวกเขาหายไปซึ่งก่อให้เกิดการทำความสะอาดของสภาพแวดล้อมเชลล์ทั้งหมด (รวมถึงเปลือกหอยเด็ก) หรือส่งสิ่งนี้ไปยังเชลล์ที่ซ้อนกัน ทำให้คุณไม่ต้องถอดระบบไฟล์) หากคุณต้องการความแม่นยำจริงๆ

การใช้writeเพื่อส่งข้อความไปยังสถานะไม่ได้ใช้งานก่อนที่คุณจะบู๊ตนั้นเป็นงานอดิเรกที่สนุก


1
ในขณะที่ความรู้สึกหลอกผู้มีอำนาจทุกอย่างที่มาพร้อมกับการฆ่า -9 นั้นสนุก แต่ข้อเสนอแนะนี้น่าจะดีกว่า การลงคะแนนจากฉัน
Andrew Falanga

4
เพื่อให้คำตอบนี้ชัดเจนสิ่งที่ฉันทำคือ: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(การนอนให้โอกาสผู้ใช้ในการบันทึกและออกจากระบบ แต่คุณอาจจะใช้สิ่งนี้กับผู้ใช้ที่ลืมออกจากระบบเท่านั้น)
wkschwartz

13

ออกจากระบบ 'ชื่อผู้ใช้' ของผู้ใช้:

skill -KILL -u username

ดู man skill


3
ฉันคิดว่ามันจะฆ่าทุกโพรเซสโดยผู้ใช้ไม่ใช่แค่เปลือกของพวกมัน แต่ถ้านั่นคือสิ่งที่คุณต้องการมันจะง่ายกว่านี้อย่างแน่นอน
Michael Mrozek

ฉันไม่เห็นการทำงานกับ RHEL7 นี้จริงๆ
antivirtel

11

คำสั่งที่มีประโยชน์อื่น ๆที่นี่ pkill มีข้อเสียที่บน Solaris IIRC มันหมายถึงสิ่งที่แตกต่างอย่างสิ้นเชิง - นอกจากนี้ยังมีตัวเลือกขั้นสูงเพิ่มเติมเล็กน้อยpkill -u username && pkill -9 -u usernamekillallpkill


8
บน Solaris 'killall' ถูกใช้โดยสคริปต์การปิดเพื่อฆ่า (เกือบ) กระบวนการทั้งหมดบนเซิร์ฟเวอร์ "มันทำในสิ่งที่พูดบนกระป๋อง"
dr-jan

ผู้คนทำไมคุณถึงนึก SIGKILL มาก? การเรียกใช้โปรแกรมและแอปพลิเคชันจะไม่มีโอกาสแม้แต่จะบันทึกข้อมูลและล้างข้อมูล SIGTERM (ตามที่ใช้ในการปิดระบบ) หรือ SIGHUP จะทำเช่นกันและมีความสง่างามมากขึ้น (คุณยังสามารถส่ง SIGKILL หลังจากครบกำหนดระยะเวลาผ่อนผัน)
countermode

3

ก่อนอื่นสิ่งนี้บ่งบอกถึงปัญหาที่ใหญ่กว่า หากคุณมีผู้ใช้ที่คุณไม่ไว้วางใจในระบบของคุณคุณควรจะปรับระดับและสร้างภาพใหม่

เมื่อทราบแล้วคุณสามารถทำสิ่งต่อไปนี้บางส่วนหรือทั้งหมด:

# ตั้งค่าสภาพแวดล้อม
$ BADUSER = foo # โดยที่ foo คือชื่อผู้ใช้ที่เป็นปัญหา
$ USERLINE = $ (grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $ (echo $ {USERLINE} | awk -F: '{พิมพ์ $ 3}')
$ BADGID = $ (echo $ {USERLINE} | awk -F: '{พิมพ์ $ 4}')
$ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F: '{พิมพ์ $ 6}')
$ BDIR = "~ / backup / home-backup /"
$ TSTAMP = $ (วันที่ +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# ปิดใช้งานการเข้าสู่ระบบในอนาคตของผู้ใช้
$ sudo chsh -s / bin / false "$ {BADUSER}"

# kill กระบวนการทั้งหมดของผู้ใช้
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{พิมพ์ $ 2}')
$ sudo kill -9 $ {BADPROCS}

# back up / clear โฮมไดเรกทอรีของผู้ใช้
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# ค้นหาไฟล์ทั้งหมดที่ผู้ใช้เป็นเจ้าของ
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# ลบผู้ใช้
$ sudo userdel $ {BADUSER}

ฉันไม่ทราบว่าฉันจะเห็นด้วยกับ "ระดับมัน reimage" นี่คือยูนิกซ์ไม่ใช่ windows ... ฉันไม่ได้มีปัญหานี้จริง ๆ ... ฉันแค่ถาม
xenoterracide

3
นอกจากนี้เพียงเพราะคุณต้องเตะออกจากผู้ใช้ไม่ได้หมายความว่าพวกเขาไม่น่าเชื่อถือ บางทีพวกเขาอาจลืมออกจากระบบ
David Z

xenoterracide: บางทีฉันแค่ปกป้องระบบที่ฉันบำรุงรักษา แต่ถ้าฉันมีผู้ใช้ที่ฉันรู้สึกว่าจำเป็นต้องถูกบังคับให้ลบออกจากระบบภายใต้การควบคุมของฉันมีบางสิ่งที่ร้ายแรงจะต้องเกิดขึ้น
cjac

-1 สำหรับการอ่านสิ่งต่าง ๆ ลงในคำถามที่ไม่ได้ติดตามอย่างมีเหตุมีผลและลาก Q / A นอกหัวข้อ
Wesley

you have users that you don't trust on your system... หรืออาจเป็นได้ว่าคุณกำลังฆ่าคนหนึ่งเป็นข้อความถึงคนอื่น ๆ ท้ายที่สุดแล้วผู้ดูแลระบบของลัทธิไม่ใช่ "จะดีกว่าที่จะกลัวกว่าที่จะรัก" Machiavelli ควรเขียนหนังสือ O'Reilly
คู่ปรับ Shot

0

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

ดังนั้นตามโซลูชันที่เสนอที่นี่ฉันผสมทุกอย่างในสคริปต์ Bash เชิงโต้ตอบที่แสดงรายการผู้ใช้และเซสชันจากwho -uเพื่อให้ผู้ใช้เลือกว่าจะทำอย่างไร

จากนั้นคุณสามารถ:

  • ฆ่าเซสชันทั้งหมดสำหรับผู้ใช้ killall -u <username> -HUP
  • ฆ่าเซสชั่นที่เฉพาะเจาะจง kill <PID>

ทุกข้อมูลที่จำเป็นมาจากwho -uและมีการแยกวิเคราะห์แล้วใช้และmapfileawk

ฉันจะเพิ่มความเป็นไปได้ในการส่งข้อความโดยใช้writeภายหลัง (ฟอร์กกระบวนการด้วยความล่าช้า)

ฉันอาจจะเพิ่มตัวเลือกในการฆ่าเซสชันเฉพาะด้วยkill -9เช่นกัน แต่ฉันไม่มีปัญหากับkillคนอื่น ๆ และคนอื่น ๆ ที่ชี้ให้เห็นkill -9ควรหลีกเลี่ยงถ้าเป็นไปได้

คุณสามารถตรวจสอบรหัสบน GitHub หากคุณต้องการลองใช้หรือเรียนรู้เพิ่มเติมเกี่ยวกับวิธีที่ฉันทำด้วยวิธีอัตโนมัติ:


0

ดังนั้นคุณจะเตะผู้ใช้ [ใจดี] ออกจากกล่อง Linux ของคุณได้อย่างไร

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

โดยทั่วไปมีสองคำตอบ ...

ตัวเลือกก: ก่อให้เกิดการออกจากระบบของผู้ใช้ดังกล่าวซึ่งเคยมีการล็อกอินหลายครั้ง ดังนั้นนี่จะหมายถึงการระบุกระบวนการเหล่านั้นที่เป็นของผู้ใช้ตรวจสอบย้อนกลับโดย uid และจัดเป็นส่วนหนึ่งของกระบวนการเข้าสู่ระบบสำหรับลินุกซ์ distro ที่กำหนดที่คุณกำลังทำงาน ตระหนักว่ามีกระบวนการหลักเช่น SSH หรือ VNC ก่อน "เข้าสู่ระบบ" และกระบวนการเด็กเช่น GDM หลังจาก "เข้าสู่ระบบ" โดยปกติแล้วการฆ่ากระบวนการหลักจะฆ่ากระบวนการเด็ก แต่ไม่เสมอไป ดังนั้นคุณต้องการที่จะฆ่ากระบวนการอื่น ๆ ที่เห็นได้ชัดว่าไม่ต้องการอีกต่อไปหลังจากออกจากระบบ ในการทำสิ่งนี้สิ่งนี้จะทำให้งานเบื้องหลังทำงานต่อไป ... เพราะเป็นผู้ใช้ที่ใจดีและบางทีคุณแค่ต้องการออกจากระบบ เท่าที่ฉันรู้/usr/bin/wและ/usr/bin/whoจะรายงานผู้ที่ได้ผ่านกระบวนการเข้าสู่ระบบ

ตัวเลือก B: จบกระบวนการทั้งหมดเป็นเจ้าของโดยสมบูรณ์ uid เฉพาะซึ่งก็จะหมายถึงการฆ่าใด ๆ และกระบวนการทั้งหมดเป็นของผู้ใช้กล่าวมานี้ก็จะเข้าสู่ระบบพวกเขาว่าพวกเขาถูกบันทึกไว้ในนี้จะตอบสนอง. เตะพวกเขาออกจากระบบ เพียงแค่ต้องเรียบง่ายps -ef | grep <uid>และสิ้นสุดกระบวนการเหล่านั้นในลักษณะใดก็ตามที่เป็นที่ยอมรับ

fwiw ใน SLES 11 จะรายงาน

ทักษะคน ... เครื่องมือเหล่านี้อาจล้าสมัยและไม่สามารถพกพาได้ ไวยากรณ์คำสั่งถูกกำหนดอย่างไม่ดี พิจารณาใช้คำสั่ง killall, pkill และ pgrep แทน

kill -9 FTW!


-1

ในความคิดของฉันมันไม่มีประโยชน์ที่จะใช้killall -u usernameเพราะถ้ามันเป็นผู้ใช้คนเดียวกับคุณคุณจะเตะตัวเองออกไป ดังนั้นkillกระบวนการจะเป็นทางออกที่ดีกว่า


หากมีกระบวนการที่ดำเนินการโดยผู้ใช้นั้นบางที SSHD คุณจะไม่เข้าสู่เซิร์ฟเวอร์ทำให้เกิดการปิดระบบ SSH
Mailo

3
เหตุใดบนโลก SSH daemon (หรือภูตใด ๆ ) จะทำงานโดยใช้ข้อมูลประจำตัวของผู้ใช้ที่จำเป็นต้องออกจากระบบบังคับด้วยเหตุผลใด ๆ จริง? นอกจากนี้คำตอบนี้เพิ่มอะไรที่ไม่ครอบคลุมโดยคำตอบของ Michael MrozekหรือคำตอบของAndrew B (และอาจอื่น ๆ )
CVn

-2

คำสั่งนี้ใช้งานได้ดีสำหรับ GUI "สำคัญ" ของฉันปฏิเสธที่จะออกจากระบบ ...

leaves@me:/# skill -HUP -u username
  • ฉันไม่รู้ว่าเกิดอะไรขึ้น
  • ต้องมีการอัปเดต
  • "Google" ถูกลงอีกครั้ง
  • มันเป็นไวรัสบน InterWebs

บางครั้งคุณต้องเปลี่ยนมัน


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