パスワードマネージャアプリケーションを開発していますが、セキュリティ上の理由で終了できないプロセスを開始したいと思います。
さらに、私はこのプログラムがデーモンになることを望んでいません。なぜなら、stdinで読み書きする必要があるからです。
これを行う方法はありますか?
答え1
パスワードマネージャを別のユーザーとして実行し、端末(SIGINT
、、、、SIGQUIT
および)で生成された信号を処理/無視/ブロックします。SIGHUP
SIGTSTP
SIGTTIN
SIGTTOU
有効IDが0(root)でない場合、実際のuidおよび保管セットuidは、有効uidとは異なる他のユーザーとして実行されているプロセスにシグナルを送信することができません(=終了)。
すべてのプロセスはまだルートによって終了できます。
詳細については、次を参照してください。殺す(2)。
答え2
プロセスを終了できないようにする唯一の方法は、次のようにプロセスを実装することです。カーネルスレッド、これは小さな問題ではありません。
それでも殺すことはできますが、これはオペレーティングシステムのシャットダウンによる付随的な損傷になります。
SIGNAL_UNKILLABLE
プロセスのフラグを設定するカスタムカーネルモジュールを開発することもできます。このフラグは、無条件シャットダウンから保護される唯一のユーザーモードプロセスinit
である(またはカーネルによって開始されたすべての初期プロセス)にのみ設定されるように設計されていますが、systemd
このフラグが一般プロセスに表示されることを禁止するものはないようです。
答え3
技術的には、ユーザーはプロセスを終了できないようにすることはできません。
もちろん、root以外のユーザーの場合は、自分と同じユーザーIDを持つプロセスのみを終了できます。他のアカウントを作成できる場合は、そのプロセスに「固有」のユーザーIDを使用でき、rootのみを終了できます。それ。
単純だがより強力な解決策は、プロセスができるだけ多くの信号をキャプチャすることです(おそらく無視できます)。 KILL信号(信号9)を捕捉できないため、これはおもちゃの例や非敵対的な環境でのみ機能しますが、そうでなければそれらによって殺されるのを避けることができます。
最後に、プロセスが終了したときに再生成するようにスケジュールできます。これも壊れやすく、削除するのが難しくなります。これは、自己監視プロセスを使用するか、inittabを使用して実行できます。自分が何をしているのかを知っている攻撃者は、複数のプロセスを一度に終了して回避できます。