UNIX ドメインソケット権限と root ユーザーと root 以外のユーザーの間の umask の統合

UNIX ドメインソケット権限と root ユーザーと root 以外のユーザーの間の umask の統合

Unixドメインソケットに対する権限を理解しようとしていますが、既存のファイルを使用するときは、dir権限だけでなくumaskも変更する必要があります。

rootで誰でも読みやすいディレクトリを作成し、netcatを使用してソケットを開く場合:

root$: mkdir /tmp/mydir
root$: chmod 777 /tmp/mydir
root$: nc -l -U /tmp/mydir/sock

その後、root以外のユーザーが上記のソケットに接続しようとすると、ディレクトリが誰でも読むことができますが、失敗します。

https://man7.org/linux/man-pages/man7/unix.7.html

Linuxの実装では、パス名ソケットは自分がいるディレクトリの権限を尊重します。プロセスにソケットが作成されたディレクトリに対する書き込みおよび検索(実行)権限がない場合、新しいソケットの作成は失敗します。

root$: runuser -u user1 -- nc -U /tmp/mydir/sock 
nc: unix connect failed: Permission denied

今、umask 0同じソケットをもう一度実行して再起動すると、できるroot以外のユーザーから接続します。

root$: umask 0
root$: nc -l -U /tmp/mydir/sock
root$: runuser -u user1 -- nc -U /tmp/mydir/sock 
ping 

また、/tmp/mydir権限を変更すると、chmod 600root以外のユーザーがソケットに再びアクセスするのを防ぐことができます。

root$: chmod 600 /tmp/mydir
root$: runuser -u user1 -- nc -U /tmp/mydir/sock 
nc: unix connect failed: Permission denied

明らかに、マニュアルによると、ディレクトリ権限は期待どおりに機能しますが、親ディレクトリに正しい権限がある場合はumask 0が必要なのはなぜですか? netcatはまだ別のファイルを生成していますか?

ベストアンサー1

君もこれを逃したUnix(7)あなたが引用したマンページ:

Linuxでは、つながるストリームソケットオブジェクト書き込み権限が必要です そのソケットからデータグラムをデータグラムソケットに送信するには、そのソケットへの書き込み権限も必要です。

もちろん、他のファイルと同様に、そのパスのすべての主要ディレクトリに対する検索(実行)権限も必要です。

引用した部分は次のとおりです。作るソケットがある場所ただingが正しいと、bind(2)これが起こります。それがまさにそれですnc -l -U /path/to/sock。繰り返しますが、他のファイルを作成するのと同様に、umaskは作成されたソケットの権限に影響します(umask == 022 =>他のユーザーには書き込み権限がありません=>ソケットに接続できません)。

$ umask
0022
$ nc -Ul sock
^C
$ ls -l sock
srwxr-xr-x 1 xxx xxx 0 Oct 16 18:35 sock
^    ^  ^

Unixドメインソケットにバインドするには、常に最初から新しく作成する必要があります。既存のファイルにバインドできません。これはディスプレイのために失敗しますEADDRINUSE。したがって、ほとんどのプログラム(含むnc)は、同じ名前のファイルにバインドする前にファイルを強制的に削除します。

$ echo text > file
$ strace nc -l -U file
...
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
unlink("file")                          = 0
bind(3, {sa_family=AF_UNIX, sun_path="file"}, 110) = 0
listen(3, 5)                            = 0
accept4(3, 

注:両方のフラグメントは、アクティブなソケットオブジェクトを表すinodeではなく、ディスク上の「ソケット」特殊ファイル/inodeについて説明します(などで見ることができます/proc/<pid>/fd/proc/net/unix

$ nc -lU sock &
[1] 4424
$ ls -li sock
20983212 srwxr-xr-x 1 xxx xxx 0 Oct 17 18:01 sock
^^^^^^^^
$ ls -li /proc/4424/fd
total 0
43825 lrwx------ 1 xxx xxx 64 Oct 17 18:02 0 -> /dev/pts/4
43826 lrwx------ 1 xxx xxx 64 Oct 17 18:02 1 -> /dev/pts/4
43827 lrwx------ 1 xxx xxx 64 Oct 17 18:02 2 -> /dev/pts/4
43828 lrwx------ 1 xxx xxx 64 Oct 17 18:02 3 -> socket:[46378]
                                                        ^^^^^
$ grep 46378 /proc/net/unix
00000000ee8c0faa: 00000002 00000000 00010000 0001 01 46378 sock

おすすめ記事