Поиск по сайту:

Как использовать SUID, SGID и Sticky Bits в Linux


SUID, SGID и Sticky Bits — это мощные специальные разрешения, которые вы можете установить для исполняемых файлов и каталогов в Linux. Мы расскажем о преимуществах и потенциальных ловушках их использования.

Они уже используются

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

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

Повышение вашего статуса

Обычно команды и программы Linux запускаются с тем же набором разрешений, что и человек, запускающий программу. Когда root запускает команду passwd для смены пароля, она запускается с разрешениями root. Это означает, что команда passwd может свободно обращаться к сохраненным паролям в файле /etc/shadow.

Идеальной была бы схема, в которой любой пользователь системы мог бы запустить программу passwd, но при этом программа passwd сохраняла бы привилегированные права root. привилегии. Это позволит любому изменить свой собственный пароль.

Приведенный выше сценарий — это именно то, что делает бит Set User ID (SUID). Он запускает программы и команды с разрешениями владельца файла, а не с разрешениями человека, который запускает программу.

Вы повышаете статус программы

Однако есть еще одно затруднение. Человек должен быть защищен от вмешательства в чужой пароль. Linux включает схему SUID , которая позволяет запускать приложения с набором временно заимствованных разрешений, но это только половина истории безопасности.

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

Программы, которые запускаются с повышенными привилегиями, могут представлять угрозу безопасности, если они не созданы с мышлением «безопасность по замыслу». Это означает, что безопасность — это первое, на что вы обращаете внимание, а затем уже на этом основываетесь. Не пишите свою программу, а потом пытайтесь придать ей защитный слой.

Самым большим преимуществом программного обеспечения с открытым исходным кодом является то, что вы можете самостоятельно просмотреть исходный код или обратиться к проверенным экспертам. В исходном коде программы passwd есть проверки, поэтому вы можете видеть, является ли человек, запускающий программу, root. Различные возможности разрешены, если кто-то является root (или кто-то использует sudo).

Это код, который определяет, является ли кто-то пользователем root.

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

С основными командами и утилитами Linux вы можете быть уверены, что в них заложена безопасность, и что код многократно проверялся. Конечно, всегда есть угроза пока еще неизвестных эксплойтов. Тем не менее, исправления или обновления быстро появляются для устранения любых недавно обнаруженных уязвимостей.

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

Команды Linux, использующие SUID

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

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Обратите внимание, что имена файлов выделены красным, что указывает на установленный бит SUID.

Права доступа к файлу или каталогу обычно представлены тремя группами по три символа: rwx. Они означают чтение, запись и выполнение. Если буквы присутствуют, это разрешение было предоставлено. Однако если вместо буквы присутствует дефис (-), это разрешение не было дано.

Существует три группы этих разрешений (слева направо): для владельца файла, для членов группы файла и для остальных. Когда для файла установлен бит SUID, «s» представляет разрешение владельца на выполнение.

Если бит SUID установлен в файле, который не имеет исполняемых возможностей, это обозначается буквой «S» в верхнем регистре.

Мы рассмотрим пример. Обычный пользователь dave вводит команду passwd:

passwd

Команда passwd запрашивает у dave его новый пароль. Мы можем использовать команду ps, чтобы увидеть подробности запущенных процессов.

Мы будем использовать ps с grep в другом окне терминала и искать процесс passwd. Мы также будем использовать параметры -e (каждый процесс) и -f (полный формат) с ps.

Набираем следующую команду:

ps -e -f | grep passwd

Сообщается о двух строках, вторая из которых — это процесс grep, который ищет команды со строкой «passwd» в них. Однако нас интересует первая строка, потому что она предназначена для запущенного процесса passwd dave.

Мы видим, что процесс passwd работает так же, как если бы его запустил root.

Установка бита SUID

Бит SUID легко изменить с помощью chmod. Символический режим u+s устанавливает бит SUID, а символьный режим u-s очищает бит SUID.

Чтобы проиллюстрировать некоторые концепции бита SUID, мы создали небольшую программу под названием htg. Он находится в корневом каталоге пользователя dave, и для него не установлен бит SUID. Когда он выполняется, он отображает реальные и эффективные идентификаторы пользователей (UID).

