Возможности позволяют оценивать некоторые важные системные привилегии в отдельном потоке, отличном от текущего процесса. Таким образом, вам не нужно запускать программу от имени пользователя root, чтобы получить доступ к определенным частям системы.
В качестве решения, вытекающего из потребностей, раздел 25 POSIX.1e посвящен этой проблеме. Разработка привилегий, определенных в этом разделе, и других была завершена выпуском ядра Linux версии 2.6.26. Вот все, что вам нужно знать о возможностях ядра Linux.
Понимание логики Capabilities API
Контроль авторизации в Unix-системах состоит из двух шагов:
- Если текущий владелец (действующий идентификатор пользователя, EUID) работающего приложения равен нулю, то система не проверяет авторизацию
- Если значение EUID отлично от нуля, система выполняет процесс контроля в соответствии с полномочиями действующего пользователя и группы соответствующего приложения.
Некоторые приложения должны иметь более широкие привилегии (SUID, биты SGIT) во время работы. В качестве наиболее типичного примера можно привести
приложение пароль. При этом пользователи в системе могут менять свои пароли. Однако писать в /etc/shadow файл, в котором хранятся зашифрованные пароли, необходимо работать с правами пользователя root (т.е. ID пользователя = 0).Для решения этой проблемы в приложении passwd есть бит SUID. Какой бы пользователь ни запускал это приложение, активным владельцем (EUID) всегда будет root:
ls -l /usr/bin/пароль
# Выход
-rwsr-xr-x. 1 корень root 32552 23 июля 2021 г. /usr/bin/passwd
Возможность запуска приложений SUID в традиционной модели аутентификации Unix, похоже, решила проблему. Однако критические ошибки в приложениях с битами SUID открывают дверь для запуска нежелательных кодов для пользователей с полными правами в системе. Идеальное приложение должно работать без прав root, если это возможно.
Проблема не заканчивается только битом SUID. Вы также должны иметь права root-пользователя, если хотите прослушивать привилегированный порт TCP или UDP менее 1024 в системах на основе Unix. Например, чтобы иметь возможность прослушивать порт TCP 80 веб-сервера, вы должны запустить приложение от имени пользователя root.
За прошедшие годы стало понятно, насколько разрушительным может быть запуск программного обеспечения, предоставляющего услуги в сетевой среде, с полностью авторизованной учетной записью пользователя. В качестве временного решения было принято, что только определенная и меньшая часть программы слушает на привилегированном порту как root, а затем изменяет идентификатор активного пользователя на другого пользователя для последующих процессов (например, на пользователя Nobody с ограниченными правами).
Эта система, которая использовалась в течение многих лет, хорошо зарекомендовала себя благодаря своей простоте и до сих пор эффективно используется. Однако в настоящее время можно получить некоторые дополнительные возможности, специфичные для приложения, через API возможностей Linux, без необходимости рут прав, кроме вышеперечисленного система.
Объяснение модели возможностей Linux!
Вы можете найти наиболее полную реализацию возможностей API в ядре Linux. Современные дистрибутивы Linux также стараются максимально использовать эту новую модель в масштабах всей системы.
Например, чтобы приложение ping работало, оно должно иметь возможность открывать сокеты RAW, которые обычно зарезервированы только для пользователей root. В старых дистрибутивах Linux проблема заключается в том, чтобы дать приложению бит SUID, чтобы его могли использовать обычные пользователи. В этих версиях, когда вы удаляете бит SUID из приложения и пытаетесь запустить приложение от имени обычного пользователя, вы получаете следующую ошибку:
пинг 8.8.8.8
# Выход
ping: открытый сокет icmp: операция не разрешена
В то время как в современных дистрибутивах Linux приложение ping, вероятно, не имеет бита SUID:
ls -l /бен/пинг
# Выход
-rwxr-xr-x. 1 корень root 95232 25 июля 2021 г. /bin/ping
Тем не менее, вы можете успешно запустить приложение как обычный пользователь. Механизм, который делает это возможным, заключается в том, что приложение ping имеет специальную возможность CAP_NET_RAW.
Ознакомиться с дополнительными возможностями приложения вы можете с помощью получитькап команда следующим образом:
судо получитькап /bin/ping
# Выход
/bin/ping cap_net_raw=ep
Если команда getcap возвращает пустой ответ, вы можете вручную установить это значение с помощью:
судо установка cap_net_raw+ep /bin/пинг
Модель возможностей процесса
В реализации Linux возможности каждого процесса сгруппированы под тремя заголовками:
Возможности | Заявление |
разрешенный | В этом кластере есть список разрешенных дополнительных возможностей для соответствующего процесса. Предоставление разрешения не означает, что его можно активно использовать в это время. Здесь можно включить полномочия в набор действующих полномочий с помощью дополнительного действия. |
эффективный | Он показывает текущий активный список возможностей связанного процесса. С помощью вспомогательных функций, регулирующих систему навыков, можно отказаться от навыка или восстановить его. Однако в любом случае это можно сделать только среди тех, кто уже авторизован в разрешенной группе. |
наследуемый | Когда приложение запускает новый процесс, только что запущенный процесс отображает список возможностей, которые он унаследует из списка разрешенных. |
Список разрешенных, действующих и наследуемых возможностей для запуска процессов в любое время отображается в виде битовой маски на строках CapPrm, CapEff, и CapInh в файле /proc/
Например, попробуйте прочитать значения запущенного приложения оболочки из /proc/self/status файл:
кошка /процесс/себя/статус | шапка grep
# Выход
CapInh: 0000000000000000
CapPrm: 00000000000000000
КапЭфф: 00000000000000000
CapBnd: 000001ffffffffff
CapAmb: 00000000000000000
Модель возможностей файлов в Linux
Работа системы возможностей для файлов зависит от предварительного условия, позволяющего хранить эти свойства на уровне виртуальной файловой системы (VFS). Как и в модели процесса, возможности файлов делятся на три категории:
1. Разрешенный
Система определяет разрешенные возможности процесса при запуске соответствующего исполняемого файла в этом кластере.
2. Эффективный
В отличие от модели возможностей процесса, этот заголовок хранит только один бит: активен или неактивен. Если бит активен, возможности, определенные в разрешенном списке файла, автоматически переносится в список эффективных возможностей соответствующего процесса, когда этот файл запускается и процесс созданный. Если бит не активен, автоматическая передача разрешенных возможностей файла запущенному процессу не выполняется.
Однако, если код соответствующего приложения интегрирован с системой возможностей, он может активировать разрешения в разрешенном наборе файла с помощью системных вызовов. Основная цель такого поведения — гарантировать, что старые приложения, которые не включают возможности, специфичные для системы, код, разработка на уровне программного кода может работать с системой возможностей без необходимости в каком-либо исходном коде изменения.
Вы можете подумать, что лучше написанные приложения будут использовать возможности только тогда, когда это необходимо. Если бит активен, все возможности в списке разрешенных становятся активными при запуске приложения.
3. Наследуемый
Как и в модели процесса, запускается соответствующий файл и происходит процесс. Если после этого внутри процесса запускается другое приложение, оно включается в список разрешенных нового процесса. Подводя итог, он указывает список возможностей для наследования.
Роль возможностей в системе Linux
Когда вы запускаете определенный процесс как обычный пользователь, у вас нет никаких привилегий. В результате вы можете получить доступ только к тем разделам, которые система разрешает обычным пользователям. Основная причина этого заключается в усилении безопасности системы и реализации таких мер.
Предоставление всем пользователям доступа ко всем ресурсам может создать серьезную уязвимость в системе безопасности. Людям, которые используют систему в злонамеренных целях, будет очень легко использовать уязвимости системы. Возможности Linux пригодятся в таких вопросах. Вы можете легко усилить безопасность своих приложений с помощью возможностей API, поддерживаемых ядром.
Возможности Linux — это лишь одна из проблем, о которых нужно подумать, чтобы использовать очень мощные методы, такие как разделение прав пользователя root. разрешения, назначение различных разрешений непривилегированным пользователям и принятие различных мер предосторожности в отношении открытых портов в интернет-сервисах с Линукс серверы.
Улучшите безопасность своего Linux-сервера с помощью этих 7 шагов по укреплению безопасности
Читать дальше
Похожие темы
- линукс
- Программирование
- Ядро Linux
- Операционная система
Об авторе
Инженер и разработчик программного обеспечения, фанат математики и технологий. Ему всегда нравились компьютеры, математика и физика. Он разработал проекты игровых движков, а также машинное обучение, искусственные нейронные сети и библиотеки линейной алгебры. Кроме того, продолжает работать над машинным обучением и линейными матрицами.
Подпишитесь на нашу рассылку
Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!
Нажмите здесь, чтобы подписаться