Как правильно перейти на более низкий уровень привилегий с помощью setuid?
Я пишу программу на C, которая привязывается к порту < 1024. После этого я бы хотел, чтобы она работала с привилегиями не-root.
Я знаю, что мне нужно вызвать setuid(), но с каким аргументом? UID варьируются от системы к системе.
2 ответа
Решение
Ты можешь использовать getpwnam()
посмотреть uid/gid пользователя по имени:
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
int changepriv(const char *user) {
struct passwd *pw;
int rv;
pw = getpwnam(user);
if (!pw)
return -1;
rv = setgid(pw->pw_gid);
if (rv == -1)
return -2;
rv = setuid(pw->pw_uid);
if (rv == -1)
return -3;
return 0;
}
Больше, чем вы хотели бы знать http://www.eecs.berkeley.edu/~daw/papers/setuid-usenix02.pdf