Настоящий UID принадлежит тому, кто запустил программу. Действующий идентификатор — это учетная запись, под которой программа ведет себя так, как если бы она была запущена.

Набираем следующее:

ls -lh htg
./htg

Когда мы запускаем локальную копию программы, мы видим, что реальный и эффективный идентификаторы имеют значение dave. Итак, он ведет себя так же, как и обычная программа.

Давайте скопируем его в каталог /usr/local/bin, чтобы им могли пользоваться другие.

Мы вводим следующее, используя chmod для установки бита SUID, а затем проверяем, установлен ли он:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

Итак, программа скопирована, и установлен бит SUID. Мы запустим его снова, но на этот раз мы запустим копию в папке /usr/local/bin:

htg

Несмотря на то, что dave запустил программу, эффективный идентификатор установлен для пользователя root. Итак, если mary запускает программу, происходит то же самое, как показано ниже:

htg

Настоящий идентификатор — mary, а эффективный идентификатор — root. Программа работает с правами root-пользователя.

Бит SGID

Бит Set Group ID (SGID) очень похож на бит SUID. Когда бит SGID установлен в исполняемом файле, действующая группа устанавливается в группу файла. Процесс запускается с разрешениями членов группы файла, а не с разрешениями человека, который его запустил.

Мы изменили нашу программу htg, чтобы она также показывала эффективную группу. Мы изменим группу программы htg на группу пользователя mary по умолчанию, mary. Мы также будем использовать символические режимы u-s и g+s с chown , чтобы удалить бит SUID и установить SGID.

Для этого набираем следующее:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

Вы можете увидеть бит SGID, обозначенный буквой «s» в разрешениях группы. Также обратите внимание, что в качестве группы выбрано mary и имя файла теперь выделено желтым цветом.

Прежде чем запустить программу, давайте установим, к каким группам принадлежат dave и mary. Мы будем использовать команду id с опцией -G (группы), чтобы распечатать все идентификаторы групп. Затем мы запустим программу htg от имени dave.

Набираем следующие команды:

id -G dave
id -G mary
htg

Идентификатор группы по умолчанию для mary – 1001, а действующая группа программы htg – 1001. Таким образом, несмотря на то, что она была запущена dave, он работает с разрешениями членов группы mary. Это то же самое, как если бы dave присоединился к группе mary.

Давайте применим бит SGID к каталогу. Сначала мы создадим каталог под названием «работа», а затем изменим его группу на «выродок». Затем мы установим бит SGID в каталоге.

Когда мы используем ls для проверки настроек каталога, мы также используем параметр -d (каталог), чтобы видеть сведения о каталоге, а не его содержимое. .

Набираем следующие команды:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

Бит SGID и группа «geek» установлены. Это повлияет на все элементы, созданные в каталоге work.

Мы вводим следующее, чтобы войти в каталог work, создаем каталог с именем «demo» и проверяем его свойства:

cd work
mkdir demo
ls -lh -d demo

Бит SGID и группа «geek» автоматически применяются к каталогу «demo».

Введите следующее, чтобы создать файл с помощью команды touch и проверить его свойства:

touch useful.sh
ls -lh useful.sh

Группа нового файла автоматически устанавливается на «выродок».

Липкий бит

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

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

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

Давайте создадим каталог под названием «общий». Мы будем использовать символьный режим o+t с chmod, чтобы установить липкий бит в этом каталоге. Затем мы рассмотрим разрешения для этого каталога, а также для каталогов /tmp и /var/tmp.

Набираем следующие команды:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

Если установлен липкий бит, исполняемый бит «другого» набора прав доступа к файлам устанавливается на «t». Имя файла также выделено синим цветом.

Папки /tmp и /var/tmp — это два примера каталогов, в которых установлены все права доступа к файлам для владельца, группы и других (поэтому они выделены зеленым цветом). Они используются как общие папки для временных файлов.

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

Напоминания

Ниже приведен краткий контрольный список того, что мы рассмотрели выше, для дальнейшего использования:

  • SUID работает только с файлами.
  • Вы можете применить SGID к каталогам и файлам.
  • Вы можете применить бит закрепления только к каталогам.
  • Если индикаторы «s», «g» или «t» отображаются в верхнем регистре, исполняемый бит ( x) не был установлен.