2010-08-11 27 views
6

Tôi đang chạy ứng dụng khách/máy chủ trên Red Hat Enterprise bằng ZMQ để truyền thông điệp. Ổ cắm IPC được sử dụng để kết hợp một máy khách với máy chủ được thực hiện bằng cách sử dụng một ổ cắm miền Unix.Ổ cắm miền UNIX không thể truy cập được trên người dùng?

Nếu người dùng A bắt đầu quá trình máy chủ, có vẻ như chỉ những khách hàng mới bắt đầu bởi người dùng A có thể kết nối và giao tiếp trên ổ cắm đó. Dự án của chúng tôi yêu cầu khách hàng có thể được điều hành bởi những người dùng khác nhau, vì vậy đây là điểm gắn bó chính.

Ổ cắm được đặt tại/tmp/ipc_assoc với quyền mặc định là 755. chmod 777 không khắc phục được sự cố. chown userB cho phép người dùng B truy cập vào socket, nhưng người dùng A sẽ mất quyền truy cập. Ngay cả root cũng không thể truy cập socket. Không có ACL hoặc SeLinux được sử dụng trên máy.

Đây có phải là hành vi điển hình cho các ổ cắm miền Unix không? Có ai tìm ra cách làm việc xung quanh nó không?

Trả lời

1

Với một số trợ giúp từ danh sách gửi thư ZMQ, tôi đã thực hiện một công việc xung quanh. Đó là xấu xí, nhưng dường như làm việc một cách nhất quán.

Tôi phải tạo thư mục phụ trong/tmp và chmod 777. Máy chủ hiện tạo ổ cắm trong thư mục mới đó. Nó cũng có lập trình chmod 777 ổ cắm. Bây giờ, miễn là máy chủ được chạy dưới dạng root, bất kỳ người dùng nào cũng có thể chạy một ứng dụng khách và nói chuyện với máy chủ.

Tôi không biết tại sao ổ cắm miền UNIX hoạt động theo cách này, nhưng nó chắc chắn là gây phiền nhiễu.

+0

tại sao 777 hoạt động trong khi 770 không hoạt động? Tôi đang bối rối, tôi đã đặt cả hai người dùng dưới cùng một nhóm và không đi ... – knocte

0

Bạn đã thử thêm UserA và UserB vào một nhóm người dùng chung chưa?

+0

Mọi người có vẻ ở cùng một nhóm rồi. –

+0

Có phải là liên kết tượng trưng đến tệp khác có các quyền khác nhau không? –

+0

Không, nếu bạn chạy 'ls -l' trên ổ cắm, nó sẽ in ra" srwxr-xr-x ... ipc_assoc " –

4

chmod (s.sun_path, 0777); sau khi nghe ổ cắm.

domain = AF_UNIX; 
name = servname; 
port = -1; 

n = MakeLocalSocket(s); 
if (n == 0) { 
    fatal("can't create socket"); 
} 

unlink(s.sun_path); 

if (bind(fd, & s, n) < 0) { 
    fatal("can't bind socket"); 
} 

if (listen(fd, 5) != 0) { 
    fatal("can't listen to socket"); 
} 

/* UNIX domain sockets need to be mode 777 on 4.3 */ 
chmod(s.sun_path, 0777); 
+0

tại sao 777 làm việc trong khi 770 không? Tôi bối rối, tôi đã đặt cả hai người dùng trong cùng một nhóm và không đi ... – knocte

+0

Không chắc chắn. Tuy nhiên, theo http://man7.org/linux/man-pages/man7/unix.7.html "POSIX không đưa ra bất kỳ tuyên bố nào về ảnh hưởng của các quyền trên tệp socket và trên một số hệ thống (ví dụ: BSD cũ hơn), các quyền của socket bị bỏ qua. Các chương trình di động không nên dựa vào tính năng này để bảo mật. " – Homer6

+0

thực sự, tôi đã giải quyết được vấn đề: người dùng mà tôi đã thêm vào nhóm phải đăng nhập lại để thay đổi đó có hiệu lực! nhưng cảm ơn nhận xét của bạn – knocte

2

Tạm thời thay đổi umask:

mode_t umask_ = umask(0000); /* let the socket be mode 0777 so that other users can connect */ 
int err = bind(fd, (struct sockaddr *)&unix_bind_addr, sizeof(unix_bind_addr)); 
umask(umask_); /* restore old umask (0777 is a pretty bad choice for normal stuff) */ 
if (err) { 
    /* handle bind error here */ 
} 

Tất nhiên, đây là một ý tưởng tồi nếu bạn đang sử dụng chủ đề.

Các vấn đề liên quan