開始するために構成ファイルからいくつかのシークレットにアクセスする必要があるサービスを考えると、3つのアプローチが想像できます。
1)rootだけがファイルを読み取れるようにします。 rootとしてプロセスを開始し、構成を読み取って特権をドロップします。
2)デーモンユーザーのみがファイルを読み取れるようにし、デーモンユーザーとしてプロセスを開始します。
3)rootだけがファイルを読み取れるようにします。 CAP_DAC_READ_SEARCH機能を持つデーモンユーザーとしてプロセスを開始し、構成を読み取った後にそれを削除します。
選択肢の私の最初の分析:
+脆弱性がある場合、攻撃者は機密データを取得するために自身のプロセスメモリを読み取る必要があります(かなり難しいですか?)
-setuid/setgidが必要なため、より複雑
-特権を落とす前にソフトウェアが侵害された場合、rootとして実行されます
+プログラムが簡単になり、initスクリプトから特権を削除
-脆弱性がある場合、攻撃者はディスクから機密データを読み取ることができます(簡単)
+プロセスへの完全なrootアクセスを決して与えない
+バグがある場合、攻撃者はファイルではなくプロセスメモリを読み取る必要があります
-たくさんの複合施設
-設定ファイル以外のファイル(/etc/shadow
など)への非常に広範なアクセスを引き続き提供します
考慮すべき他のオプション、または私が見逃した長所または短所はありますか? initプロセスにそれを処理させるのではなく、自分自身で特権の削除を処理する理由はありますか?
起動時であっても、必要のないデーモン特権を与えることは避けてください。これはオプション1と3を除外します。ただし、オプション2を選択する必要があるわけではありません。
最初に、念のため、基本を思い出してみましょう。
デーモンが起動後に機密の構成ファイルを読み取らないようにすることの大きな利点があるかどうかは、デーモンが機密データを何のために使用するか、およびそれ以外に何をするかによって異なります。これらが起動時にデーモンが1回だけ使用し、メモリから消去する資格情報である場合、後で再び読み取ることができないようにすることには利点があります。機密データがメモリに残っている場合、それほど大きなメリットはありませんが、メモリの開示を許可するが、任意のコードの実行を許可しないエクスプロイト(たとえば、初期化されていないメモリや不正なポインタ)は、通常、任意の許可を可能にしますコードの実行)、またはファイルの公開を可能にするが、任意のコードの実行をドットにするエクスプロイト(たとえば、不正なパスのサニタイズ)。
起動後にデーモンが機密ファイルを読み取れないようにする保護が有益であると判断した場合は、initシステムに特権の削除を管理させます。スーパーバイザプロセスから構成ファイルを開き、関連する特権(おそらく補助グループ)を削除し、ファイル記述子をプロセスに渡します(--sensitive-config-fd=3
または--sensitive-config-file=/dev/fd/3
)。