Gymterview
middle

Что такое специальные биты: sticky bit, SUID, SGID?

Специальные биты — это дополнительные флаги прав доступа в Unix/Linux (SUID, SGID, sticky bit), которые управляют не чтением/записью, а поведением при запуске программ и удалении файлов. Они дополняют стандартную модель rwx для сценариев, где обычных прав недостаточно.

Аналогия: если права rwx — это ключи от разных дверей, то специальные биты — это правила вроде «войдя в эту комнату, вы временно получаете полномочия директора» (SUID) или «выбросить мусор из общей корзины может только тот, кто его туда положил» (sticky bit).

SUID (Set User ID, 4xxx)

Когда SUID установлен на исполняемый файл, программа запускается с правами владельца файла, а не с правами того, кто её запустил. Это позволяет непривилегированным пользователям выполнять действия, требующие повышенных прав, — но только через конкретную программу.

Пример
# Классический пример: команда passwd
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# 's' вместо 'x' в позиции владельца — SUID бит

# Установить SUID
chmod u+s program
chmod 4755 program

# Удалить SUID
chmod u-s program

Пользователь может менять свой пароль через passwd, которая пишет в /etc/shadow (доступный только root), именно потому, что SUID запускает её от имени root.

SGID (Set Group ID, 2xxx)

SGID работает по-разному для файлов и директорий:

  • Для исполняемых файлов: программа запускается с правами группы-владельца файла (аналогично SUID, но для группы).
  • Для директорий: новые файлы, созданные внутри, наследуют группу директории, а не основную группу создающего пользователя. Это критически важно для совместной работы команды.
Пример
# Установить SGID на директорию (полезно для совместных проектов)
chmod g+s shared_dir/
chmod 2775 shared_dir/

# Теперь все файлы внутри будут принадлежать группе shared_dir,
# независимо от того, кто их создал

Sticky bit (1xxx)

Sticky bit применяется к директориям: файлы в такой директории может удалять или переименовывать только их владелец, владелец директории или root — даже если у других пользователей есть права на запись в эту директорию.

Пример
# Классический пример — /tmp
ls -ld /tmp
# drwxrwxrwt 15 root root ... /tmp
# 't' в конце — sticky bit

# Установить sticky bit
chmod +t directory/
chmod 1777 directory/

Сводная таблица

Бит Числовое значение На исполняемом файле На директории
SUID 4000 Запуск от имени владельца файла Не используется
SGID 2000 Запуск от имени группы файла Новые файлы наследуют группу директории
Sticky 1000 Не используется в Linux Удалять файл может только его владелец

Поиск файлов со специальными битами

Файлы с SUID — потенциальная угроза безопасности. Периодический аудит таких файлов — обязательная практика:

Пример
find / -perm -4000 -type f 2>/dev/null   # Файлы с SUID
find / -perm -2000 -type f 2>/dev/null   # Файлы с SGID
find / -perm -1000 -type d 2>/dev/null   # Директории со sticky bit

Обозначение в ls -l

Символ Позиция Значение
s (маленькая) Позиция x у владельца SUID установлен, файл исполняемый
S (большая) Позиция x у владельца SUID установлен, файл НЕ исполняемый (ошибка конфигурации)
s / S Позиция x у группы SGID (аналогично)
t (маленькая) Позиция x у остальных Sticky bit, директория исполняемая
T (большая) Позиция x у остальных Sticky bit, директория НЕ исполняемая

На собеседовании: покажите знание всех трёх битов на конкретных примерах: SUID — passwd, sticky bit — /tmp, SGID — общая директория проекта. Частый дополнительный вопрос: «чем отличается s от S в выводе ls -l?» — большая S означает, что бит установлен, но execute-право отсутствует, что обычно является ошибкой.