
IPC用のUnixドメインソケットを使用するアプリケーションを開発しています。私が知っている限り、一般的な方法はソケットファイルをその中に置くことです/var/run
。私はUbuntu 18.04を使用していますが、このフォルダは残念ながらvar/run
次からのみアクセスできます。/run
root
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
の唯一の合理的な使用です。
答え2
Unixドメインソケットに直接アクセスしないでください。/run
その中にフォルダを作成する必要があります。/run
たとえば、/run/my-ipc
ユーザーに適切な権限を与え、そのフォルダに書き込みます。
このフォルダは起動時に再作成する必要があります。受け入れられた回答この問題いくつかの選択肢が説明される。