どのようにして良性のユーザーをシステムから追い出しますか?


66

私はこれを少しグーグルで調べていて、いくつかの方法に気づきましたが、グーグルがすべてを知っているわけではないと推測しています。だから、どのように、あなたはあなたの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. TTYが接続されているシェルのプロセスIDを検索します。

    > 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「切迫した切断に笑います(この手順はオプションですが、推奨されます)」
ジョシュ

9
kill -9ね?これは本当にBOFHモードです。
ジャンダー

12
@Janderシステムからユーザーを追い出しています。あなたはどれくらいいい人なの?
マイケルMrozek

6
通常、私は人々を虐待することを奨励せず、kill -9代わりに穏やかな信号から始めますが、この文脈ではそれほど重要ではないと思います。人々が冗談を逃した場合に備えて、コメントを残しています。
jw013

5
あり殺す(あなたがバットヘッドモードを有効にした場合でも、あなたの犠牲者をからかっ)基本的に全体のプロセスを自動化している
ウルリッヒDangel

32

Michealが既に指摘したように、whoログインしているユーザーを見つけるために使用できます。ただし、複数のプロセスがある場合は、各プロセスを個別に強制終了するよりも便利な方法killall -u usernameがあります。


+1。使用killallするのはグラフィカル環境でもやや適切です。これは、シェルを殺すだけではないためです。
ジョンWHスミス14年

3
警告:これをrootユーザーに使用すると、すべてのrootプロセスが強制終了され、サーバーを物理的に再起動する必要があります。
クノック

1
@Kunokは、どのような状況でルートユーザーをマシンから追い出しますか?そのアカウントがハイジャックされた場合などですか?
アレクセイマグラ

23

ネクロマンシー!

受け入れられた答えのユーモアに感謝しますが、専門的にそれを支持することはできません。

私が知っている最も優雅な方法は、-HUPをシェルに送信してユーザーのハングアップをシミュレートすることです。これをユーザーのアイドルsshdに送信して、失われた接続をシミュレートし、シェル環境全体(子シェルを含む)のクリーンアップをトリガーするか、特定のネストされたシェル(たとえば、切断されたターミナルマルチプレクサー内に設定されたシェル本当に正確にしたい場合は、ファイルシステムをアンマウントしないようにしてください)。

使用してwrite、あなたがそれらを起動する前に、末端アイドルのptyにメッセージを送信することがあるけれども楽しい趣味。


1
kill -9に伴う疑似全能性の感覚は楽しいものですが、この提案はおそらくより良い方法です。私からの賛成票。
アンドリューファランガ

4
この答えは、明示的にするために、私がやったことだった: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(睡眠がユーザーに保存し、ログオフする機会を与えるが、あなたはおそらく唯一とにかくログオフするのを忘れて、ユーザーにこれを使用している)
wkschwartz

13

ユーザー「username」からログアウトします。

skill -KILL -u username

見る man skill


3
私は殺すだろうと思い、すべてそのユーザーだけでなく、彼らのシェルによってプロセスを、それはあなたが欲しいものだならば、これは間違いなく簡単です
マイケルMrozek

私は本当にこのRHEL7に取り組んで表示されていない
antivirtel

11

他の便利なコマンドはpkillこちらpkill -u username && pkill -9 -u usernameです。 killallSolaris IIRCでは完全に異なるものを意味するという欠点がpkillあります-また、少し高度なオプションがあります。


8
Solarisでは、「killall」はシャットダウンスクリプトによって使用され、サーバー上のすべてのプロセスを(ほぼ)強制終了します。「それはブリキに書かれていることをします。」
dr-jan

皆さん、なぜSIGKILLをそんなに空想しているのですか?実行中のプログラムとアプリケーションには、データを保存して少しクリーンアップする機会すらありません。SIGTERM(シャットダウン時に使用)またはSIGHUPも同様に機能し、より優雅です。(猶予期間の終了後もSIGKILLを送信できます。)
カウンター

3

まず、これはより大きな問題を示しています。システムで信頼していないユーザーがいる場合は、おそらくレベルを上げてイメージを変更する必要があります。

それを念頭に置いて、次の一部またはすべてを実行できます。

