2009-08-03 6 views
5

다중 스레드 프로세스에서 한 스레드의 UID/GID 만 변경하는 방법이 있습니까?Linux에서 하나의 스레드 만 UID/GID 변경

파일 처리 응용 프로그램 작성 이유 - 호출자의 uid/gid가 올바른 사용자로 설정되고 올바른 파일/디렉토리가 올바른 uid/gid로 작성되지 않으면 ACL 및 할당량이 적용되지 않습니다.

네트워크 응용 프로그램은 일반적으로 처음에는 fork() 할 수 있으며 각 사용자 요청은 별도의 프로세스로 처리 할 수 ​​있습니다. 공유 데이터가 필요하다면 어떤 종류의 공유 ​​메모리를 통과해야합니다. 그러나, 예를 들면. FUSE (리눅스 사용자 파일 시스템)는 기본적으로 멀티 쓰레딩을 사용하며, 파이썬 바인딩과 결합하여 포크 모델을 사용하는 것은 실용적이지 않습니다.

전체 프로세스의 '일관된'UID는 POSIX 표준에 따르는 것처럼 보이지만 오래된 Linux는 POSIX를 따르지 않았고 다른 스레드에 대해 다른 uid를 허용했습니다. 새로운 커널은 POSIX를 따르는 것처럼 보입니다. 오래된 '깨진'동작을 허용 할 수있는 방법이 있습니까?

답변

5

setfsuid()/setfsgid()가 스레드 또는 프로세스별로 있는지 확인 했습니까? 이러한 사용 사례 (파일 서버)를 위해 특별히 설계되었습니다.

+0

이 방법이 더 좋습니다. - 제가 확인한 결과 놀랍게도 실제로 스레드 당 발견되었습니다. 이것은 아마도 선호되는 방법 일 것입니다. 그러나 내가 테스트하지 않은 이유는 quota()와 access()가 작동하지 않는다는 것입니다. 다른 것들은 작동합니다 - 그래서 이것은 아마도 Linux 버그 일 것입니다. – ondra

+0

예, sys_setfsuid() 커널 코드의 주석이 특별히 access()를 언급했기 때문에 버그처럼 들립니다 ... – caf

+0

@Ondrej,'fsuid'가 있음을 보여주는 @Ondrej 코드를 게시하십시오 , 다른 UID/GID 구조와는 달리, 쓰레드가 아니라 프로세스마다. 커널과 glibc 버전은 물론 스레딩 구현 (NPTL, LinuxThreads, OndrejThreads 등)도 지정하십시오. – pilcrow

5

한 스레드에 대해서만 uid를 변경하려면 syscall을 직접 사용해야합니다. syscall (SYS_setresuid, ...); libc 함수 setresuid()는 모든 스레드에 대해이를 동기화합니다 (모든 스레드에 보내는 singal을 사용).