SUID, SGID и Sticky Bit в Linux — права доступа, которые незаметно управляют привилегиями
Это перевод оригинальной статьи SUID, SGID, and Sticky Bit in Linux — The Permissions That Quietly Control Power.
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
На первый взгляд, права доступа в Linux кажутся простыми — чтение, запись, выполнение. Большинство инженеров на этом останавливаются.
Но в реальных production-системах Linux всё держится на более глубоком уровне доверия: кем процесс является на самом деле, к какой группе он принадлежит и кто имеет право удалять файлы в общих средах.
Вот тут-то и пригодятся SUID, SGID и Sticky Bit.
Эти специальные биты разрешений — не академические понятия. Они активно используются каждый день в реальных системах — sudo от них зависит, общие директории CI/CD зависят от них, и /tmp без них был бы катастрофой с точки зрения безопасности. Неправильное их использование открывает путь к повышению привилегий. Правильное их использование позволяет получить контролируемый доступ без хаоса.
В этой статье мы выйдем за рамки определений и рассмотрим практические примеры из реальной жизни, демонстрирующие, как эти разрешения работают в действующих системах, зачем они существуют и как администраторы реально используют их в продакшене.
Права доступа в Linux обманчиво просты. Все изучают rwx. Все думают, что понимают их.
А потом однажды обычный пользователь запускает команду sudo apt update, и внезапно из ниоткуда появляются процессы, принадлежащие root.
Начнем с того, что вы уже знаете.
Права доступа в Linux обычно выглядят следующим образом:
rwx
Это отвечает только на один вопрос.
«Может ли этот пользователь читать, записывать или выполнять этот файл?»
Большинство людей на этом останавливаются.
А теперь самое удивительное
Вы входите в систему как обычный пользователь (не root) и выполняете следующую команду:
sudo apt update
Внезапно, проверив запущенные процессы, вы видите:
Ваш мозг вполне резонно задаёт вопрос:
«Подождите… У меня нет прав root. Я не переключался на права root. Как же запустился процесс с правами root?»
Что происходит на самом деле (никакой магии)?
Главная идея заключается в следующем.
Linux неважно, кто вы. Ему важно, кем может стать программа.
/usr/bin/sudo
У этого файла есть специальный бит прав доступа, называемый SUID.
Что на самом деле означает SUID (в одном предложении)
При запуске этот файл выполняется от имени своего владельца, а не от имени пользователя, который его запустил.
root
Последовательность действий следующая:
Вы так и не стали root-пользователем.
Программа позаимствовала идентификатор root.
Почему это необходимо (иначе Linux сломается)
- Пользователи не могли менять пароли.
- Пользователи не могли устанавливать пакеты.
- Пользователи не могли подключать устройства.
Приходилось бы входить в систему как root для каждой операции.
«Выполнить одно привилегированное действие, а затем остановиться».
А у SUID есть братья — SGID и Sticky Bit — которые незаметно решают:
3️⃣ «Кому разрешено удалять файлы» → Sticky Bit
Представьте себе /tmp без правил:
«Здесь можно создавать файлы, но удалять можно только свои собственные».
Поэтому /tmp и не превращается в зону боевых действий.
Один образ для запоминания (это закрепляет понимание)
Представьте Linux как рабочее место:
- rwx → доступ к двери
- SUID → временный бейдж начальника
- SGID → правила владения командой
- Sticky Bit → «не трогай чужие вещи»
Эти три параметра прав доступа старые, обладают мощными возможностями и до сих пор часто неправильно понимаются. В этой статье они объясняются с точки зрения реального системного администратора, а не на основе теоретических знаний из учебников.
Проще говоря:
права доступа в Linux кажутся простыми, пока вы не заметите, что программы могут временно стать более влиятельными, чем пользователь, запускающий их.
Это происходит потому, что некоторым программам разрешено запускаться от имени своего владельца (SUID), некоторые каталоги принудительно устанавливают совместное владение (SGID), а некоторые общие пространства запрещают пользователям удалять файлы друг друга (Sticky Bit).
Поиск всех SUID-бинарников (базовая проверка безопасности)
На любом сервере — особенно в production — это обязательно:
find / -perm -u=s -type f
Эта команда отвечает на вопрос:
«Какие бинарные файлы могут выдавать себя за своего владельца?»
- неожиданные пользовательские бинарные файлы
- файлы внутри каталогов с правами на запись
- скрипты (огромный тревожный сигнал)
Вы немедленно останавливаетесь и проводите расследование.
Установка и удаление SUID (механика)
chmod u+s filename
chmod u-s filename
ls -l filename
Вы увидите s там, где обычно стоит x.
s vs S: Тонкое, но опасное различие
Это часто происходит случайно во время изменения прав доступа и приводит к скрытому повышению привилегий.
Практический пример использования SUID (реальное, наблюдаемое поведение)
Сценарий
Вам нужны доказательства того, что обычный пользователь может запускать процессы, принадлежащие root, не получая при этом root-прав.
Шаг 1: Войдите в систему как пользователь без прав root.
su - admin
Шаг 2: Выполните команду с правами привилегированного доступа.
sudo apt update
Шаг 3: Наблюдайте за происходящим с другого терминала (root или ec2-user).
ps -ef | grep sudo
Что вы увидите
Администратор так и не получил права root. Это произошло в процессе.
Риски из реальной жизни: почему никогда не следует устанавливать SUID бездумно.
Это один из самых быстрых способов скомпрометировать систему.
- изменить бинарный файл
- повлиять на переменные окружения
- контролировать входные данные, которые программа обрабатывает некорректно
Правило, используемое опытными администраторами:
Если вы не проводили аудит исходного кода, не устанавливайте SUID.
SGID (Set Group ID): совместная работа без хаоса
SGID похож на SUID, но работает на уровне группы.
Именно в каталогах SGID оказывается чрезвычайно полезным.
SGID в файлах (менее распространенный вариант)
Когда SGID задан для исполняемого файла:
Сегодня это встречается редко, но всё ещё используется в устаревших системах.
SGID в каталогах (в этом и заключается реальная ценность)
Когда для каталога установлен SGID:
- Любой файл, созданный внутри этого каталога, наследует группу этого каталога.
- Независимо от основной группы создателя.
Это решает классическую проблему Linux:
«Почему общие каталоги со временем постепенно перестают работать?»
Пример использования в реальном времени: общее рабочее пространство для инфраструктуры и разработки.
Проблема
- Команда инфраструктуры и команда разработки делят один каталог
- Файлы должны оставаться доступными для всех групп пользователей.
- Ручной
chgrpчреват ошибками.
Решение
Практический пример использования SGID (AWS EC2)
sudo mkdir /shared ls -ld /shared sudo chmod 777 /shared
Создайте пользователя-разработчика:
sudo useradd dev sudo passwd dev
Переключитесь на разработчика:
su - dev vim /shared/dev ls -l /shared
Исправьте это с помощью SGID
sudo chmod g+s /shared ls -ld /shared
Теперь проведите повторную проверку:
su - dev touch /shared/dev2 ls -l /shared
Результат
Именно так поддерживаются в порядке общие каталоги сборки, рабочие области CI и зоны выгрузки приложений.
Sticky Bit: Предотвращение случайного (или вредоносного) удаления
Sticky Bit контролирует, кто может удалять файлы, а не кто может их создавать.
При установке параметра на каталог:
- Пользователи могут удалять только свои собственные файлы.
- Даже если каталог доступен для записи всем пользователям.
Пример использования в реальном времени: два разработчика, один каталог.
Цель
Практический пример использования Sticky Bit
mkdir /shared2 chmod g+w /shared2 groupadd dev chgrp dev /shared2
useradd -g dev dev1 useradd -g dev dev2 passwd dev1 passwd dev2
Без Sticky Bit
su - dev1 touch /shared2/dev1 su - dev2 rm /shared2/dev1
Включаем Sticky Bit
chmod o+t /shared2 ls -ld /shared2
Теперь проведите повторную проверку:
su - dev1 touch /shared2/dev1 su - dev2 rm /shared2/dev1
rm: cannot remove ‘/shared2/dev1’: Operation not permitted
Sticky Bit обеспечивает соблюдение границ владения.
t vs T (Снова тот же шаблон)
Для функционирования каталогов необходимы права на выполнение.
Как эти биты используются в реальных системах
- SUID → контролируемое повышение привилегий (
sudo,passwd) - SGID → общие рабочие пространства, каталоги CI/CD, данные приложений
- Sticky Bit →
/tmp, общие каталоги для загрузки, многопользовательские системы
- уменьшить административную нагрузку
- предотвратить разрастание прав
- обеспечивать безопасность без надзора
Итог (Правила для администраторов)
- Никогда не устанавливайте SUID бездумно.
- Для общих каталогов всегда используйте SGID.
- Для каталогов с доступом для записи всем пользователям всегда используйте Sticky Bit.
Linux не предупреждает вас о неправильном использовании этих элементов.
Он предполагает, что вы точно знаете, что делаете.
И теперь — вы действительно это делаете.
Рассмотрим еще один пример из реальной жизни:
- Пользователи должны иметь возможность менять свои собственные пароли.
- Но
/etc/shadowпринадлежитrootи недоступен для чтения или записи.
ls -l /etc/shadow
-rw------- 1 root root /etc/shadow
Как обычный пользователь может изменить свой пароль, если он не имеет доступа к /etc/shadow?Ответ: SUID включен на /usr/bin/passwd
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root /usr/bin/passwd
Обратите внимание на s в позиции выполнения для владельца.
Что на самом деле происходит под капотом?
3. Ядро запускает процесс от имени root.
5. Привилегии немедленно сбрасываются
Пользователь никогда не получает права root.
Программа временно заимствует права root.
Почему это идеальный пример SUID
- узко ограничено (только для смены пароля)
- ограниченно по времени
- Поверхность для злоупотребления минимизирована
Это правильное использование SUID.
Что пойдёт не так, если удалить SUID?
Попробуйте (для обучения, не используйте в рабочей среде):
chmod u-s /usr/bin/passwd
Теперь как обычный пользователь:
passwd
passwd: Permission denied
Пользователи лишаются возможности менять пароли.
Удобство использования системы мгновенно нарушается.
Почему администраторам важен этот пример?
Потому что это учит важному правилу.
SUID безопасен только тогда, когда бинарник тщательно написан, недоступен для записи и имеет строго ограниченную область действия.
Это мгновенная компрометация root.
Главный вывод в одной строке
sudo показывает, что SUID обеспечивает временную власть.passwd показывает, что SUID обеспечивает необходимую власть.
Оба существуют для того, чтобы пользователи могли работать, не получая «ключи от королевства».
Заключение
SUID, SGID и Sticky Bit — это небольшие флаги прав, обладающие огромным влиянием. Они незаметно определяют, когда обычный пользователь может выполнять привилегированную работу, как команды взаимодействуют, не нарушая владение файлами, и как общие каталоги остаются в безопасности в многопользовательских системах.
Опасность этих разрешений заключается не в их сложности, а в их тонкости. Linux не помешает вам установить их неправильно. Он предполагает, что вы понимаете последствия. Именно поэтому опытные администраторы относятся к SUID как к чему-то опасному, намеренно используют SGID для совместной работы и полагаются на Sticky Bit для обеспечения соблюдения границ владения.
Как только вы по-настоящему разберетесь в этих моментах, права доступа в Linux перестанут казаться произвольными. Вы начинаете видеть в них осознанные контракты доверия между пользователями, процессами и ядром. И в этот момент вы уже не просто используете Linux — вы управляете им.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.