Всем привет. Руководство поставило задачу запускать процессы от другого пользователя с разными уровнями секретности. Делать это всё нужно руками, su/sudo использовать нельзя. Почему, не объяснили - военные не любят вопросы.
Алгоритм работы:
1. Я запускаю программу под рутом, он форкает свой процесс
2. Дочерний процесс проверяет указанного пользователя на существование, запрашивает информацию о нем, меняет UID, GID и переменные окружения,
3. Дочерний процесс заменяет себя другим процессом-командой(execvp).
Если выполнять [запуск процесса под другим пользователем] и [смену уровня секретности процесса] по отдельности - все ок. А если вместе - дочерний процесс не заменяется процессом-командой. Если использовать system(да, она не заменяет процесс), то errno = 38 (Функция не реализована), а execvp не возвращает вообще ошибок - просто не выполняет команду.
Пользователя меняю так же, как и в su, кроме проверки пароля(у меня через PAM). Но во-первых если запускать приложение из-под рута, то su тоже игнорирует аутентификацию, во-вторых без смены уровня секретности всё отлично работает.
Уровень секретности(УС), если верить руководству программиста(книга 14), меняют 2 функции - setmac и psetmac. Уровень секретности может менять либо root, либо пользователь с атрибутом MCBC_CAP_SETMAC. Собственно обе эти функции и пытаюсь использовать(не одновременно, конечно). УС меняю из дочернего процесса, после запроса инфы о пользователе, но до смены UID и GID. Проверяю смену УС функциями pgetmac, getmac - показывает, что УС изменился, но в итоге потом процесс-команда не запускается.
При смене УС я рассчитываю, что он унаследуется и процессу, замещающему дочерний процесс. Но видимо что-то идет не так =( Кто-нибудь знает как из кода запустить процесс с нужным УС?
LinuxForum.Fans
[МСВС] Как изменить уровень секретности процесса?
Автор: kotaperkot
7 сообщений
4156 просмотров
1. Я запускаю программу под рутом, он форкает свой процесс
2. Дочерний процесс проверяет указанного пользователя на существование, запрашивает информацию о нем, меняет UID, GID и переменные окружения,
3. Дочерний процесс заменяет себя другим процессом-командой(execvp).
su/sudo использовать нельзя.
ничего, что вы сделали велосипед аналогичный su/sudo?
я думаю вам стоит посмотреть исходные тексты su/sudo(только не основные, а те, что в МСВС), и сделать также как там.Кто-нибудь знает как из кода запустить процесс с нужным УС?
Я понимаю, что пришлось по сути su сделать частью своего приложения(я просто его переписал на Си++, если уж на чистоту), но "приказы не обсуждаются") К сожалению с МСВС не поставляются исходные коды - она пропиетарная =(
Сорри, вопрос снимается. Я тестил это всё на kgod2, оказалось что проблема в нем.
а там тоже самое что в RedHat. Народ говорил бит-в-бит совпадает. Но я лично не проверял.К сожалению с МСВС не поставляются исходные коды - она пропиетарная =(
а там тоже самое что в RedHat. Народ говорил бит-в-бит совпадает. Но я лично не проверял.[/quote][quote="kotaperkot"]К сожалению с МСВС не поставляются исходные коды - она пропиетарная =(
Может быть, но, например, kgod2 2.0 отличается от firefox 2.0 все-таки чем-то. На FF 2.0 у меня расширение работает, а на kgod2 2.0 - нет. Как я только не пытался) Можно возразить, что браузер - не часть ОС, и это будет правдой. Я к тому, что различия могут быть в самых неожиданных местах. Но за наводку спасибо =)
kotaperkot, погуглите. Я видел ftp где-то в redhat'е, с исходниками. Его особо не рекламируют, но он есть(был во всяком случае). Естественно там всё совсем не так, как в upstream'e. Возьмите оттуда su, все так делают. Ну не кричите особо. :-X
Войдите или зарегистрируйтесь, чтобы ответить.