어떻게 시스템에서 양성 사용자를 쫓아 내나요?


66

나는 이것을 조금 전에 인터넷 검색하고 몇 가지 방법을 발견했지만 Google이 모든 것을 알지 못한다고 생각합니다. 그래서 어떻게 당신은 당신의 리눅스 박스 떨어져 사용자를 걷어차? 또한 처음 로그인 한 것을 어떻게 알 수 있습니까? 그리고 관련 ... 사용자가 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
    

방금 플래그 를 제공 who하여 1 단계와 2 단계를 결합 할 수 있음을 발견했습니다 -u. PID는 오른쪽에있는 숫자입니다.

> 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
기본적으로 전체 프로세스를 자동화하는 슬레이 도 있습니다 (
버트 헤드

32

Micheal이 이미 지적했듯이, who누가 로그인했는지 확인할 수 있습니다 . 그러나 프로세스가 여러 개인 경우 각 프로세스를 개별적으로 종료하는 것보다 더 편리한 방법이 있습니다 killall -u username. 해당 사용자가 모든 프로세스를 종료하는 데 사용할 수 있습니다 .


+1. killall죽이는 것 이상의 쉘이 있기 때문에 그래픽 환경에서는 사용 이 약간 더 적합합니다.
John WH Smith

3
경고 : 루트 사용자에게이 옵션을 사용하면 모든 루트 프로세스가 종료되고 서버를 실제로 다시 시작해야합니다.
Kunok

1
@Kunok 어떤 상황에서 루트 사용자를 기계에서 쫓아 내고 싶습니까? 계정이 도용 당했거나 다른 것 같은가?
Alexej Magura

23

점!

나는 받아 들여진 대답의 유머에 감사하지만 전문적으로 나는 그것을 옹호 할 수 없다.

내가 아는 가장 우아한 방법은 쉘에 -HUP을 보내서 사용자 끊기를 시뮬레이션하는 것입니다. 이것을 유휴 sshd로 보내면 연결이 끊어지는 것을 시뮬레이트하여 전체 셸 환경 (하위 셸 포함)의 정리를 트리거하거나 특정 중첩 셸 (예 : 연결이 끊긴 터미널 멀티플렉서 내부의 설정)에 보낼 수 있습니다. 정말로 정확하려면 파일 시스템 마운트 해제를 방지하십시오.

사용 write당신이 그들을 부팅하기 전에 말기 유휴 ptys에 메시지를 보내도록하는 것입니다 하지만 재미있는 취미.


1
킬 -9를 수반하는 의사 전능 한 느낌은 재미 있지만,이 제안은 아마도 더 나을 것입니다. 나에게서 투표.
Andrew Falanga

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
필자 는 쉘이 아니라 해당 사용자가 모든 프로세스 를 종료 할 것이라고 생각 하지만, 이것이 원하는 경우에는 훨씬 간단합니다
Michael 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}

나는 이것이 "이미지를 재조정하는 수준"에 동의 할 것임을 모른다. 이것은 윈도우가 아닌 유닉스이다. 나는 정말로이 문제가 없다. 나는 단지 묻고 있었다.
xenoterracide

3
또한, 사용자를 시작해야한다고해서 반드시 신뢰할 수 없다는 의미는 아닙니다. 아마 그들은 로그 아웃하는 것을 잊었을 것입니다.
David Z

xenoterracide : 아마도 내가 유지하고있는 시스템을 보호하는 것이지만, 내가 통제하는 시스템에서 강제로 제거해야한다고 생각한 사용자가 있다면 심각한 문제가 발생했을 것입니다.
cjac

논리적으로 따르지 않고 Q / A를 주제에서 벗어나지 않는 문제의 내용을 읽은 경우 -1입니다.
웨슬리

you have users that you don't trust on your system... 또는 다른 사람에게 메시지로 하나를 죽이는 것일 수도 있습니다. 결국, sysadmin의 신조는 "사랑받는 것보다 두려워하는 것이 낫다"는 것이 아닙니까? 모든 농담을 제쳐두고 Machiavelli는 O'Reilly 책을 써야합니다.
Parthian Shot

