Làm thế nào để bạn đá một người dùng lành tính ra khỏi hệ thống của bạn?


66

Tôi đã googling điều này một chút trước đây và nhận thấy một số cách, nhưng tôi đoán rằng google không biết tất cả. Vậy làm thế nào để bạn loại bỏ người dùng khỏi hộp Linux của bạn? Ngoài ra, làm thế nào để bạn nhìn thấy họ đang đăng nhập ở nơi đầu tiên? và có liên quan ... phương thức của bạn có hoạt động không nếu người dùng đăng nhập vào X11 DE (không phải là yêu cầu tôi chỉ tò mò)?


3
Thay đổi câu hỏi để phản ánh các giả định đưa ra câu trả lời được chấp nhận. Trong bối cảnh vi phạm bảo mật, cách duy nhất để loại bỏ người dùng độc hại khỏi hệ thống của bạn là thông minh hơn nhiều so với người dùng đó. Một người dùng thông minh sẽ không để bản thân xuất hiện trong utmp hoặc được tìm thấy bởi một cái gì đó tầm thường như who(1)hoặc w(1). Cách duy nhất để loại bỏ mọi rootkit tiềm năng có thể được cài đặt là xóa sạch và cài đặt lại hệ thống.
jw013

Câu trả lời:


140

Có lẽ có một cách dễ dàng hơn, nhưng tôi làm điều này:

  1. Xem ai đã đăng nhập vào máy của bạn - sử dụng whohoặc w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Tra cứu ID tiến trình của trình bao TTY của chúng được kết nối với:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Cười vào sự ngắt kết nối sắp xảy ra của họ (bước này là tùy chọn, nhưng được khuyến khích)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Giết quá trình tương ứng:

    > kill -9 30737
    

Tôi chỉ phát hiện ra bạn có thể kết hợp bước 1 và 2 bằng cách đưa ra whonhững -ulá cờ; PID là số tắt ở bên phải:

> 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 cho "Cười trước sự ngắt kết nối sắp xảy ra của họ (bước này là tùy chọn, nhưng được khuyến khích)"
Josh

9
kill -9, Huh? Bạn thực sự đang ở chế độ BOFH trên cái này.
Jander

12
@Jander Bạn đang đá người dùng khỏi hệ thống; bạn cần trở nên tốt đẹp như thế nào?
Michael Mrozek

6
Thông thường, tôi nói không khuyến khích mọi người lạm dụngkill -9 và thay vào đó bắt đầu bằng các tín hiệu nhẹ nhàng hơn , nhưng tôi cho rằng trong bối cảnh này, điều đó không quan trọng lắm. Tôi chỉ để lại một bình luận trong trường hợp mọi người bỏ lỡ trò đùa.
jw013

