나는 setuid 비트 세트로 실행 가능한 python 스크립트를 만들려고한다. 사용자 'bgmc'에 속한 프로그램은 '/ home/bgmc'디렉토리에 일부 파일을 작성해야하지만 다른 사용자 인 'client'가 호출합니다. 사실, 나는 사용자 '클라이언트'가 프로그램에 의해 생성 된 파일을 변경하는 것을 원하지 않는다. 루트가 아닌 사용자의 프로그램에서 setuid 비트를 설정하는 방법은 무엇입니까?
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("/home/bgmc/myprogram.sh");
return 0;
}
내가가 프로그램의 setuid 비트를 설정 : 나는 (
setuid on shell scripts 참조) 프로그램을 호출하는 C-래퍼를 사용했다. C 컴파일 된 프로그램이 루트에 속하면 프로그램이 제대로 실행되고 예상 파일이 만들어집니다. 는 C-컴파일 된 프로그램의 특성은 다음과 같습니다 나는 bgmc에 myprogram의 사용자 그룹을 변경할 때
그러나
8 -rws--x--x 1 root root 4657 Mar 2 16:25 myprogram
: bgmc, 프로그램은 더 이상 파일을 만들 수 없습니다 : "사용 권한이 거부되었습니다."
setuid(0);
에 : 나는 라인을 변경하려고 1002 이후
setuid(1002);
가 'bgmc'의 사용자 ID입니다 (나는 이것에 대한 명령 "ID -u bgmc"를 사용)하지만이 'didn를 도와 줘.
나는 루트 권한을 부여하지 않는 편이 낫다. 이것을 막을 수있는 방법이 있습니까?
답장을 보내 주셔서 감사합니다. setuid 쉘 스크립트가 위험하다고 말했기 때문에 대신 스크립트를 설정하려고했습니다. 그러나 이것은 내 디렉토리가 올바른 권한을 가지고 있지만 작동하지 않습니다 (775). 스크립트의 setgid도 리눅스에서 좋은 결과를 얻지 못했습니까? 이 경우에 c-wrapper도 만들어야합니까? –
setgid의 문제는 setuid와 동일합니다. 그룹의 권한이 무엇이든 관계없이 시스템의 모든 사용자에게 스크립트 사용 권한을 부여하는 것이 쉽기 때문에 이러한 사용 권한을 부여 할 수도 있습니다. 따라서 커널은 스크립트에서 setgid를 지원하지 않습니다. –
고마워요! 나는 당신이'execve' (또는 더 정확하게'execle')라고 말했듯이 이것들이 동등하다고 생각하고 빈 환경을 통과 시켰습니다. 제 질문은 정확히 어떻게 그런 식으로 정리해야합니까? 환경을 지우면 내 프로그램이 Python의 일부 라이브러리 ("import", 즉 "import matplotlib.pyplot")에서 더 이상 사용할 수 없기 때문입니다. 그래서 모든 것을 정리하지 않을 것입니다. –