0

나는 모든 것을 둘러 보았고이 작업을 자동화하는 단일 스크립트를 찾을 수 없었습니다.

따라서 여기에 제안 된 솔루션을 기반으로 대화 형 Bash 스크립트에 모든 것을 혼합 who -u하여 사용자가 수행 할 작업을 선택할 수 있는 사용자와 세션을 나열했습니다 .

그러면 다음 중 하나를 수행 할 수 있습니다.

  • 사용자의 모든 세션을 종료 killall -u <username> -HUP
  • 특정 세션을 죽이다 kill <PID>

모든 필요한 정보는에서 제공 who -u한 후 사용하여 구문 분석 mapfile하고 awk.

write나중에 사용하여 메시지를 보낼 수있는 가능성을 추가 할 것입니다 (프로세스가 지연됨).

아마와 함께 특정 세션을 죽일 수있는 옵션이 추가됩니다 kill -9뿐만 아니라입니다. 그러나 나는 kill다른 사람들이 지적한대로 문제가 없었으며 kill -9가능하면 피해야합니다.

github에서 코드를 확인하거나 자동화 된 방식으로 코드를 수행하는 방법에 대해 자세히 알아 보려면 다음 코드를 확인하십시오.


0

그렇다면 어떻게 리눅스 박스에서 [양성] 사용자를 쫓아 내나요?

결국 사용자 ID에서 소유, 연관 또는 생성 된 프로세스를 식별하고 종료합니다. 최종 목표를 달성하기 위해 어떤 명령을 사용 하든지 반드시 도달하는 한 중요하지는 않습니다.

기본적으로 두 가지 답변 ...

옵션 A : 사용자의 로그 아웃을 유발하는 로그인 따라서 이는 사용자가 소유하고 uid로 추적 할 수 있으며 실행중인 특정 Linux 배포판에 대한 일부 로그인 프로세스의 일부로 분류 된 프로세스를 식별하는 것을 의미합니다. "로그인"전에 SSH 또는 VNC와 같은 상위 프로세스가 있고 "로그인"후 GDM과 같은 하위 프로세스가 있다는 것을 인식하십시오. 일반적으로 상위 프로세스를 종료하면 하위 프로세스가 종료되지만 항상 그런 것은 아닙니다. 따라서 로그 아웃 후에 더 이상 필요하지 않은 다른 프로세스를 종료하려고합니다. 이 모든 작업을 수행하면 백그라운드 작업이 계속 실행됩니다. 양성 사용자이므로 로그 아웃하고 싶을 수도 있습니다. 마찬가지로 지금까지 내가 알고,로 /usr/bin/w/usr/bin/who과정에서 로그를 통과 한 사람보고합니다.

옵션 B : 특정 uid가 소유 한 모든 프로세스를 완전히 종료합니다. 이는 단순히 해당 사용자가 소유 한 모든 프로세스를 종료하는 것을 의미합니다. 이는 로그인 한 경우에도 로그 아웃됩니다. 이는 시스템 에서 시작되는 것을 만족시킵니다 . 그것은 간단해야하며 ps -ef | grep <uid>허용 가능한 모든 방식으로 모든 프로세스를 종료해야합니다.

SLES 11에서보고

man skill ...이 도구는 아마도 쓸모없고 이식 할 수 없습니다. 명령 구문이 잘못 정의되었습니다. killall, pkill 및 pgrep 명령을 대신 사용하십시오.

kill -9 FTW!


-1

내 의견으로는 killall -u username, 당신과 같은 사용자라면, 당신은 자신을 시작 하기 때문에 사용하는 것이 실제로 유용하지 않습니다 . 따라서 kill프로세스가 더 나은 솔루션이 될 것입니다.


또한 해당 사용자가 실행 한 프로세스, 아마도 SSHD가 서버에 들어오지 않으면 SSH가 종료됩니다.
Mailo

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.