root以外のユーザーのためのUnixドメインソケット

root以外のユーザーのためのUnixドメインソケット

IPC用のUnixドメインソケットを使用するアプリケーションを開発しています。私が知っている限り、一般的な方法はソケットファイルをその中に置くことです/var/run。私はUbuntu 18.04を使用していますが、このフォルダは残念ながらvar/run次からのみアクセスできます。/runroot

  ls -Al /
  drwxr-xr-x  27 root root        800 Apr 12 17:39 run

したがって、ルートのみフォルダへの書き込みアクセス権があるため、通常のユーザーはUnixドメインソケットを使用できません。

まず、なぜ理解できないのですか? root以外のユーザーにUnixドメインソケットを使用する方法は?確かにホームフォルダを使用できますが、いくつかの正確で一般的な方法を使用することをお勧めします。

ベストアンサー1

ユーザーが特別なシステムユーザーでない場合は、ユーザーのホームディレクトリのdotfileまたはdotdirにソケットを作成することに問題はありません。唯一の問題は、nfsを介して複数のシステム間でホームディレクトリを共有することですが、ソケット名にホスト名を含めることで簡単に解決できます。


Linux/Ubuntu では、以下を使用することもできます。「抽象的」Unixドメインソケットはファイルシステムのパスやinodeを使用しません。抽象Unixソケットは、アドレス/パスがNULバイトで始まるソケットです。

抽象的なsun_path[0]:抽象ソケットアドレスはヌルバイト()という点でパス名ソケットとは異なります\0

sun_pathこの名前空間にあるソケットのアドレスは、アドレス構造の指定された長さだけ上書きされた追加バイトとして提供されます。 (名前のヌルバイトには特別な意味はありません。) 名前はファイルシステムパス名とは関係ありません。抽象ソケットのアドレスを返すとき、返される値は2addrlen より大きくsizeof(sa_family_t)(つまり2より大きい)、ソケット名は最初のバイト (addrlen - sizeof(sa_family_t))に含まれますsun_path

@抽象UnixソケットアドレスのNULバイトは、ユーザーに表示されるか、ユーザーが入力したときに通常sに置き換えられます。多くのプログラムは、@何らかの方法で正規表現から外れないか、最初のバイトだけがNULになる可能性があると仮定するため、深刻な間違いを犯します。

通常のUnixソケットパスとは異なり、抽象Unixソケット名は誰でもバインドでき(名前がまだ使用されていない場合)、誰もが接続できるという点で異なる意味を持ちます。

ソケットに接続できる人を制限するためにファイル/ディレクトリ権限に依存するのではなく、たとえば次のようにします。ルートのみディレクトリにソケットを作成できます。ピアの資格情報getsockopt(SO_PEERCRED)(接続またはバインドするピアのuid / pidを取得するため)またはSCM_CREDENTIALSセカンダリメッセージ(メッセージを送信するピアのuid / pidを取得するため)を確認する必要があります。を通して) 人uid/pid)ソケット)。

これは(一般的なファイル権限チェックを置き換える)またSO_PEERCRED/ IMHOSCM_CREDENTIALSの唯一の合理的な使用です。

おすすめ記事