すべての 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
)で使用されるため、システム全体で無効にします。
無効にすることができますログインシェル用(およびそのサブシェル)alias
true
たとえば、 / 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
}