2015-07-12 15 views
4

Возможно ли использовать набор библиотек C или системных вызовов для сброса всех пользовательских привилегий на POSIX или, по крайней мере, на Linux? Обратите внимание, что я не спрашиваю, как отказаться от root привилегий, и это, по-видимому, все остальные результаты поиска StackOverflow задают и отвечают.Выпускать привилегии как обычного пользователя без полномочий root для песочницы?

Я хочу такого же эффекта, как и переход на пользователя nobody, но, если возможно, сильнее. То есть, я хочу, чтобы мое приложение C, чтобы сделать следующее:

  • Выполнить как обычный пользователь, неroot и без разрешения битого УИПА файла
  • Сохраняйте возможность доступа к конкретным файлам и открытой исходящей сетевые соединения
  • добровольно и навсегда теряют способность читать и записывать файлы в указанных (или все) каталогов, особенно $HOME
  • Если возможно, отказаться или песочница всех других несущественных способностей, как открытие сокета с accept

Вещи, которые я рассмотрел, что до сих пор не отвечают всем требованиям:

  • Переключение на пользователя nobody с setuid/setgid
    • обычных пользователей запрещается переключение на другие пользователи (например, nobody), и приложение не должно требовать root только для перехода на nobody.
  • Linux/POSIX.1e Capabilities
    • возможности добавлять только root -как привилегии, а не отнимать обычные привилегии пользователя
  • Традиционные seccomp
    • Мое приложение будет нужно больше, чем просто exit, sigreturn, read, и write

вещи, которые выглядят интересно, но для которых я не мог найти в документации, как представляется, не сопровождается, или, как представляется, не переносимы:


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

+0

Вы считали что-то вроде групп/пространств имен? –

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить», чтобы помочь прояснить этот вопрос. –

+1

@self Полностью не согласен. Это хорошо изученный вопрос с хорошим описанием и списком вещей, которые близки, но не совсем подходят для решения. Это на самом деле один из лучших письменных вопросов, которые я видел на SO в течение долгого времени. – viraptor

ответ

2

Вряд ли какое-либо решение будет работать на всех POSIX, поскольку POSIX не определяет механизм, который вы ищете.

Рассматривая только требования и только Linux, возможно, самый простой способ удовлетворить их можно получить через модули безопасности. Любой из apparmor, selinux, RBAC будет делать то, что вам нужно, но только через внешний профиль - не что-то встроенное в ваше приложение. Проблема может заключаться в том, что для добавления профиля во все эти случаи требуется, чтобы пользователь root выполнял его (но профиль также относится к пользовательскому процессу).

Немного более сложное решение, которое почти удовлетворяет требованиям, - seccomp. Хотя он не понимает путей вообще (вы можете видеть только указатели), есть способы ограничить доступ: политики сексопа могут быть определены для каждого потока, поэтому вы можете перепроектировать вашу систему, чтобы иметь «поток проверки пути», который не работает не делайте ничего, кроме путей чтения и возврата сокетов, если они соответствуют вашей спецификации. Затем ограничьте эту нить только recv(), open() и send(). Тема, выполняющая другую работу, может затем опустить open() и использовать другую услугу.

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

В какой-то степени подход разделения приложений к отдельным процессам, которые имеют очень ограниченную ответственность, - это то, что вы могли бы тиражировать на других системах, но без таких же гарантий, как в Linux. Например, qmail представляет собой систему очень маленьких процессов, которые работают как конвейер для данных (упрощение). В Linux вы все равно можете использовать seccomp для них, в Solaris просто снимите exec и другие возможности на других системах ... Я не знаю, но, вероятно, вы можете что-то сделать.

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