2016-06-29 6 views
0

特定のグループに限定されたUnixドメインソケットを作成したいと思います。 chownが、その後グループを設定する唯一の方法であると思われるので、ソケットhas no effectにしかしUnixドメインソケットのグループ所有権を安全に設定する方法は?

// Set the "address" (ie filesystem path) 
struct sockaddr_un addr; 
memset(&addr, 0, sizeof(addr)); 
addr.sun_family = AF_UNIX; 
strcpy(addr.sun_path, "./my.sock"); 

int fd = socket(AF_UNIX, SOCK_DGRAM, 0); // create the socket 

// Set the group owner and permissions 
fchmod(fd, 0770); // This seems to succeed 
fchown(fd, -1, wanted_group_id); // Silently fails 

// Create the filesystem entry 
bind(fd, (struct sockaddr *)&addr, sizeof(addr)); 

fchown:だから私は、理想的にやるだろうがあるようなもの(エラーチェックを無視して)。私は、ソケットにアクセスすることを許されるべきでないプロセスにソケットを一時的にアクセスさせないようにしたい。

私が持っている最高のアイデアは、次のとおりです。

int fd = socket(...); 
fchmod(fd, 0700); // Remove group permissions 
bind(fd, ...);  // Create fs entry 
chown("./my.sock", -1, wanted_group_id); // set the correct group owner 
fchmod(fd, 0770); // And restore group permissions 

は確かにこれはUnixソケットをやりたいための一般的なもので、これを達成するための標準的な方法がありますが、私は明確な答えを発見していません。

私は本当にLinuxに興味がありますが、POSIXだけに依存している点については特典があります。

+0

最初に目的のグループで作成されるように、プログラムがソケットのSet-GIDを目的のグループに作成するようにすることができます。 –

+0

私はそれが役立つとは思わない。私のプログラムはすでにそのグループを利用可能にしており、異なるグループの複数のソケットを作成したいと思うでしょう。 –

+0

同様の考え方:少なくともlinuxでは、あなたのプログラムに 'CAP_SETGID'機能を与えて、一時的に望むどんなグループIDでも使えます。 –

答えて

0

これを行う方法は、正しいアクセス許可を持つディレクトリにソケットを置くことです。ディレクトリは、アトミックに作成(または名前を変更)することができます。ディレクトリが存在すると、ソケット自体に対するアクセス権はあまり重要ではありません。これは、ソケット自体のパーミッションが必ずしも受け入れられないUnixでも動作します。

関連する問題