프로세스를 시작하는 서비스를 만들려고 합니다.
일부 명령을 루트로 실행한 다음 덜 권한이 있는 사람이 아닌 사용자로 나머지 프로세스를 실행하기 위해 프로세스를 시작하고 싶습니다.
예를 들어, 포트를 사용하여 일부 웹 서버 구성을 수행하고 다양한 서버 프로세스를 시작하려면 사용자에게 루트 권한이 필요하다는 것을 알고 있지만 apache
항상 루트로 실행되는 것은 아닙니다. 이와 유사한 작업을 수행하는 코드를 찾을 수 없으며 사용할 수 있는 다른 예제가 있는지 궁금합니다.
본질적으로 내 질문은,특정 루트 프로세스를 실행하기 위해 루트가 아닌 사용자에게 임시 루트 권한을 부여하는 방법은 무엇입니까?
아니면 내가 이것을 잘못된 방식으로 생각하고 있는 걸까요?사용자에게 루트 권한을 부여하지 않지만 루트 사용자가 루트가 필요한 프로세스를 실행하도록 허용합니까?
답변1
루트 사용자로 수행하는 작업에 따라 다양한 옵션이 있습니다. 그러나 자동화된 서비스("apache와 같은")의 경우 일반적으로 루트로 시작한 다음 제한된 사용자로 다운그레이드됩니다.
Debian 스타일 구성(Ubuntu 및 Mint 포함)에는 /etc/default/에 파일이 있습니다.내 서비스 이름전환할 사용자를 설정합니다. 다른 Linux 배포판은 설정을 저장하는 위치가 다르지만 기술은 궁극적으로 동일합니다.
서비스 프로그램을 직접 작성하는 경우 다음을 사용합니다.setuid(). setuid가 호출되면 프로세스는 루트 권한을 갖도록 돌아갈 수 없습니다. 필요할 것이예요이름으로 사용자 찾기그리고사용자를 위한 그룹 설정.
오래 전에 작성한 일부 코드를 단순화하면 다음과 같습니다.
int lockToUser(const char * user) {
# Look up the username in /etc/passwd
struct passwd * pwd = getpwnam(user);
if (!pwd) {
# Failed... Could not find user, see errno
return 0;
}
# setuid sets the user
# setgid sets the main group similar to the group in /etc/passwd
# Sets the other groups which will grant additional permissions.
# similar to the groups in /etc/groups
if (initgroups(user, pwd->pw_gid) || setgid(pwd->pw_gid) || setuid(pwd->pw_uid)) {
# Failed... Could not lock down to user, see errno
return 0;
}
return 1;
}