
프로세스를 시작하는 서비스를 만들려고 합니다.
프로세스 시작 시 루트로 몇 가지 명령을 수행한 다음 덜 권한이 있는 사람이 아닌 사용자로 프로세스의 나머지 부분을 실행할 수 있기를 원합니다.
예: 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;
}