set[e]uid, set[e]gid, chroot в win32 (NT/200x/XP)
а что они должны делать?..
SETUID(2) FreeBSD System Calls Manual SETUID(2)
NAME
setuid, seteuid, setgid, setegid, -- set user and group ID
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
int
setuid(uid_t uid);
int
seteuid(uid_t euid);
int
setgid(gid_t gid);
int
setegid(gid_t egid);
DESCRIPTION
The setuid function sets the real and effective user IDs and the saved
set-user-ID of the current process to the specified value. The setuid
function is permitted if the specified ID is equal to the real user ID or
the effective user ID of the process, or if the effective user ID is that
of the super user.
The setgid function sets the real and effective group IDs and the saved
set-group-ID of the current process to the specified value. The setgid
function is permitted if the specified ID is equal to the real group ID
or the effective group ID of the process, or if the effective user ID is
that of the super user.
The seteuid function (setegid sets the effective user ID (group ID)
of the current process. The effective user ID may be set to the value of
the real user ID or the saved set-user-ID (see intro(2) and execve(2;
in this way, the effective user ID of a set-user-ID executable may be
toggled by switching to the real user ID, then re-enabled by reverting to
the set-user-ID value. Similarly, the effective group ID may be set to
the value of the real group ID or the saved set-group-ID.
RETURN VALUES
Upon successful completion, the value 0 is returned; otherwise the
value -1 is returned and the global variable errno is set to indicate the
error.
ERRORS
The functions will fail if:
[EPERM] The user is not the super user and the ID specified is
not the real, effective ID, or saved ID.
SEE ALSO
getgid(2 getuid(2 issetugid(2 setregid(2 setreuid(2)
STANDARDS
The setuid and setgid functions are compliant with the ISO/IEC
9945-1:1990 (``POSIX.1'') specification with _POSIX_SAVED_IDS not defined
with the permitted extensions from Appendix B.4.2.2. The seteuid and
setegid functions are extensions based on the POSIX concept of
_POSIX_SAVED_IDS, and have been proposed for a future revision of the
standard.
HISTORY
A setuid and a setgid function calls appeared in Version 7 AT&T UNIX.
FreeBSD 4.10 June 4, 1993 FreeBSD 4.10
CHROOT(2) FreeBSD System Calls Manual CHROOT(2)
NAME
chroot -- change root directory
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <unistd.h>
int
chroot(const char *dirname);
DESCRIPTION
Dirname is the address of the pathname of a directory, terminated by an
ASCII NUL. Chroot causes dirname to become the root directory, that
is, the starting point for path searches of pathnames beginning with `/'.
In order for a directory to become the root directory a process must have
execute (search) access for that directory.
It should be noted that chroot has no effect on the process's current
directory.
This call is restricted to the super-user.
Depending on the setting of the `kern.chroot_allow_open_directories'
sysctl variable, open filedescriptors which reference directories will
make the chroot fail as follows:
If `kern.chroot_allow_open_directories' is set to zero, chroot will
always fail with EPERM if there are any directories open.
If `kern.chroot_allow_open_directories' is set to one (the default
chroot will fail with EPERM if there are any directories open and the
process is already subject to a chroot call.
Any other value for `kern.chroot_allow_open_directories' will bypass the
check for open directories
Upon successful completion, a value of 0 is returned. Otherwise, a value
of -1 is returned and errno is set to indicate an error.
ERRORS
Chroot will fail and the root directory will be unchanged if:
[ENOTDIR] A component of the path name is not a directory.
[EPERM] The effective user ID is not the super-user, or one or
more filedescriptors are open directories.
[ENAMETOOLONG] A component of a pathname exceeded 255 characters, or
an entire path name exceeded 1023 characters.
[ENOENT] The named directory does not exist.
[EACCES] Search permission is denied for any component of the
path name.
[ELOOP] Too many symbolic links were encountered in translat-
ing the pathname.
[EFAULT] dirname points outside the process's allocated address
space.
[EIO] An I/O error occurred while reading from or writing to
the file system.
SEE ALSO
chdir(2 jail(2)
HISTORY
The chroot function call appeared in 4.2BSD.
FreeBSD 4.10 June 4, 1993 FreeBSD 4.10
Еще советую посмотреть CreateProcessAsUser, LogonUser, и раздел Platform SDK: Security: Access Control Reference.
Это все есть в MSDN'е за 2001 год.
Идея совсем в другом: нужно чтобы запущенный процесс под рутом (администратором) после того, как забиндится на порты (возможно < 1024) сам выставил себе права указанного пользователя и дальше работал с его правами. Делается это для безопастности - любое удалённое переполнение буфера не позволит исполнить код с правами отличными от прав этого пользователя.
Спасибо - будем курить MSDN.
А может ты ещё знаешь примеры где такое реально работает?
И ещё: можешь помочь в обучении приложения уметь работать как сервис?
Это опенсорс проект под GPL и на данный момент я являюсь оновным его разработчиком. \m/
тогда тебе надо LogonUser + ImpersonateLoggedOnUser
http://rsdn.ru/article/files/Classes/svcclass.xml
http://rsdn.ru/article/baseserv/services_details.xml
http://rsdn.ru/article/baseserv/svcadmin-1.xml
http://rsdn.ru/article/baseserv/svcadmin-2.xml
http://www.sf.net/projects/rfc3442svc (Это опенсорс проект под BSD License и на данный момент я являюсь оновным его разработчиком. \m/ работает как сервис.
Но если ты делаешь сервис, то тебе не понадобяться эти функции скорее всего, при создании сервиса его можно запускать не от Local System, а от определенного пользователя. Что-то мне подсказывает, что тебе этого хватит
Приложению работать как сервис - это довольно легко. Могу послать на Но если ты делаешь сервис, то тебе не понадобяться эти функции скорее всего, при создании сервиса его можно запускать не от Local System, а от определенного пользователя. Что-то мне подсказывает, что тебе этого хватит
Приложение долно уметь работать и как сервис и как обычное приложение.
Но за ссылки спасибо.
Зеркало rsdn.ru выложено в локальный доступ:соответственно статьи лежат здесь:
::/article/files/Classes/svcclass.html
::/article/baseserv/services_details.html
и т.д.
void _CRTAPI1 main(int argc, char **argv)
{
SERVICE_TABLE_ENTRY dispatchTable[] =
{
{ TEXT(SZSERVICENAME (LPSERVICE_MAIN_FUNCTION)service_main },
{ NULL, NULL }
};
if ( (argc > 1) )
{
do_some_job;
exit(0);
}
if (!StartServiceCtrlDispatcher(dispatchTable
AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed.";
exit(0);
}
Если это приложение должно работать от другого юзера (не того, который его запустил то это тоже делается просто. При старте проверяешь текущий username (GetUserName и если он неправильный, то перезапускаешь сам себя через CreateProcessAsUser.
Только у того юзера, который делает такое нужна какая-то дополнительная привилегия, точно не помню какая. А сервис просто стартуешь от нужного юзера сразу, и все.
Это, случаем, не дальнейшее развитие популярнейшей утилиты vvdcopy?
Кстати, (с целью завоевания рынка pda) не рассматриваются ли возможности переноса vvdcopy на Symbian OS (6, 7 Palm OS (5, 6) и др.?
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{...}
(Не я его придумывал.)
Приложение пускается не в текстовой консоле, а содержит формочку - графическую консоль.
Приложение из коммандной строки узнаёт о том что ему надо пускаться под другим узером и если не может установить себе права на это, то должно или выходить с ошибкой, или игнорировать ошибку и работать от текущего пользователя. (это не столь принципиально)
P.S. Возьмёшься это добавить в прогу? А то мне на порядок дольше разбираться с этим всем, чем реально прогать. (К тому же я это ещё под *nix ещё не дописал и ещё куча чего из TODO меня ждёт - вобщем я чувствую всё лето у меня будет посвящено этому...)
зачем делать несколько процессов, если можно сделать поток, работающий от лица другого юзера?.. Имена функций которые это делают - я уже назвал: LogonUser - чтобы создать токен пользователя, ImpersonateLoggedOnUser - чтобы переключить поток в контекст этого юзера, а потом (когда все что надо сделать под юзером - сделали) - вызвать RevertToSelf. У Local System (или другого юзера, про которого в полисях сказано, что он "Act as a part of Operating System") все необходимые для имперсонации привилегии есть.
P.S. stream=поток, thread=нить или тред (чтобы не было путаницы в терминологии).
это ты как хочешь: можешь один тред на время вдругого юзера переключать, можешь держать 100 потоков, все под разными юзерами.
Вопрос был об основном треде. Основной тред, как я понимаю, таким образом все равно будет запущен от того пользователя, который старотвал приложение.
то с точки зрения безопасности это почти то же, как если бы привилегии были одинаковы.
И если они показывают окошки на одном десктопе, это почти так же плохо.
Поэтому в графическом приложении маза не заморачиваться с таким,
а сделать отдельно процесс с нужными привилегиями, и отдельно - GUI для взаимодействия с ним,
связь через подходящий механизм IPC.
Нет конечно!
Или это ты так шутишь? Хотя мне будет приятно, если я узнаю, что кто-нибудь ещё её использует.
Это mvdsv - qw сервер с возможностью записи демок на стороне сервера от всех лиц.
Если интересно, могу дать ссылки на исходники.
Нет ни у кого желания попасть в историю путём занесения в changes проекта mvdsv?
А почему он под винду? Ведь qw изначально под операционные системы.
Честно говоря мне очень не хочется заниматься это частью.
А под unix-like всё хорошо - собирается под freebsd/linux gcc2/3; изначально должен и под Solaris, но негде тестировать; openbsd/netbsd - не пробовал, но не думаю что могут возникнуть существенные проблемы; о других ось ничего не могу сказать. Хотя как-то я общался с португальцем, который хотел пустить mvdsv под линухом на PowerPC 3 - судя по тому, что после вопроса "а ты пробовал его собирать?" вопросы больше не возникали (мы с ним достаточно хорошо пообщались, и я дал ему понять, что меня интересует результат его эксперимента, т.е. если бы возникли проблемы, то он бы ко мне обратился).
Это нужно для виндовой части.А какая там виндовая часть? Ты ж сказал что сервер пишет демки независимо от клиентов. Сервер вроде не под вендой.
Честно говоря мне очень не хочется заниматься это частью.
Сервер должен уметь работать и под виндой, вернее он уже работает, но подобную функциональность добавить стоит.
Ааа... А он изначально под виндой работал или его кто спортировал?
AFAIK ID Software его изначально под мастдай написало, потом само под линух портировало, а потом выложило сырцы под GPL.
Что?! В названии нет подстроки "vvd"?!
Часто же для увеличения популярности программы пишут что-то типа "разработка Алексея Пажитнова" или "продукт Евгения Рошаля".
"Доказывать идиотам, что они идиоты, - занятие неблагодарное и бесперспективное." (c)
Оставить комментарий
Filan
Как? (аналоги этих функций)Ссылки приветствуются (инета сейчас нет, но есть MSDN 2001 года).