Понимание возможностей системного программирования Linux

1
технологии 2.webp

Последнее обновление 03.01.2023 — Василий Иванов

Возможности позволяют оценивать некоторые важные системные привилегии в отдельном потоке, отличном от текущего процесса. Таким образом, вам не нужно запускать программу от имени пользователя root, чтобы получить доступ к определенным частям системы.

В качестве решения, вытекающего из потребностей, раздел 25 POSIX.1e посвящен этой проблеме. Разработка привилегий, определенных в этом разделе, и других была завершена выпуском ядра Linux версии 2.6.26. Вот все, что вам нужно знать о возможностях ядра Linux.

Понимание логики Capabilities API

Контроль авторизации в Unix-системах состоит из двух шагов:

  • Если текущий владелец (действующий идентификатор пользователя, EUID) работающего приложения равен нулю, то система не проверяет авторизацию
  • Если значение EUID отлично от нуля, система выполняет процесс контроля в соответствии с полномочиями действующего пользователя и группы соответствующего приложения.
По теме:  6 лучших тем Visual Studio, которые вы должны попробовать

Некоторые приложения должны иметь более широкие привилегии (SUID, биты SGIT) во время работы. В качестве наиболее типичного примера можно привести приложение passwd. При этом пользователи в системе могут менять свои пароли. Однако для записи в файл /etc/shadow, где хранятся зашифрованные пароли, необходимо работать с правами пользователя root (т.е. ID пользователя = 0).

Для решения этой проблемы в приложении passwd есть бит SUID. Какой бы пользователь ни запускал это приложение, активным владельцем (EUID) всегда будет root:

ls -l /usr/bin/passwd

# Output
-rwsr-xr-x. 1 root root 32552 Jul 23 2021 /usr/bin/passwd

Возможность запуска приложений SUID в традиционной модели аутентификации Unix, похоже, решила проблему. Однако критические ошибки в приложениях с битами SUID открывают дверь для запуска нежелательных кодов для пользователей с полными правами в системе. Идеальное приложение должно работать без прав root, если это возможно.

Проблема не заканчивается только битом SUID. Вы также должны иметь права пользователя root, если хотите прослушивать привилегированный порт TCP или UDP меньше 1024 в системах на базе Unix. Например, чтобы иметь возможность прослушивать порт TCP 80 веб-сервера, вы должны запустить приложение от имени пользователя root.

По теме:  Сенсорный экран планшета не работает? 8 советов по устранению сенсорных проблем

За прошедшие годы стало понятно, насколько разрушительным может быть запуск программного обеспечения, предоставляющего услуги в сетевой среде, с полностью авторизованной учетной записью пользователя. В качестве временного решения было принято, что только определенная и меньшая часть программы слушает привилегированный порт от имени root, а затем меняет ID активного пользователя на другого пользователя для последующих процессов (например, пользователь Nobody с ограниченными правами) .

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

Объяснение модели возможностей Linux!

Вы можете найти наиболее полную реализацию возможностей API в ядре Linux. Современные дистрибутивы Linux также стараются максимально использовать эту новую модель в масштабах всей системы.

Например, чтобы приложение ping работало, оно должно иметь возможность открывать сокеты RAW, которые обычно зарезервированы только для пользователей root. В старых дистрибутивах Linux проблема заключается в том, чтобы дать приложению бит SUID, чтобы его могли использовать обычные пользователи. В этих версиях, когда вы удаляете бит SUID из приложения и пытаетесь запустить приложение от имени обычного пользователя, вы получаете следующую ошибку:

ping 8.8.8.8

# Output
ping: icmp open socket: Operation not permitted

В то время как в современных дистрибутивах Linux приложение ping, вероятно, не имеет бита SUID:

ls -l /bin/ping 

# Output
-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping

Тем не менее, вы можете успешно запустить приложение как обычный пользователь. Механизм, который делает это возможным, заключается в том, что приложение ping имеет специальную возможность CAP_NET_RAW.

Узнать дополнительные возможности приложения с помощью команды getcap можно следующим образом:

sudo getcap /bin/ping

# Output
/bin/ping cap_net_raw=ep

Если команда getcap возвращает пустой ответ, вы можете вручную установить это значение с помощью:

sudo setcap cap_net_raw+ep /bin/ping

Модель возможностей процесса

В реализации Linux возможности каждого процесса сгруппированы под тремя заголовками:

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

Список разрешенных, эффективных и наследуемых возможностей для запуска процессов в любое время отображается в виде битовой маски в строках CapPrm, CapEff и CapInh в файле /proc//status. Кроме того, строка CapBnd содержит битовую маску, используемую в операции контроля границ возможностей.

Например, попробуйте прочитать значения запущенного приложения оболочки из файла /proc/self/status:

cat /proc/self/status | grep Cap

# Output
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Модель возможностей файлов в Linux

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

1. Разрешено

Система определяет разрешенные возможности процесса при запуске соответствующего исполняемого файла в этом кластере.

2. Эффективный

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

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

Вы можете подумать, что лучше написанные приложения будут использовать возможности только тогда, когда это необходимо. Если бит активен, все возможности в списке разрешенных становятся активными при запуске приложения.

3. Наследуемый

Как и в модели процесса, запускается соответствующий файл и происходит процесс. Если после этого внутри процесса запускается другое приложение, оно включается в список разрешенных нового процесса. Подводя итог, он указывает список возможностей для наследования.

Роль возможностей в системе Linux

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

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

Возможности Linux — это лишь одна из проблем, о которых необходимо подумать, чтобы использовать очень мощные методы, такие как разделение разрешений пользователя root, назначение различных разрешений непривилегированным пользователям и принятие различных мер предосторожности в отношении открытых портов в интернет-сервисах с серверами Linux.