私は(理由のために)CでHTTPサーバーデーモンを作成し、それを管理するためにsystemdユニットファイルを使用しています。
私は20年前の1995年頃に設計されたアプリケーションを書き直しています。彼らが使用するシステムは最初にchroot、それからsetuidと標準的な手順です。
以前の職場では、どのプロセスもルートとして実行しないのが一般的なポリシーでした。これに対してユーザー/グループを作成し、そこで実行します。もちろん、システムはいくつかのタスクをルートとして実行しますが、ルートなしですべてのビジネスロジック処理を実装できます。
HTTPデーモンの場合、アプリケーション内でchrootを実行しない限り、ルートなしで実行できます。もしそうなら、アプリケーションが絶対ルートとして実行されないのは安全ではないでしょうか?
最初からmydaemon-userで実行する方が安全ではないでしょうか? rootで起動してchrootingしてからmydaemon-userでsetuidを起動する代わりに?
ベストアンサー1
他の人があなたのポイントを理解していないようです。もちろん、すでに明確にわかっている変更されたルートを使用したいのではなく、デーモンを制限するために何ができるのかもしれません。デーモンプロセスは、権限のないユーザーアカウントの助けを借りて実行されますが、なぜこれを行うのですか?アプリケーション内部。実際、その理由についてはかなり良い例があります。
httpd
Daniel J. Bernsteinのpublicfileパッケージにあるデーモンのデザインを検討してください。最初に行うことは、ルートをコマンド引数で使用するようにルートディレクトリに変更してから、2つの環境変数に渡された権限のないユーザーIDとグループIDに権限を付与することです。
デーモン管理ツールセットには、ルートディレクトリの変更、権限のないユーザー、およびグループIDの削除などのタスク用の特別なツールがあります。 Gerrit Papeのrunitは次のとおりです。chpst
。私のnoshツールセットにchroot
そしてsetuidgid-fromenv
。ローランベルコのs6はs6-chroot
そしてs6-setuidgid
。ウェインマーシャルのPerpはruntool
そしてrunuid
。など。実際、彼らはすべてM. Bernsteinの独自のdaemontoolsツールセットを持っています。setuidgid
先行して。
httpd
これらの専門ツールから機能を抽出して使用できると考えることもできます。それでは皆さんが想像するように、いいえスーパーユーザー権限で実行するために使用されるサーバープログラムの一部です。
問題は、即時の結果に変更されたルートを設定するためにさらに多くの作業を行う必要があり、これが新しい問題を公開することです。
バーンスタインによるとhttpd
、ただルートツリーのファイルとディレクトリは、世界に公開されるファイルとディレクトリです。持つ他の人はいません。文字通り木にあります。さらに、理由もありません。どの実行可能なプログラムイメージファイルがこのツリーに存在します。
ただし、ルートディレクトリをチェーンローダ(またはsystemd)に変更すると、突然プログラムイメージファイル、ロードされる共有ライブラリ、プログラムhttpd
の初期化中にプログラムローダまたはCランタイムライブラリからアクセスする特別なファイルが表示されます(CまたはC ++でプログラムする場合)。、あなたはとても驚くかもしれません)、/etc
/run
/dev
truss
strace
返品変更のルートに存在する必要があります。それ以外の場合はhttpd
リンクされず、ロード/実行されません。
これはHTTP(S)コンテンツサーバーであることを覚えておいてください。変更されたルートディレクトリにあるすべての(誰でも読みやすい)ファイルを提供できます。これには、共有ライブラリ、プログラムローダ、およびオペレーティングシステムのさまざまなローダ/CRTL設定ファイルのコピーが含まれます。何らかの手段で(偶然に)コンテンツサーバーがアクセスできるという意味である場合書くしたがって、感染したサーバーは、httpd
独自のプログラムイメージまたはシステムのプログラムローダへの書き込みアクセス権を取得することもできます。 (今、安全のために/usr
、、/lib
およびディレクトリ/etc
の2つの並列セットがあることを忘れないでください。)/run
/dev
httpd
これらのどれも、ルートを変更して権限自体を削除するわけではありません。
したがって、監査が容易で、httpd
プログラムの起動時にスーパーユーザー権限で実行される少量の特権コードは、すでに変更されているルートディレクトリのファイルとディレクトリに対する攻撃面を大幅に拡張します。
そのため、サービスプログラムの外ですべてを行うのと同じくらい簡単ではありません。
これはそれ自体がまだ最小限の機能であることに注意してくださいhttpd
。オペレーティングシステムのアカウントデータベースでユーザーIDとグループIDを検索し、その環境変数を最初に入力するなどの操作を実行するすべてのコードはいプログラムの外部では、単純httpd
なスタンドアロンの監査可能なコマンドenvuidgid
(UCSPI ツールなので、関連する TCP ポートをリッスンしたり、コマンド ドメインに属する接続を受け入れるコードは含まれません)。tcpserver
、tcp-socket-listen
、tcp-socket-accept
、s6-tcpserver4-socketbinder
、s6-tcpserver4d
、等。 )
追加読書
- バーンスタイン、ダニエル(1996)。
httpd
。公開文書。 cr.yp.to. httpd
。ソフトウェア統合(Daniel J. Bernstein)。ソフトウェア。ジョナサン・デ・ボーインポラード。 2016.gopherd
。ソフトウェア統合(Daniel J. Bernstein)。ソフトウェア。ジョナサン・デ・ボーインポラード。 2017.- https://unix.stackexchange.com/a/353698/5132
- https://github.com/janmojzis/httpfile/blob/master/droproot.c