Linux에서 'kill' 명령을 비활성화하는 방법

Linux에서 'kill' 명령을 비활성화하는 방법

모든 kill 명령(루트 사용자 포함)을 비활성화하고 싶습니다. 권한을 변경하려고 시도했지만 여전히 실행될 수 있습니다. 그렇게 할 수 있는 방법이 있나요?

답변1

kill에 대한 "비활성화" root는 가능하더라도 시스템 스크립트 오작동과 같은 원치 않는 부작용이 발생할 가능성이 높으며 최악의(그러나 그럴 가능성이 있는) 시나리오에서는 컴퓨터가 제대로 시작되지 않을 수도 있습니다.폐쇄 중제대로).

사용자에게도 문제가 발생할 수 있습니다. 예를 들어, 권한 없는 사용자로 실행하여 특정 프로세스가 kill -0 $pid. 해당 스크립트는 작동이 중지됩니다.

자신을 위해 다음과 같은 다른 명령을 alias내릴 수 있습니다 .killecho "kill"

$ alias kill='echo "kill"'

그러면 kill최소한 명령줄에서 유용한 작업을 수행할 수 없게 됩니다.

$ kill -s HUP $$
kill -s HUP 11985

답변2

kill에서 시스템 호출을 비활성화하려면 이 커널 모듈을 사용하십시오 amd64.
자신의 책임하에 사용하십시오. 치명적인 부작용이 예상됩니다.

#include <linux/module.h>

MODULE_LICENSE("GPL");

int __init init(void) __attribute__((noreturn))
{
     unsigned long long cr0 = read_cr0();
     write_cr0(cr0 & ~(1 << 16));  /* Clear Write Protection (WP) bit */
     *(unsigned char *)sys_kill = 0xc3;  /* opcode for "ret" */
     write_cr0(cr0);

     /* This makes sure that delete_module below won't complain */
     __this_module.refcnt = 1;
     __this_module.state = MODULE_STATE_LIVE;

     asm volatile
     (
          "mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
          "jmp sys_delete_module\n\t"  /* call delete_module(name, flags) */
          :: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
     );
}

void __exit exit(void)
{
    return;
}

다른 모듈과 마찬가지로 컴파일하십시오. 그런 다음 사용 insmod하십시오.

답변3

해서는 안 된다/etc/init.d/functions시스템 스크립트(예: 패키지 ) 에서 사용되기 때문에 시스템 전체에서 비활성화합니다 initscripts.

비활성화할 수 있습니다.로그인 쉘의 경우(및 해당 하위 쉘)alias' 라고 말하고 있습니다 true/ false(또는 kill_disabled작동하지 않는 것보다 오류를 얻고 싶은 경우와 같은 것).

이 방법은 완벽하지는 않습니다. 직접 실행된 명령에만 영향을 미칩니다(스크립트 내부 명령에는 적용되지 않음). 그리고 사용자는 를 사용하여 별칭을 제거할 수 있습니다 unalias.


이렇게 하려면 다음 명령을 실행하세요.

alias kill=kill_disabled

아니면 적당한 곳에 추가하세요bash시작 파일로그인할 때마다 실행합니다.

이제 kill대화형으로 실행하면 다음이 생성됩니다.

$ kill 9999
-bash: kill_disabled: command not found

내가 말했듯이 위의 방법은 쉽게 전복됩니다. 확실한 방법이 필요한 경우 유일한 해결책은 전체 로그인 셸 세션을 다음과 같이 실행하는 것입니다.chroot환경. 여전히 비활성화됩니다.재고 명령,직접적인 syscall은 아니지만 완료되었습니다. 후자는 정상적인 작동에 필수적이기 때문에 비활성화할 수 없습니다(예: 모든 Ctrl+ Csend SIGINT, Pipe require SIGPIPE및 백그라운드 프로세스는 5개 이상의 서로 다른 신호로 제어됨). chroot 환경 설정은 고급 작업이며 사용자가 전체 파일 시스템에 액세스해야 하는 경우 일반적으로 불편합니다.

답변4

사용자가 특정 프로그램을 종료하려는 경우를 제외하고는 정상적으로 사용할 수 있도록 하려면 사용자 프로필 의 기능 kill을 정의 하고 이 기능 내에서 사용자가 프로그램을 종료하려고 하는지 확인하면 됩니다. 그렇지 않은 경우 함수 자체 내에서 유틸리티를 호출할 수 있습니다.kill.bashrckill

예를 들어, sleep유틸리티를 종료하지는 않지만 제공된 다른 매개변수에 대해 일반 종료 유틸리티로 작동하는 작은 종료 함수를 작성했습니다.

function kill() {
    process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
    if [[ $process == "sleep"]]
    then
        echo "Killing $process is not allowed"
    else
        /bin/kill $@
    fi
}

관련 정보