SUID бит и SGID бит определяют права доступа, если они установлены непривилегированный пользователь может запускать скрипты от имени root.
SUID бит и SGID — наследование процессом прав доступа на файл
Биты SUID и SGI используются довольно редко, в отдельных случаях. Прежде чем перейти к ним рассмотрим как задются права доступа в Linux в системах в целом.
Права доступа в Linux
В Linux права доступа к файлам задаются для владельца, группы владельца и всех остальных.
Для файлов по умолчанию права 644, для каталогов 755. Первая цифра характеризует права для владельца, вторая права для группы владельца, третья для всех остальных пользователей.
Каждая цифра — сумма из трех значений:
4 — право на чтение
2 — право на запись
1 — право на исполнение (для каталогов это также право на открытие каталога).
ls -alh test.sh
-rw-r—r— 1 root root 32 May 25 19:22 test.sh
6 на скрипт test.sh даёт владельцу файла право читать файл и редактировать его, 4 даёт право группе владельца и всем остальным право на чтение файла. Исполняемым он по умолчанию не является, поэтому единицы нигде нет.
SUID и SGID
SUID — set user ID — бит, который позволит выполнять скрипты другого пользователя с его правами.
SGID — set group ID — бит, который позволит выполнять скрипты другого пользователя входящего в определенную группу с правами пользователя этой группы.
Устанавливаются биты соответственно следующим образом:
SUID для пользователя
chmod u+s test.sh
или
chmod 4755 test.sh
Процесс при запуске будет наследовать права владельца файла. Если test.sh принадлежит root, при этом есть права на исполнение пользователем test (755), скрипт будет выполняться с правами root, а не с правами пользователя, который фактически его выполняет.
На скриншоте пример:
Здесь для добавленного пользователем root простейшего shell скрипта устанавливаем suid бит. Владелец и группа владельца остаются root.
После этого переключаемся на системного пользователя www-data и будучи им выполняем скрипт принадлежащий суперпользователю.
Процесс (в примере он очень простой) унаследует права владельца файла.
Самый близкий к практике пример — бинарный файл /usr/bin/sudo.
На него по умолчанию выставлен suid бит. За счёт него любой пользователь в группе sudo может выполнять команды с правами суперпользователя.
При этом для запуска не требуется sudo.
SGID бит для группы
chmod g+s test.sh
или
chmod 2755 test.sh
Аналогичным образом будут наследоваться права группы пользователя, заданной для файла (755).
Запускать скрипты без sudo в некоторых случаях может быть удобно, для этого устанавливаются suid/sgid.
Если установить suid/sgid для каталога — создаваемые в нем скрипты будут выполняться с учетом специальных битов и описанной выше логики.
Читайте про такой способ ограничения доступа к файлам как chattr.