5
Ngoài ra còn có sự giết chóc về cơ bản tự động hóa toàn bộ quá trình (thậm chí tạo niềm vui cho nạn nhân của bạn nếu bạn bật chế độ
butthead

32

Như Micheal đã chỉ ra, bạn có thể sử dụng whođể tìm ra ai đã đăng nhập. Tuy nhiên, nếu họ có nhiều quy trình, có một cách thuận tiện hơn là giết từng quy trình riêng lẻ: bạn có thể sử dụng killall -u usernameđể giết tất cả các quy trình của người dùng đó.


+1. Sử dụng killallcũng sẽ phù hợp hơn một chút trong môi trường đồ họa, vì không chỉ có vỏ để giết.
John WH Smith

3
CẢNH BÁO: Nếu bạn sử dụng điều này cho người dùng root, bạn sẽ giết tất cả các tiến trình root và bạn sẽ cần phải khởi động lại máy chủ một cách vật lý.
Kunok

1
@Kunok theo những gì bạn muốn loại bỏ người dùng root khỏi máy? Giống như nếu tài khoản đó bị tấn công hay cái gì đó?
Alexej Magura

23

Necromancy!

Tôi đánh giá cao sự hài hước của câu trả lời được chấp nhận, nhưng về mặt chuyên môn tôi không thể ủng hộ nó.

Phương pháp duyên dáng nhất mà tôi biết là gửi một -HUP đến trình bao để mô phỏng hangout của người dùng. Bạn có thể gửi cái này đến sshd của người dùng để mô phỏng kết nối của họ bị mất, điều này sẽ kích hoạt việc dọn sạch toàn bộ môi trường shell (bao gồm cả shell con) hoặc gửi nó tới các shell được lồng cụ thể (giả sử, các thiết lập bên trong bộ ghép kênh đầu cuối bị ngắt kết nối đang ngăn bạn ngắt kết nối một hệ thống tập tin) nếu bạn muốn thực sự chính xác.

Sử dụng writeđể gửi tin nhắn đến ptys nhàn rỗi cuối cùng trước khi bạn khởi động chúng một sở thích thú vị mặc dù.


1
Trong khi cảm giác giả toàn năng đi kèm với giết -9 là thú vị, thì gợi ý này có lẽ tốt hơn. Một phiếu bầu từ tôi.
Andrew Falanga

4
Để làm cho câu trả lời này rõ ràng, những gì tôi đã làm là: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(giấc ngủ mang đến cho người dùng cơ hội lưu và đăng xuất, nhưng có lẽ bạn chỉ sử dụng điều này trên một người dùng đã quên đăng xuất bằng mọi cách)
wkschwartz

13

Thoát khỏi tên người dùng 'tên người dùng':

skill -KILL -u username

Xem man skill


3
Tôi nghĩ rằng điều đó sẽ giết tất cả các quy trình bởi người dùng đó, không chỉ vỏ của họ, nhưng nếu đó là những gì bạn muốn thì điều này chắc chắn đơn giản hơn
Michael Mrozek

Tôi thực sự không thấy điều này hoạt động trên RHEL7
antivirtel

11

Lệnh hữu ích khác là pkillở đây pkill -u username && pkill -9 -u username. killallcó nhược điểm là trên Solaris IIRC, nó có nghĩa là một cái gì đó hoàn toàn khác - cũng pkillcó các tùy chọn nâng cao hơn một chút.


8
Trên Solaris, 'killall' được sử dụng bởi các kịch bản tắt máy để giết (gần như) tất cả các quy trình trên máy chủ. "Nó không những gì nó nói trên tin."
dr-jan

Các bạn ơi, tại sao bạn lại thích SIGKILL đến vậy? Chạy các chương trình và ứng dụng thậm chí sẽ không có cơ hội lưu dữ liệu và dọn dẹp một chút. SIGTERM (như được sử dụng khi tắt máy) hoặc SIGHUP cũng sẽ làm như vậy và duyên dáng hơn. (Bạn vẫn có thể gửi SIGKILL sau khi hết thời gian ân hạn.)
phản hồi

3

Trước hết, điều này cho thấy một vấn đề lớn hơn. Nếu bạn có người dùng mà bạn không tin tưởng vào hệ thống của mình, có lẽ bạn nên cấp nó và hình ảnh lại.

Với ý nghĩ đó, bạn có thể thực hiện một số hoặc tất cả những điều sau đây:

# thiết lập môi trường
$ BADUSER = foo # trong đó foo là tên người dùng được đề cập
$ USERLINE = $ (grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $ (echo $ {USERLINE} | awk -F: '{in $ 3}')
$ BADGID = $ (echo $ {USERLINE} | awk -F: '{in $ 4}')
$ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F: '{in $ 6}')
$ BDIR = "~ / sao lưu / sao lưu tại nhà /"
$ TSTAMP = $ (ngày +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# vô hiệu hóa đăng nhập trong tương lai của người dùng
$ sudo chsh -s / bin / false "$ {BADUSER}"

# giết tất cả các quy trình của người dùng
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{in $ 2}')
$ sudo kill -9 $ {BADPROCS}

# sao lưu / xóa thư mục chính của người dùng
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# tìm tất cả các tệp thuộc sở hữu của người dùng
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# xóa người dùng
$ sudo userdel $ {BADUSER}

Tôi không biết rằng tôi sẽ đồng ý với "mức độ tái hiện" đây không phải là cửa sổ ... Tôi thực sự không có vấn đề này ... Tôi chỉ đang hỏi.
xenoterracide

3
Ngoài ra, chỉ vì bạn phải loại bỏ người dùng không có nghĩa là họ không đáng tin. Có lẽ họ chỉ quên đăng xuất.
David Z

xenoterracide: Có thể tôi chỉ bảo vệ các hệ thống tôi duy trì, nhưng nếu tôi có một người dùng mà tôi cảm thấy cần phải loại bỏ khỏi hệ thống dưới sự kiểm soát của tôi, thì điều gì đó nghiêm trọng đã xảy ra.
cjac

-1 để đọc mọi thứ vào câu hỏi không theo dõi một cách hợp lý và kéo Q / A ra khỏi chủ đề.
Wesley

you have users that you don't trust on your system... Hoặc có thể là bạn đang giết một người như một tin nhắn cho những người khác. Rốt cuộc, có phải tín ngưỡng của sysadmin không "thà sợ còn hơn được yêu"? Bỏ qua tất cả những trò đùa, Machiavelli nên viết một cuốn sách O'Reilly.
Bắn Parthian

0

Tôi nhìn xung quanh và không thể tìm thấy một tập lệnh nào để tự động hóa tác vụ này.

Vì vậy, dựa trên các giải pháp được đề xuất ở đây, tôi đã trộn lẫn mọi thứ trong một tập lệnh Bash tương tác liệt kê người dùng và phiên who -uđể người dùng chọn làm gì.

Sau đó, bạn có thể:

  • giết tất cả các phiên cho người dùng killall -u <username> -HUP
  • giết một phiên cụ thể kill <PID>

Tất cả các thông tin cần thiết đến từ who -uvà sau đó được phân tích cú pháp bằng cách sử dụng mapfileawk.

Tôi sẽ thêm khả năng gửi tin nhắn bằng cách sử dụng writesau (làm chậm quá trình).

Tôi có lẽ cũng sẽ thêm tùy chọn để giết một phiên cụ thể kill -9. Nhưng tôi không có vấn đề gì với chỉ killvà như được chỉ ra bởi những người khác, kill -9nên tránh nếu có thể.

Bạn có thể kiểm tra mã trên github nếu bạn muốn dùng thử hoặc tìm hiểu thêm về cách tôi đang thực hiện theo cách tự động:


0

Vậy làm thế nào để bạn loại bỏ người dùng [lành tính] khỏi hộp Linux của bạn?

Cuối cùng, việc xác định và kết thúc các quá trình được sở hữu, liên kết hoặc sinh ra từ id người dùng. Bất cứ lệnh nào bạn sử dụng để đạt được mục tiêu cuối cùng đó không nhất thiết phải miễn là bạn đạt được điều đó.

Về cơ bản hai câu trả lời ...

Tùy chọn A: gây ra đăng xuất của người dùng đã nói, trong đó bao giờ và tuy nhiên nhiều thông tin đăng nhập họ có. Vì vậy, điều này có nghĩa là xác định các quy trình thuộc sở hữu của người dùng, có thể theo dõi bởi uid và được phân loại là một phần của quy trình đăng nhập cho bản phân phối linux đã cho mà bạn đang chạy. Nhận ra có các quy trình cha mẹ như SSH hoặc VNC trước khi "đăng nhập" và các quy trình con như GDM sau khi "đăng nhập" Thông thường việc giết một quy trình cha mẹ sẽ giết chết quy trình con, nhưng không phải lúc nào cũng vậy. Vì vậy, bạn sẽ muốn giết các quá trình khác mà rõ ràng là không còn cần thiết sau khi đăng xuất. Khi thực hiện tất cả điều này, điều này sẽ giữ cho các công việc nền chạy ... bởi vì đó là một người dùng lành tính và có lẽ bạn chỉ muốn đăng xuất chúng. Theo như tôi biết, /usr/bin/w/usr/bin/whosẽ báo cáo những người đã thông qua quá trình đăng nhập.

tùy chọn B: kết thúc hoàn toàn tất cả các quy trình thuộc sở hữu của một uid cụ thể, điều đó đơn giản có nghĩa là giết bất kỳ và tất cả các quy trình thuộc sở hữu của người dùng đã nói, điều này cũng sẽ đăng xuất chúng nếu chúng được đăng nhập. Điều này sẽ thỏa mãn việc loại bỏ chúng khỏi hệ thống . Điều đó chỉ cần đơn giản ps -ef | grep <uid>và sau đó kết thúc tất cả các quy trình theo bất kỳ cách nào được chấp nhận.

fwiw trong SLES 11 nó báo cáo

kỹ năng của con người ... Những công cụ này có lẽ đã lỗi thời và không thể truy cập được. Cú pháp lệnh được xác định kém. Thay vào đó, hãy xem xét sử dụng các lệnh killall, pkill và pgrep.

kill -9 FTW!


-1

Theo tôi, nó không thực sự hữu ích khi sử dụng killall -u usernamevì nếu đó là cùng một người dùng với bạn, bạn sẽ tự đá mình. Vì vậy, killquá trình sẽ là một giải pháp tốt hơn.


Ngoài ra, nếu có các quy trình được chạy bởi người dùng đó, có lẽ SSHD bạn sẽ không bao giờ vào Máy chủ, gây ra tắt máy SSH.
Mailo

3
Tại sao trên Trái đất , SSH daemon (hoặc bất kỳ trình nền nào ) sẽ chạy bằng thông tin đăng nhập của người dùng cần phải đăng xuất khỏi hệ thống vì bất kỳ lý do thực tế nào? Ngoài ra, câu trả lời này thêm gì mà không được trả lời bởi câu trả lời của Michael Mrozek hoặc câu trả lời của Andrew B (và có thể cả những người khác)?
một CVn

-2

Lệnh này hoạt động rất tốt cho GUI "từ chối" đáng kể của tôi từ chối đăng xuất khỏi ...

leaves@me:/# skill -HUP -u username
  • Tôi không biết chuyện gì đã xảy ra.
  • Phải có một bản cập nhật.
  • "Google" đã ngừng hoạt động trở lại.
  • Đó là một loại virus trên InterWeb.

Một số chuyển hướng trong trường hợp bạn cần chúng.


1
Điều này đã được đề cập trong câu trả lời của bsd.
Stephen Kitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.