#環境を設定する
$ BADUSER = foo#ここで、fooは問題のユーザー名です
$ USERLINE = $(grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $(echo $ {USERLINE} | awk -F: '{print $ 3}')
$ BADGID = $(echo $ {USERLINE} | awk -F: '{print $ 4}')
$ BADHOMEDIR = $(echo $ {USERLINE} | awk -F: '{print $ 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}"

#ユーザーのすべてのプロセスを強制終了
$ BADPROCS = $(ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

#ユーザーのホームディレクトリをバックアップ/クリア
$ 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}

「レベルをイメージに変更」に同意するかどうかはわかりませんが、これはWindowsではなくUnixです。この問題は実際にはありません。
xenoterracide

3
さらに、ユーザーをキックオフする必要があるからといって、必ずしもユーザーが信頼できないというわけではありません。ログアウトするのを忘れたのかもしれません。
デビッドZ

xenoterracide:たぶん私は自分が管理しているシステムを単に保護しているだけかもしれませんが、自分の管理下にあるシステムから強制的に削除する必要があると感じたユーザーがいれば、何か重大なことが起こったはずです。
cjac

-1。質問に論理的に従わないものを読み、Q / Aをトピック外にドラッグします。
ウェズリー

you have users that you don't trust on your system...または、他の人へのメッセージとしてあなたが1人を殺しているだけかもしれません。結局のところ、システム管理者の信条は「愛されるより恐れられる方が良い」のではないでしょうか?すべてのジョークは別として、マキャベリはオライリーの本を書くべきです。
パルティアショット14

0

私はあちこち見て、このタスクを自動化する単一のスクリプトを見つけることができませんでした。

そこで、ここで提案したソリューションに基づいて、ユーザーとセッションを一覧表示する対話型のBashスクリプトにすべてを混合しwho -uて、ユーザーが何をすべきかを選択できるようにしました。

その後、次のいずれかを実行できます。

  • ユーザーのすべてのセッションを強制終了します killall -u <username> -HUP
  • 特定のセッションを強制終了する kill <PID>

必要な情報はすべてから取得who -uされ、mapfileand を使用して解析されawkます。

write後で(遅延を伴うプロセスの分岐)を使用してメッセージを送信する可能性を追加します。

特定のセッションを強制終了するオプションもおそらく追加しますkill -9。しかしkill、他の人が指摘したように、私は問題がなかったkill -9ので、できれば避けるべきです。

githubでコードを確認したり、自動化された方法でそれをどのように行っているかについて詳しく知りたい場合は、コードを確認できます。


0

それでは、どのようにして[良性]ユーザーをLinuxボックスから追い出しますか?

最終的には、ユーザーIDから所有、関連付け、または生成されるプロセスを識別して終了します。その最終目標に到達するために使用するコマンドが何であれ、そこに到達する限り必ずしも問題ではありません。

基本的に2つの答え...

オプションA: そのユーザーからのログアウトを引き起こします。したがって、これは、ユーザーが所有し、uidで追跡可能で、実行中の特定のLinuxディストリビューションのログインプロセスの一部として分類されるプロセスを識別することを意味します。「ログイン」の前にSSHやVNCなどの親プロセスがあり、「ログイン」の後にGDMなどの子プロセスがあることを認識してください。したがって、ログアウト後に明らかに不要になったこれらの他のプロセスを強制終了する必要があります。これをすべて実行する場合、これはバックグラウンドジョブの実行を継続します。これは良性のユーザーであり、単にログアウトしたいためです。限り私は知っている、など/usr/bin/w/usr/bin/whoプロセス内のログを通過した人報告されます。

オプションB: 単にいずれかを殺す意味し、完全に特定のuidが所有するすべてのプロセス、そして所有するすべてのプロセスを終了し、彼らがログインしている場合、ユーザは、これはまた、それらをログアウトすると述べこれを満たすでしょう。オフシステムキックにそれらを。それは単純である必要があり、ps -ef | grep <uid>それからそれらのすべてのプロセスを受け入れ可能な方法で終了します。

SLES 11で報告されるfwiw

man skill ...これらのツールはおそらく時代遅れで移植性がありません。コマンド構文の定義が不十分です。代わりに、killall、pkill、およびpgrepコマンドの使用を検討してください。

kill -9 FTW!


-1

私の意見では、それはkillall -u usernameあなたと同じユーザーである場合、あなたは自分自身をキックオフするので、使用することは本当に有用ではありません。したがってkill、このプロセスはより優れたソリューションになります。


また、そのユーザーが実行しているプロセス、おそらくSSHDがサーバーにアクセスすることがない場合、SSHシャットダウンが発生します。
マイロ

3
なんで現実的な理由でシステムから強制的にログオフする必要があるユーザーの資格情報を使用して、SSHデーモン(または任意のデーモン)が実行されるのですか?また、Michael Mrozekの回答またはAndrew Bの回答(および場合によってはその他)でカバーされていないこの回答は何を追加しますか?
CVn

-2

このコマンドは、私の「重要な」ユーザーがサインアウトすることを拒否するGUIでうまく機能しました...

leaves@me:/# skill -HUP -u username
  • 何が起こったのか分かりません。
  • 更新されている必要があります。
  • 「Google」が再びダウンしました。
  • InterWebs上のウイルスでした。

あなたがそれらを必要とする場合のいくつかの転換。


1
これはすでにbsdの回答で言及されています。
スティーブンキット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.