2009-05-29 3 views
4

私はサブプロセスを生成するデーモンプロセスを持っています。場合によっては、これらのサブプロセスはデーモンに通信し直す必要があります。これらのサブプロセスだけがデーモンとの通信を許可されていることを確認したい。デーモンを保護するには、/ dev/urandomでシークレットトークンを生成するのが良いでしょうか?

私は次のようにこれを実装する:起動時に

  • を、デーモンはは/ dev/urandomのを読み込むことで、ランダムな128バイトの秘密のトークンを生成します。/dev/randomは、読者を任意の時間ブロックする可能性があるため、あまり良くありません。
  • デーモンはUnixドメインソケットをリッスンします。
  • デーモンは、シークレットトークンとソケットのファイル名を環境変数に入れます。それが生成するすべてのサブプロセスは、ファイル名とシークレットトークンを使用してデーモンに接続できます。
  • シークレットトークンが正しい場合を除いて、デーモンは接続を拒否します。

質問:

  • Iでは、/ dev /ランダムでは、/ dev/urandomがより高いエントロピーを持っていることを知っています。しかし、/ dev/urandomは十分ですか?そうでない場合、私は何を使うべきですか?
  • トークンのサイズは十分ですか?
  • トークンが格納されているメモリをロックする必要がありますか?デーモンは起動するたびに別のトークンを生成するので、必要ではないと思うので、攻撃者がハードドライブを盗んでスワップファイルからトークンを抽出すると、それはすでに役に立たないはずです。
  • シャットダウン時にトークンが格納されているメモリを無効にする必要がありますか?
  • 他に何をすべきですか?

さまざまな要件のため、私はデーモンとサブプロセス間の通信を許可するために匿名パイプを使用できません。

+0

あなたはどんな攻撃を恐れていますか? 「十分に良い」とは、その質問に対する答えに依存します。サイズは、ブルートフォース攻撃を防ぐのに十分な大きさのIMOです。 –

+0

デーモンは一種のメモリ内データベースを保持します。私はサブプロセスがこのメモリ内のデータベースを表示して操作できるようにしたいだけです。 – Hongli

+0

しかし、/ dev/urandomは、ブルートフォース攻撃がトークンを取得する唯一の方法であることを十分に保証したエントロピーのソースですか?攻撃者はローカルで非ルートアクセスを持つかもしれません。 – Hongli

答えて

1

はい、/ dev/urandomが提供するセキュリティは十分です。ソフトウェアの多くは、ランダム性(SSL、認証など)のためにそれを使用しています。/dev/randomは、証明書の秘密鍵など、何年も安全でなければならない何らかの種類のトークンを生成するときに唯一良い考えです。

誰かが同じUIDを持っている場合、プロセスのメモリを見る能力について述べました。カーネルをsetuidプロセスと見なすことで回避することができます。つまり、マスタープロセスがrootとして実行されている場合は、fork()、exec()、setuid()を非特権ユーザーに実行できます。同じUIDを持つ他のプロセスは、そのプロセスのメモリを見ることができません。

資格情報の検索方法は、ソケットペアだけでなく、名前付きUNIXソケットでも機能します。

2

トークンを環境変数に入れる場合、それらのプロセスと同じかそれ以上の特権(つまりUID)を持つ人は誰でもトークンを読むことができます!それはちょっと疑問の残りの部分を疑うことになる!同じボックス(ローカルIPCと話したことがある)上のプロセス間のセキュリティが心配されている場合は、トークンを格納するために環境変数を使用しないでください。これらの(EV)を調べるのは簡単です。

+0

同じUIDを持つ限り、外部プロセスはプロセスの環境変数を検査できますか?さて、その場合は、トークンを一時的なパイプに渡してサブプロセスのメモリに格納することができます。 – Hongli

+1

もちろん、十分な権限があれば、他のプロセスのメモリも調べることができます。私は、あいまいさによるセキュリティーがロードブロッキングではなく、スピードバンプであることに気づくでしょう。この100%を保護する方法はありませんが、もっと難しくすることができます。 –

+1

攻撃者が環境変数やメモリを調べるのに十分な権限を持っている場合は、すでに失われています。 –

1

もしあなたがforkしている(ただしexec()ではない)ならば、それらをローカルメモリに保存するだけで十分です。もしあなたがexec()もしているなら、(あなたがJimに対するあなたのコメントで述べたように)パイプ上にトークン(そしてドメインソケットパス)を渡さなければならないでしょう。

これをヘッドレスサーバーで実行している場合、/ dev/randomは少し飢えている可能性があります。したがって、適切なノイズ源がない限り、/ dev/urandomを使用する方が良いでしょう/ dev /とのフィード。

3

最も簡単な方法は、各サブプロセスのサーバーにpipe/socketpairを作成することです。サブプロセスを片端にして、もう一方の端を保持します。そのパイプ/ソケット上にあるものはそのサブプロセスのものでなければなりません。

もう1つのアプローチは、Unixソケットから資格情報(pid、uid、gid)をOSに問い合わせることです。 Linuxではgetsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len)man 7 socket)を使用します。 Solarisはgetpeerucredです。残念ながら、これは移植可能ではありませんが、多くのシステムはUnixソケットに似た機能を持っています。それは複雑ですが、D-Busにはcode that does this on a number of different systemsが含まれています。

+1

彼はパイプを使うことができないと言った。それがsocketpairに及ぶかどうかはわかりません。 +1資格情報。彼らは犬の時代に私の心に入りませんでした。 – Duck

関連する問題