2012-03-02 10 views
4

Windowsでは、ユーザーコンテキストで実行されているクライアントがソケットやパイプを使用して接続するサービスを持つことができます。接続しているユーザーを偽装して例えば、ユーザーだけがアクセスできるファイルにアクセスする(または、他のファイルにアクセスしていないことを確認する)ことができます。Mac OS Xでユーザーを偽装する

Mac OS Xでこれを達成するのと同等の方法は何ですか(Linuxも面白いですか)。私はset * uid関数が何らかの方法でこれに使用されると仮定します。

しかし、偽装するユーザーを認証して、ユーザーがソケットに接続しているときにuidを設定するにはどうすればよいですか?

また、set * uid関数はプロセス全体に影響するように見え、マルチスレッドデーモンでの使用は困難です。 Mac OS X/Linux上でこのタイプのサービスに共通に使用されるデザインパターンがありますか?

編集: pmjordanの答えセット* uidのプロセスごとの専用の問題の世話をするようだ、と疑問How can I pass user credentials through a Unix-domain socket on Mac OS X?は、UNIXドメインソケットの代わりにプレーンなソケットを使用して、実際の認証の問題の世話をするようです。

答えて

2

OS Xの仕様について:Mac OS Xの場合Authentication, Authorization, and Permissions Guideを見ましたか?

一般に、UNIXのようなオペレーティングシステムでは、プロセスは通常、特定の1人のユーザーによって所有されており、実行が許可されるのは主にこれによって決まります。これにはいくつかの例外がありますが、一般的に、このアイデアはプロセスごとの粒度で行う傾向があります。プラス面では、新しいプロセスを開始するのは簡単です - the fork() functionを参照してください。

そこで、異なるユーザを偽装するデーモン(例えば、sshdの)のための典型的な方法は、ルートとしてメインプロセスを実行することです。次に、着信接続を受け入れて、子プロセスをfork() edに渡します。子プロセスは、set * uidを使用してすぐに権限を削除します。子プロセスが親プロセスと通信する必要がある場合は、パイプなどのさまざまなプロセス間通信チャネルが設定できます。明らかに、コードが少ないほどセキュリティの観点からはrootとして実行されるので、子プロセスが自律的であることを目指したいと思うでしょう。

ユーザーが実際にユーザー名とパスワードを提供する必要がある場合は、もう少し複雑になります。 susudoユーティリティのソースコードを見て、認証APIのプラットフォーム固有のドキュメントを参照してください。

+0

デーモンから特定のユーザーとして実行中のサブプロセスを作成することは、やり方のようです。しかし、どのUIDを使用するのかはどのようにわかりますか?私は別のやり方でやるべきことをしようとしているかもしれません - 私は、デーモンに、呼び出し元のユーザーがアクセスできるファイルにアクセスしていることを確認したいと思っています。私として実行するのに十分な特権で動作しているものと通信します。たぶん、これを行う別の方法がありますか? – villintehaspam

+0

あなたが何を意味するのかよく分かりません。 "デーモンは、呼び出し元のユーザーがアクセスできるファイルにアクセスしていることを確認する必要があります" - 子プロセスが問題のユーザーとして実行されている場合は、そのユーザーの権限しか持たない*あなたが閉じることができる 'fork()'中にハンドルをオープンします。それとも、他に何かを求めていますか? – pmdj

+0

"私は、ユーザアプリケーションが、私として実行するのに十分な特権を持って動作しているものと通信していることを、ユーザアプリケーションが知ることができるようにしたい。 - 私はあなたがこの部分で何を求めているのか全く理解していないのが残念です。あなたのプログラムが実際にやるべきことの大まかなアイデアや例を与えるのに役立つと思います。 – pmdj

1

いくつかのケースではTechnical Note TN2083 - Apple Developer

から、少なくとも限り許可はカーネルのBSDサブシステムによって行わ確認など、ユーザーを偽装すると便利です。シングルスレッドデーモンは、seteuidとsetegidを使用してこれを行うことができます。これらは、プロセス全体の実効ユーザーIDとグループIDを設定します。これにより、デーモンが複数のスレッドを使用して異なるユーザーからの要求を処理している場合に問題が発生します。その場合、pthread_setugid_npを使ってスレッドの実効ユーザーIDとグループIDを設定できます。これはMac OS X 10.4で導入されました。