Linux で「kill」コマンドを無効にする方法

Linux で「kill」コマンドを無効にする方法

すべての kill コマンド (root ユーザーを含む) を無効にしたいです。権限を変更しようとしましたが、まだ実行できます。それを実行する方法はありますか?

答え1

を「無効にする」killことはroot、たとえ可能であったとしても、システムスクリプトが誤動作するなどの望ましくない副作用を引き起こす可能性が高く、最悪のシナリオでは(しかし、おそらく)コンピュータが正常に起動しなくなる(あるいは、シャットダウンきちんと)。

ユーザーにとっても、問題の原因となります。たとえば、特定のプロセスが を使用して実行されているかどうかを確認するスクリプトを、権限のないユーザーとして実行するとします。kill -0 $pidこれらのスクリプトは動作を停止します。

あなた自身のために、次のようにaliasコマンドkillを他のものに変更することもできますecho "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)で使用されるため、システム全体で無効にします。

無効にすることができますログインシェル用(およびそのサブシェル)aliastrueたとえば、 / false(または、kill_disabled何も実行せずにエラーを取得したい場合など)に置き換えます。

この方法は絶対確実ではないことに注意してください。直接実行されるコマンドにのみ影響します (スクリプト内のコマンドには影響しません)。また、ユーザーは でエイリアスを削除できますunalias


これを行うには、次のコマンドを実行します。

alias kill=kill_disabled

または適切なbash起動ファイルログインするたびに実行します。

ここで、kill対話的に実行すると、次の結果が生成されます。

$ kill 9999
-bash: kill_disabled: command not found

前述したように、上記の方法は簡単に破られます。確実な方法が必要な場合は、ログインシェルセッション全体をchroot環境。それでも、在庫コマンド、直接のシステムコールではありませんが、実行されます。後者は、通常の操作に不可欠であるため無効にすることはできません (たとえば、すべてのCtrl+Cは を送信しSIGINT、パイプは を必要としSIGPIPE、バックグラウンド プロセスは 5 つ以上の異なるシグナルで制御されます)。chroot 環境の設定は高度なタスクであり、ユーザーがファイルシステム全体にアクセスする必要がある場合は一般的に不便です。

答え4

killユーザーが特定のプログラムを強制終了しようとする場合を除いて通常どおり使用できるようにしたい場合は、ユーザー プロファイルkillの に関数を定義し、この関数内でユーザーがプログラムを強制終了しようとしているかどうかを確認します。そうでない場合は、関数自体からユーティリティ.bashrcを呼び出すことができます。kill

例として、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
}

関連情報