2009-08-03 36 views
5

Có cách nào để thay đổi UID/GID chỉ của một luồng trong một quy trình đa luồng không?Chỉ thay đổi UID/GID của một chuỗi trong Linux

Lý do cho việc này là viết ứng dụng phân phát tệp - ACL và hạn ngạch không được thực thi trừ khi uid/gid của người gọi được đặt thành đúng người dùng, tệp/thư mục mới không được tạo đúng uid/gid vv.

Các ứng dụng mạng thường có thể tự ngã ba() ở đầu và xử lý từng yêu cầu của người dùng trong quá trình riêng biệt. Nếu có nhu cầu chia sẻ dữ liệu, nó phải trải qua một số loại bộ nhớ dùng chung. Tuy nhiên, ví dụ: FUSE (hệ thống tập tin người dùng Linux) theo mặc định sử dụng đa luồng và kết hợp với các ràng buộc python nó sẽ không thực tế để cố gắng sử dụng một mô hình giả mạo.

UID 'nhất quán' cho toàn bộ quy trình có vẻ tuân theo tiêu chuẩn POSIX, tuy nhiên các Linux cũ không tuân theo POSIX và cho phép các giá trị khác nhau cho các luồng khác nhau. Các hạt nhân mới dường như theo POSIX, có cách nào để cho phép hành vi 'vỡ' cũ không?

Trả lời

5

Bạn đã kiểm tra xem setfsuid()/setfsgid() có phải là mỗi luồng hoặc theo mỗi quá trình không? Chúng được thiết kế đặc biệt cho trường hợp sử dụng này (máy chủ tệp).

+0

Điều này tốt hơn - tôi đã kiểm tra và ngạc nhiên phát hiện ra rằng chúng thực sự là một chủ đề. Điều này có lẽ sẽ là cách ưa thích. Tuy nhiên - lý do tôi không kiểm tra, hạn ngạch() và truy cập() không hoạt động. Những thứ khác làm việc - vì vậy đây có thể là lỗi của Linux. – ondra

+0

Có, điều đó nghe có vẻ giống như một lỗi, vì các ý kiến ​​trong mã hạt nhân cho sys_setfsuid() đề cập cụ thể truy cập() ... – caf

+0

@Ondrej, vui lòng gửi mã (hoặc liên kết đến nó), chứng minh rằng 'fsuid' là , không giống như các cấu trúc UID/GID khác, mỗi luồng và không phải cho mỗi quá trình. Cũng vui lòng chỉ định phiên bản hạt nhân và glibc của bạn, cũng như việc triển khai luồng của bạn (NPTL, LinuxThreads, OndrejThreads, v.v.). – pilcrow

5

Để thay đổi chỉ uid cho một chuỗi bạn cần sử dụng syscall trực tiếp: syscall (SYS_setresuid, ...); Hàm libc setresuid() sẽ đồng bộ hóa nó cho tất cả các luồng (sử dụng một chuỗi mà nó gửi tới tất cả các luồng)!

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