2013-07-25 2 views
1

Я работаю над небольшим проектом на linux (Ubuntu), где мне требуется, чтобы один из них был аутентифицирован для доступа к службе. Моя идея заключается в том, что эта аутентификация должна храниться вместе с процессом и его дочерними элементами, а не с самим пользователем linux.Linux, хранить учетные данные с процессом и его детьми, внуками?

Эта аутентификация должна выполняться путем вызова, например, «myapplogin» с именем пользователя, паролем и скриптом/приложением (любое приложение) для запуска с этими учетными данными. Я хочу, чтобы можно было сохранить эти верительные грамоты у любых детей, созданных этим процессом, и любых внуков и так далее.

Я рассмотрел несколько вариантов этой возможности.

  1. Храните идентификатор входа или что-то в переменных среды. Это, насколько мне известно, передается детям. Однако переменные окружения могут быть записаны процессом, что позволяет ему, возможно, получить доступ, которого он не должен иметь.

  2. При входе в систему, храните идентификатор процесса, который вошел в систему, а затем в каждой операции с этой службой, проверьте, есть ли у него сохраненный pid или где-либо в его родословной существует сохраненный pid. Это может стать слишком медленным, если эта родословная станет большой и если к ней часто обращаются. Опция затем заключается в кэшировании любого pid, который находится в родословной, но это может иметь последствия для безопасности при повторном использовании pid в ОС.

  3. Использование групп процессов и ссылку, с логином, но также может быть изменен самим процессом, что позволяет ему, возможно, присоединиться к существующей группе без фактического входа в систему.

Есть ли способ сделать это? Предпочтительно, это должно быть что-то, хранящееся в процессе, что все новые дети наследуют, которые невозможно перезаписать и читаются снаружи из модуля ядра.

Возможно, я просто не замечаю ничего очевидного? Буду признателен за любой вклад в это =)

ответ

1

Я могу предоставить два метода зависит от того, какие «услуги» вы упомянули:

1.Если услуг вы упомянули, как: управление сетью, диск монтаж/umounting и т. д. Следующее:

Ядро Linux реализует механизм ВОЗМОЖНОСТИ. Ядро определило различные возможности. Эти возможности могут быть назначены различным пользователям. И основным правилом способности является: назначить минимальный набор привилегий одному пользователю для выполнения своей миссии.

Таким образом, вы можете использовать идею CAPABILITY, что вам нужно сделать, это:

(1) Список всех услуг, к которым необходимо ограничить доступ.

(2) Определите новые возможности или используйте существующие возможности для перечисленных служб.

(3) Измените исходные коды ядра, чтобы проверить возможности одного процесса при доступе к перечисленным услугам. Обычно эти проверки находятся в записях системных вызовов.

(4) Внесите изменения в исходные коды процессов инициализации/входа при входе пользователя в систему, назначьте необходимые возможности для разных пользователей в соответствии с вашими правилами контроля доступа.

2.Если упомянутые вами услуги похожи на выполнение каких-либо системных команд.

(1) Создайте файл, такой как watch_dog или в каталоге/etc /, в этом файле вы можете определить формат для отображения конкретных пользователей, которые могут выполнять определенные команды. Конечно, формат файла может быть действительно причудливым, например, регулярное выражение может быть использовано. Для анализа файла можно использовать Bison или Lex/Yacc.

(2) Во время инициализации ядра Linux файл/etc/watch_dog может быть проанализирован.

(3) В процессе fork() установите правила/etc/watch_dog для связанного с процессом task_struct.

(4) В элементе exec() примените правила/etc/watch_dog, чтобы проверить, может ли он выполнить программу или нет.

+0

Спасибо, что нашли время, чтобы написать это, но это, к сожалению, не совсем то, что я после =/Тем не менее, вы поставили меня на путь к решению, я думаю, будет работать отлично =) – Wildex999

+0

Решение, Перейдем к: setgroups. Это позволяет мне пометить процесс, установив его в дополнительную группу. Для установки группы в процесс требуется функция SETGID (или root), поэтому я могу остановить процесс изменения/добавления групп после того, как я дал ему. Эти группы наследуются детьми, но теряются при использовании sudo. Группа не принадлежит пользователю, а процесс, который я хочу. Теперь мне просто нужно найти способ получить группы процессов из модуля ядра, когда я знаю PID, но это должно быть возможно, правильно? знак равно – Wildex999

Смежные вопросы