Выдача себя за пользователя в Mac OS X - PullRequest
4 голосов
/ 02 марта 2012

В Windows можно иметь службу, которая позволяет клиентам, работающим в пользовательском контексте, подключаться к нему через сокеты или каналы, а затем выдавать себя за подключающегося пользователя, чтобы действовать от имени этого пользователя, например, для доступа к файлам. что только пользователь имеет доступ к нему (или обеспечивает доступ к другим файлам).

Каков эквивалентный способ сделать это на Mac OS X (Linux тоже интересен)? Я бы предположил, что функции set * uid будут использоваться для этого каким-то образом?

Но как мне проверить подлинность пользователя, которого я хочу выдать за себя, и настроить uid при подключении пользователя к сокету?

Кроме того, функции set * uid, похоже, влияют на весь процесс, что затрудняет их использование в многопоточном демоне. Существует ли другой широко используемый шаблон проектирования для этого типа служб в Mac OS X / Linux?

Edit: Ответ pmjordan, похоже, решает проблему * uid, доступную только для процесса, и вопрос Как передать учетные данные пользователя через сокет домена Unix в Mac OS X? , кажется, заботится о проблема с аутентификацией при использовании доменных сокетов unix вместо простых сокетов.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Для OS X: смотрите ли вы Руководство по аутентификации, авторизации и разрешениям для Mac OS X?

Как правило, в UNIX-подобных операционных системах процессы обычно принадлежат одному конкретному пользователю, и то, что им разрешено делать, определяется в первую очередь этим. Есть некоторые исключения из этого, но, как правило, идея состоит в том, чтобы сделать это с гранулярностью каждого процесса. С другой стороны, запуск новых процессов очень прост - см. fork() функция .

Таким образом, типичный способ для демона (такого как sshd ) выдать себя за другого пользователя - это запустить основной процесс как root . Затем примите входящие соединения и передайте их fork() ed дочерним процессам, которые, как вы говорите, немедленно отбрасывают привилегии, используя set * uid. Существуют различные каналы связи между процессами, такие как каналы, которые можно настроить, если дочерние процессы должны взаимодействовать с родительским процессом. Очевидно, что чем меньше кода выполняется от имени пользователя root, тем лучше с точки зрения безопасности, поэтому вам нужно стремиться к тому, чтобы дочерние процессы были автономными.

Если вам нужно, чтобы пользователи фактически указали свое имя пользователя и пароль, все становится немного сложнее; Возможно, вы захотите взглянуть на исходный код утилит su и sudo и прочитать документацию для платформы для API аутентификации.

1 голос
/ 05 сентября 2014

из Техническое примечание TN2083 - Apple Developer

В некоторых случаях полезно выдавать себя за пользователя, по крайней мере, до тех пор, пока проверка полномочий не выполняется подсистемой BSD ядра.Однопоточный демон может сделать это, используя seteuid и setegid.Они устанавливают эффективный идентификатор пользователя и группы процесса в целом.Это вызовет проблемы, если ваш демон использует несколько потоков для обработки запросов от разных пользователей.В этом случае вы можете установить эффективный идентификатор пользователя и группы потока, используя pthread_setugid_np.Это было представлено в Mac OS X 10.4.

...