私はパスワードマネージャーアプリケーションに取り組んでおり、セキュリティ上の理由から、殺せないプロセスを起動したいと考えています。
また、このプログラムをデーモンにしたくないのは、標準入力から読み取って書き込む必要があるためです。
これを行う方法はありますか?
パスワードマネージャーを別のユーザーで実行し、ターミナル生成信号(SIGINT
、SIGQUIT
、SIGHUP
、SIGTSTP
、SIGTTIN
、およびSIGTTOU
)。
実効IDが0(ルート)でない限り、別のユーザー(実際のuidと保存セットuidの両方が実効uidと異なるユーザー)で実行されている(= kill)プロセスにシグナルを送信できません。
すべてのプロセスは引き続きrootによって強制終了できます。
詳細については、 kill(2) を参照してください。
プロセスを強制不能にする唯一の方法は、プロセスを カーネルスレッド として実装することです。これは簡単なことではありません。
あなたはまだそれを殺すことができますが、それはOSのシャットダウンの副次的な被害でしょう。
プロセスにSIGNAL_UNKILLABLE
フラグを設定するカスタムカーネルモジュールを開発することもできます。このフラグは、無条件のkillから保護されている唯一のユーザーランドプロセスであるinit
(またはsystemd
、カーネルが起動するすべての初期プロセス)に対してのみ設定されるように設計されていますが、このフラグを禁止するものはありません。通常のプロセスに参加する。
技術的には、プロセスを強制不可能にする方法はありません。
もちろん、非rootユーザーの場合、ユーザーが実行できるのは同じユーザーIDを持つプロセスのみです。そのため、異なるアカウントを作成できる場合は、プロセスに「一意の」ユーザーIDを使用でき、rootだけがプロセスを終了できます。
単純ですが堅牢性に欠ける解決策は、プロセスにできるだけ多くの信号をキャッチさせることです(おそらくそれらを無視します)。 KILLシグナル(シグナル9)をキャッチする方法がないため、これはおもちゃの例または非敵対的な環境にのみ適していますが、それ以外の場合は、キルされないようにすることができます。
最後に、強制終了された場合にプロセスを再生成するように手配できます。これも壊れやすい(非常に壊れやすい)ものの、消去が少し難しくなります。これは、独自の監視プロセスを使用するか、inittabを使用して実行できます。彼らが何をしているかを知っている敵にとって、これは一度に複数のプロセスを殺すことによって簡単に回避することができます。