2017-10-17 6 views
1

Linux에서 C를 사용하여 응용 프로그램을 작성하고 있습니다. 내 응용 프로그램에서는 일반 사용자 (비 루트 사용자)와 함께 시작 부분에서 몇 가지 작업을 수행해야하며 실행 중간에 루트 사용자와 함께 몇 가지 작업을 수행해야합니다.Linux에서 C를 사용하여 실행하는 동안 사용자를 전환하는 방법

그런데 일반 사용자의 구성을 수정할 수 없습니다. 그래서 sudoers에 일반 사용자를 추가 할 수 없습니다. OS 구성도 수정할 수 없습니다.

내 응용 프로그램이 실제로하는 일은 응용 프로그램을 실행하고 분석을 위해 출력을 얻는 것입니다.

일부 응용 프로그램은 root로 실행해야합니다. 다중 스레드를 사용하여 이러한 응용 프로그램의 출력을 병렬로 실행하고 분석 한 다음 각 응용 프로그램의 보고서를 보고서라는 단일 개체에 저장합니다. 서브 프로세스에서 execvp을 사용하여 이러한 응용 프로그램을 호출합니다.

내 응용 프로그램의 주요 목적은 소프트웨어 테스팅을 자동화하는 것입니다. 그리고 대부분의 작업은 루트가 아닌 소프트웨어 소유자에서 실행해야합니다.

그래서, 문제는

  • 는 어떻게 실행하는 동안 사용자를 전환 할 수있다?
  • 어쨌든 이것을 1 개의 실행 파일 내에서 구현할 수 있습니까?
  • POSIX API를 사용하는 것이 더 좋습니다.
  • 일반 사용자로 내 응용 프로그램을 실행하고 응용 프로그램에 루트 암호를 제공하고 루트 암호를 사용하여 루트로 전환하십시오.
+1

http://man7.org/linux/manage/man2/setuid.2.html – oakad

+0

@oakad 고맙지 만 정상적인 사용자와 내 응용 프로그램을 시작한 다음 루트 암호를 사용하여 root로 전환 할 수 있습니까? –

+2

아니요, 루트로 실행되는 별도의 도우미 프로세스를 생성 할 수 있지만 IPC를 통해 통신합니다. 이를 수행하는 한 가지 방법은 도우미에 setuid 비트를 설정하는 것입니다. 도우미를 가능한 한 최소화 시키십시오. 실제로 루트 액세스가 필요한 아주 기본적인 기능 만 제공하고 기본 앱은 나머지 작업을 수행하게하십시오. –

답변

4

더 읽기에 대한 setuid 실행setreuid(2)execve(2) 콜. 주의 할 점은 소유권을 변경 (chown(1))하고 코드를 신중하게으로 변경 한 후 실행 파일에 chmod u+s (chmod(1) 참조)의 setuid 플래그를 넣어야합니다. security holes을 피하십시오.

의 setuid가 su, sudo, super, login 등이 사용하는 기본 메커니즘은 (이다 (그래서 코드는 setuid 메커니즘을 아는 사람에 의해 검토 및 보안 문제를 인식 한 것을 권장합니다) ...) 프로그램을 사용하여 권한을 얻거나 취소 할 수 있습니다. credentials(7) & capabilities(7)을 참조하십시오.

(루트로, 또는 /usr/libexec/ ... 아마도 약간의 setuid 실행 파일을 시작) 일부 도우미 프로세스를 시작하고 몇 가지 inter-process communication 기능을 사용하여 통신하는 것이 안전 할 수 있습니다 (같은 pipe(7) ...). 예를 들어 루트 프로세스에서 GTK 나 Qt와 같은 GUI 툴킷을 사용하지 않는 것이 좋습니다. 앱에 GUI가있는 경우 비 루트 (일반 사용자) 프로세스에서 GUI를 실행하고 특별한 권한이 필요한 실제 작업을 수행하는 (잘하면 작은) 도우미 프로세스의 루트로 실행하는 것이 합리적입니다.

코딩하기 전에 Advanced Linux Programmingsyscalls(2)과 같은 좋은 책을 읽고 나는 system call의 설명서를 읽는 것이 좋습니다. Security 측면이 특히 중요합니다.

Setuid 실행 파일은 반드시 암호를 요구하거나 사용하지 않아도됩니다. 암호가 필요한 프로그램 (특히 login, su, sudo 등 ....)은 setuid입니다 (리눅스에서는 free software이므로 연구 소스 코드를 사용할 수 있습니다). 확인하려면 ls -l /bin/su /usr/bin/sudo /bin/login을 시도하십시오.

다양한 사용자 환경을 에뮬레이션하려면 environ(7)을 알고 있어야합니다.

관련 문제