Безопасно используйте find с sudo

10

На сервере Linux мне нужно удалить привилегии root из группы пользователей. Но у этих пользователей есть веские основания использовать утилиту «поиск» для поиска файлов по именам файлов, датам изменения и другим метаданным.

На сервере имена файлов не являются конфиденциальными, но содержимое файла может быть.

Я хотел бы использовать sudo, чтобы позволить пользователям искать файлы в любом месте на сервере. Утилита "find" хороша, но она допускает всевозможные побочные эффекты, такие как использование -exec для запуска произвольных команд.

Могу ли я получить findработу с моими ограничениями?

Троэльс Арвин
источник
14
Обычно вы не хотите, чтобы результаты поиска шаблонов имен файлов содержали файлы, к которым у вас нет доступа. В связи с этим ваше требование немного странно.
HBruijn
2
Никто не заставляет вас заниматься этим вопросом. Я думаю, что одна из целей Server Fault - служить форумом для нечетных ситуаций.
Троэльс Арвин
2
Ошибка сервера - это не форум, и попытки обратной психологии не изменяют достоверность наблюдений Брейна (которые, я уверен, были изложены в попытке помочь вам).
Гонки

Ответы:

19

Как насчет найти ?

locate считывает одну или несколько баз данных, подготовленных updatedb (8), и записывает имена файлов, соответствующие хотя бы одному из PATTERN, в стандартный вывод, по одному на строку. Если --regex не указано, PATTERN могут содержать символы-заглушки. Если какой-либо PATTERN не содержит символов-заглушки, locate ведет себя так, как если бы шаблон был PATTERN .

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

Или, может быть, даже найти :

Secure Locate обеспечивает безопасный способ индексации и быстрого поиска файлов в вашей системе. Он использует инкрементную кодировку так же, как GNU locate, чтобы сжимать свою базу данных для ускорения поиска, но он также будет хранить права доступа к файлам и владельца, чтобы пользователи не видели файлы, к которым у них нет доступа.

Эта страница руководства описывает GNU-версию slocate. slocate Позволяет пользователям системы выполнять поиск по всем файловым системам, не отображая несанкционированные файлы.

Lenniey
источник
Отличная идея. Я не знаю, почему я не подумал об этом. Но я боюсь, что параметр «-d» может быть каким-то образом использован для чтения в произвольные файлы, если правила sudo позволяют пользователю выполнять любую команду «locate»?
Троэльс Арвин
2
@TroelsArvin: locateне нужно sudo; только его updatedbработа требует особых привилегий. Таким образом, ваши пользователи никогда не должны запускаться или иметь возможность работать sudo locate.
jwodder
1
@jwodder: на сервере RHEL 7: допустим, у пользователя u нет доступа к / data / foo. В / data / foo есть файл "somefile.csv". Теперь, когда вы выполняете «locate somefile.csv», вывод «locate» не включает /data/foo/somefile.csv - если пользователь u не выполняет «locate» через sudo. (Использование аргумента «--nofollow» не помогает.)
Троэльс Арвин
1
@TroelsArvin, но -dфлаг только устанавливает путь к базе данных? Может быть, я неправильно тебя понял.
Леннией
21

Согласно с man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Это сработало для меня. (строки, начинающиеся с «#», являются корневыми, строки с «$» - не-root), в этом случае пользователь без полномочий root входит в wheelгруппу.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Учитывая, что дает возможность, она соответствует именно тому, что вы хотите. Я не исчерпывающе проверил, findесть ли функция, которая позволяет вам читать байты внутри файлов, но такие очевидные вещи, как LD_PRELOADи атаки с использованием библиотечных шимов, не должны работать из-за природы проверок setuid в Linux, а биты возможностей не получают наследуется дочерними процессами (в отличие от raw setuid), так что это еще один бонус.

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

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

Поэтому будьте осторожны и с осторожностью относитесь к этому и понимайте, что с этим по-прежнему существует риск, даже если очевидные вещи не работают.

О, и мне было бы интересно посмотреть, есть ли у кого-нибудь доказательство концептуальной атаки, которое использует этот механизм в качестве основы для повышения привилегий в комментариях!

Мэтью Ифе
источник
5
Это действительно выглядит довольно интересно!
Свен
Как это? Ну, нет PoC, но, тем не менее, интересно: forums.grsecurity.net/…
Lenniey
Мне нравится эта идея, но у нее есть существенный недостаток: теперь sudofind является двоичным файлом, который не является частью какого-либо программного пакета (например, RPM) в системе. Так что, если дистрибутив рассылает патч для «find», то sudofind обновляться не будет.
Троэльс Арвин
2
@TroelsArvin Это не обязательно плохо. Если вы добавляете функции, подобные setuid, к существующей утилите, которая не предназначена для этих возможностей, вам не нужно обновлять базовую утилиту, пока вы не убедитесь, что обновленную утилиту можно безопасно использовать с нестандартной утилитой. возможностей. Представьте себе в этом случае, если бы обновление дало findвозможность напрямую выполнять некоторый пользовательский код, аналогично тому, что awkможно сделать.
Эндрю Хенле
4
Самая большая проблема, с которой я могу столкнуться, заключается в том, что в каталоги, доступные для записи, которые находятся под каталогами без возможности поиска, можно внезапно записать.
Тавиан Барнс
2

Я бы дал пользователям соответствующие разрешения.

По умолчанию, если используется umask 022, каталоги создаются так, что каждый может просматривать и оценивать файлы в них. Если нет, вы можете вручную изменить разрешение каталога на побитовое или его старые разрешения и 0555:

chmod +0555 foo

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

Если вы хотите, чтобы только некоторые пользователи могли читать и выполнять этот каталог, вы можете изменить его режим на 0750, поместить этих пользователей в группу и изменить владельца группы каталога на эту группу:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
yt7b97q-
источник