루트 또는 sudoer가 아닌 다른 사용자로 시작한 프로세스를 종료하는 방법은 무엇입니까?


20

Linux 환경에서 sudoers가 아니거나 root를 사용하지 않고 user1 인 경우 user2가 시작한 프로세스를 종료해야합니다. 프로세스를 시작할 때 설정하는 방법이 있는지 알고 있습니까? 프로세스를 죽일 수있는 사용자 목록과 같은?

사실 동일한 프로세스의 동시 인스턴스를 다른 사용자로부터 시작할 수 있으므로 그룹 ID를 프로세스로 설정하는 것이 편리하지 않습니다. 그룹에 속하지 않은 다른 사용자는 두 번째 병렬 프로세스를 시작할 수 없습니다.

내가 가진 것은 프로세스를 시작하기 전에 데이터베이스에 정의 된 프로세스를 시작할 수있는 사용자 목록입니다. 목록에서 현재 사용자를 확인하고, 그렇다면 현재 사용자로 프로세스를 시작합니다. 두 번째 사용자가 프로세스를 종료하고 싶을 경우 프로세스를 종료하고 싶지만 sudoers가되기를 원하지 않습니다.

따라서 사용자로부터 프로세스 종료 요청을 수신하고 사용자가 프로세스를 시작 / 중지 할 수 있는지 확인하고 프로세스를 종료시키는 루트로 실행중인 프로세스를 작성하려고했습니다.

그것이 최선의 해결책이라고 생각하십니까?


SO에 오신 것을 환영합니다. 나는 이것이 가능하다고 생각하지 않습니다 ... 어쨌든, 이것은 SO의 자매 사이트 인 serverfault.com에 더 적합합니다. 아무 것도 할 필요없이 곧 마이그레이션 될 수 있습니다.
Pekka는 GoFundMonica

우리는 어떤 종류의 프로그램에 대해 이야기하고 있습니까? 일반적인 경우에는 어려울 수 있지만 일부 경우 (예 : 아파치 또는 사용자가 직접 수정할 수있는 앱) 더 쉽습니다.
Kim

답변:


14

미안하지만 이것은 불가능합니다 (디자인에 의한 것입니다). 그러나 공통 그룹의 구성원 인 경우 user1은 user2의 프로세스가 확인하는 파일에 쓸 수있어 프로세스에 종료해야 함을 나타냅니다.

또는 user2는 백그라운드에서 파일을 확인한 다음 적절한 신호를 보내는 무언가를 실행할 수 있습니다. 그런 다음 User1은 해당 파일에 쓰기 만하면됩니다. user2의 프로그램을 수정하지 않아도되므로 더 쉬울 수 있습니다.

일반적으로, user1은 POSIX 신호를 user2의 프로세스로 보낼 수 없습니다.


답변 주셔서 감사합니다. 필자의 경우 실제로 파일을 사용하지 않지만 적절한 신호를 보낼 수 있는 시스템 ( dim.web.cern.ch/dim )을 사용 한 다음 사용자에게 허용되는지 확인하는 프로세스를 호출 할 수 있습니다 프로세스를 중지하고 프로세스를 종료합니다.

@ATelesca-저소득층 사용자가 대규모 팜에서 Xen 가상 머신을 제어 / 시작 / 중지 할 수 있도록 매우 유사한 기능을 사용합니다. 기본적으로 같은 것입니다.
Tim Post

9

ACL이나 SELinux 또는 그 밖의 다른 방법으로 더 나은 방법이 없다면 SetUID 스크립트를 사용하는 것입니다. 아시다시피 보안 위험 요소로 악명이 높습니다.

귀하의 사례와 관련하여 procOwner는 프로세스 소유자의 사용자 이름이고 userA (uid 1000), userB (uid 1201) 및 userC (uid 1450)는 프로세스를 종료 할 수있는 사용자라고 가정하십시오.

killmyproc.bash :

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

그런 다음 소유자와 권한을 다음과 같이 설정하십시오.

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

또한 userA, userB 및 userC를 그룹에 넣습니다 procGroup.


나는 이것을 시도했지만 작동하지 않았다. 비 소유자 사용자는 kill 명령에 대한 권한이 거부되었습니다.
Javid Jamae

1
방금 시스템에 kill 스크립트에 대한 권한을 제어하도록 허용하지 않겠습니까? userA, userB 및 userC로 그룹을 만든 다음 killscript를 해당 그룹으로 가져 와서 g + x로 chmodding하는 것이 나에게 더 깔끔한 것처럼 보입니다.
Leonid Shevtsov

1
쉘 스크립트에서는 setUid 비트가 허용되지 않습니다.이를 실행하려면 간단한 래퍼 컴파일 된 프로그램을 작성해야합니다.
El '

2

일반적으로 사용자가 다른 사람의 프로세스를 가져 와서 죽이게하는 것은 궁극적 인 서비스 거부 취약점입니다.

대상 프로세스가 협력하면 수행 할 수 있습니다. 한 가지 방법은 외부 이벤트 (/ var / tmp에서 생성 된 파일 또는 소켓의 메시지와 같은)를 모니터하여 자체 종료를 지시하는 것입니다. 이를 작성하기 위해 작성할 수없는 경우,이를 시작하고 모니터링을 수행하여 이벤트가 발생하면 하위 프로세스를 종료하는 랩퍼를 작성할 수 있습니다.


1

아냐, 못해

다른 사용자와 프로세스를 공유하려면 공통 사용자 ID로 프로세스를 시작해야합니다.


1

물론 특정 사용자 (목록)로부터 특정 신호 (POSIX 신호가 아닌 "사전 결정된 이벤트"를 의미하기 위해 느슨하게 사용되는 용어)를 수신 할 때 프로그램이 정상적으로 종료되도록 프로그램을 작성할 수 있습니다.


신호에는 "사용자"필드가 없습니다. 그들은 단지 신호일뿐입니다.
LtWorf

그 이유는 "POSIX 신호가 아닌 미리 결정된 이벤트"라고 말했습니다.
drxzcl

1

특정 그룹의 사용자 만 실행할 수 있고 프로세스에 적절한 신호를 보내는 suid 프로그램을 작성할 수 있습니다. 그래도 suid를 제외하려고했는지 확실하지 않습니다.


0

suid bit는 bash 스크립트에서 작동하지 않습니다. imho, 가장 좋은 방법은 래퍼 스크립트 "killservice"를 작성하는 것입니다. 서비스가 사용자 serviceuser로 실행되고 있다고 가정하십시오.

#!/bin/bash
sudo -u serviceuser /usr/bin/killserviceworker

그때

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

그런 다음 비밀번호를 묻지 않고 / usr / bin / killserviceworker를 사용자 serviceuser로 실행할 수 있도록 / etc / sudoers에 규칙을 추가하기 만하면됩니다.

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killserviceworker는 다음과 같습니다.

#!/bin/bash
kill ${cat /run/service.pid}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.