Linux разрешения для папок

Файловые разрешения в Linux

Всем привет. Мы активно вливаемся в работу и уже в январе готовим много мощных запусков. Среди прочих, объявлен набор на новый поток полюбившегося всем курса «Администратор Linux». В преддверии запуска традиционно делимся переводом полезного материала.

Файловые разрешения предлагают безопасную альтернативу исполняемым файлам SUID, но могут показаться немного запутанными на первый взгляд.

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

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

Разрешения отлично подходят для сервисов, которые обычно всегда запускаются от имени root-пользователя, но как насчет утилит командной строки? К счастью, это так же поддерживается при условии, что у вас установлены правильные утилиты. Если вы используете Ubuntu, вам, например, понадобится пакет libcap2-bin . Вам также нужно будет запустить не архаичное ядро (начиная с версии 2.6.24).

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

Первый шаг — выбрать нужные вам разрешения. Для этой статьи я предполагаю, что существует инструмент диагностики сети, называемый tracewalk , который должен уметь использовать необработанные сокеты. Обычно для этого требуется, чтобы приложение запускалось от имени root-пользователя, но при просмотре списка выясняется, что требуется только разрешение CAP_NET_RAW .

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

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

Или вы можете вывести список всех разрешений, установленных для данного исполняемого файла:

Для справки, вы также можете удалить все разрешения из исполняемого файла с помощью:

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

Итак, что означает этот странный суффикс =eip ? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — эффективные, наследуемые и доступные (effective, inheritable и permitted):

  • Эффективные (Effective) разрешения — это те, которые определяют, что процесс может на самом деле делать. Например, он не может иметь дело с необработанными сокетами, если CAP_NET_RAW не находится в эффективном наборе.
  • Доступные (Permitted) разрешения — это те, которые разрешено иметь процессу, если он запрашивает их с помощью соответствующего вызова. Они не позволяют процессу фактически что-либо делать, если только он не был специально написан для запроса указанного разрешения. Это позволяет писать процессы для добавления особо важных разрешений в эффективный набор только на тот период, когда они действительно требуются.
  • Наследуемые (Inheritable) разрешения — это те, которые могут быть унаследованы в доступном наборе порожденного дочернего процесса. Во время операции fork() или clone() дочернему процессу всегда дается копия разрешений родительского процесса, поскольку в этот момент он все еще выполняет тот же исполняемый файл. Наследуемый набор используется, когда exec() (или аналог) вызывается для замены исполняемого файла другим. На этом этапе доступный набор процесса маскируется наследуемым набором для получения доступного набора, который будет использоваться для нового процесса.
Читайте также:  Mac установка windows с внешнего диска

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

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

При указании разрешений через setcap три буквы e , i и p относятся к эффективному, наследуемому и доступному множествам соответственно. Итак, более ранняя спецификация:

… указывает, что разрешение CAP_NET_RAW должно быть добавлено к доступным и наследуемым наборам и что также должен быть установлен эффективный бит. Это заменит любые ранее установленные разрешения в файле. Чтобы установить сразу несколько разрешений, используйте список через запятую:

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

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

Во-вторых, они не работают с интерпретируемыми скриптами. Например, если у вас есть скрипт Python, которому вы хотите назначить разрешение, вы должны назначить его самому интерпретатору Python. Очевидно, что это потенциальная проблема безопасности, потому что тогда все скрипты, выполняемые с этим интерпретатором, будут иметь указанное разрешение, хотя это все же значительно лучше, чем сделать SUID. Наиболее распространенный обходной путь, по-видимому, заключается в написании отдельного исполняемого файла на C или аналоге, который может выполнять необходимые операции и вызывать его из скрипта. Это похоже на подход, используемый Wireshark, который использует двоичный файл /usr/bin/dumpcap для выполнения привилегированных операций:

В-третьих, файловые разрешения отключаются, если вы используете переменную среды LD_LIBRARY_PATH по понятным причинам безопасности(1). То же самое относится и к LD_PRELOAD , насколько я знаю.

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

На этом все. Подробно о программе курса, можно будет узнать на вебинаре, который пройдет 24 января.

Источник

Понимание прав доступа к файлам в Linux

Understanding Linux File Permissions

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

Права доступа к файлам в Linux

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

  • Владелец файла.
  • Члены группы.
  • Другие (все остальные).
Читайте также:  Download windows 64bit iso

Собственности файла можно изменить с помощью chown и chgrp команды.

К каждому классу пользователей применяются три типа прав доступа к файлам:

  • Разрешение на чтение.
  • Разрешение на запись.
  • Разрешение на выполнение.

Эта концепция позволяет вам контролировать, какие пользователи могут читать файл, записывать в файл или выполнять файл.

Чтобы просмотреть права доступа к файлу, используйте ls команду:

Первый символ указывает тип файла. Это может быть обычный файл ( — ), каталог ( d ), символическая ссылка ( l ) или другие специальные типы файлов. Следующие девять символов представляют права доступа к файлу, три тройки по три символа каждая. Первый триплет показывает разрешения владельца, второй — разрешения группы, а последний триплет — разрешения для всех остальных.

В приведенном выше примере ( rw-r—r— ) означает, что владелец файла имеет права на чтение и запись ( rw- ), а группа и другие пользователи имеют только права на чтение ( r— ).

Права доступа к файлам имеют разное значение в зависимости от типа файла.

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

Влияние разрешений на файлы

Разрешение Метка Значение в файле
Чтение
Read
Файл не читается. Вы не можете просматривать содержимое файла.
r Файл доступен для чтения.
Запись
Write
Файл не может быть изменен или изменен.
w Файл можно изменить или модифицировать.
Выполнение
Execute
Файл не может быть выполнен.
x Файл можно запустить.
s Если он находится в user триплете, он устанавливает setuid бит. Если он находится в group триплете, он устанавливает setgid бит. Это также означает, что x флаг установлен.
Когда для исполняемого файла установлены флаги setuid или setgid , файл выполняется с правами владельца и / или группы.
S То же s , но x флаг не установлен. Этот флаг редко используется для файлов.
t Если он находится в others триплете, он устанавливает sticky бит.
Это также означает, что x флаг установлен. Этот флаг бесполезен для файлов.
T То же, t но x флаг не установлен. Этот флаг бесполезен для файлов.

Влияние разрешений на каталоги (папки)

Каталоги — это особые типы файлов, которые могут содержать другие файлы и каталоги.

Разрешение Метка Значение в каталоге
Чтение
Read
Содержимое каталога не может быть отображено.
r Можно показать содержимое каталога.
(например, вы можете перечислить файлы внутри каталога с помощью ls .)
Запись
Write
Содержимое каталога не может быть изменено.
w Содержимое каталога может быть изменено.
(например, вы можете создавать новые файлы , удалять файлы и т. д.)
Выполнение
Execute
Каталог не может быть изменен на.
x По каталогу можно перемещаться с помощью cd .
s Если он находится в user триплете, он устанавливает setuid бит. Если он находится в group триплете, он устанавливает setgid бит. Это также означает, что x флаг установлен. Когда setgid для каталога установлен флаг, новые файлы, созданные в нем, наследуют идентификатор группы каталогов (GID) вместо идентификатора основной группы пользователя, создавшего файл.
setuid не влияет на каталоги.
S То же s , но x флаг не установлен. Этот флаг бесполезен для каталогов.
t Если он находится в others триплете, он устанавливает sticky бит.
Это также означает, что x флаг установлен. Когда для каталога установлен бит закрепления, только владелец файла, владелец каталога или административный пользователь могут удалять или переименовывать файлы в каталоге.
T То же t , но x флаг не установлен. Этот флаг бесполезен для каталогов.

Изменение прав доступа к файлу

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

Разрешения можно указать с помощью символьного режима, числового режима или справочного файла.

Символьный (текстовый) метод

Синтаксис chmod команды при использовании символьного режима имеет следующий формат:

Первый набор flags ( [ugoa…] ), флаги пользователей, определяет классы пользователей, для которых изменяются права доступа к файлу.

  • u — Владелец файла.
  • g — Пользователи, входящие в группу.
  • o — Все остальные пользователи.
  • a — Все пользователи, идентичные ugo .

Когда флаг пользователя опущен, по умолчанию используется a .

Второй набор flags ( [-+=] ), флаги операции, определяет, следует ли удалить, добавить или установить разрешения:

  • — — Удаляет указанные разрешения.
  • + — Добавляет указанные разрешения.
  • = — Изменяет текущие разрешения на указанные разрешения. Если после = символа не указаны разрешения, все разрешения указанного класса пользователей удаляются.

Разрешения ( perms. ) явно устанавливается с помощью либо ноль , либо один или несколько из следующих букв: r , w , x , X , s , и t . Используйте одну букву из набора u , g и o при копировании разрешений из одного класса пользователей в другой.

При настройке разрешений для более чем одного пользовательского класса ( [,…] ) используйте запятые (без пробелов) для разделения символьных режимов.

Вот несколько примеров того, как использовать chmod команду в символьном режиме:

Дайте членам группы разрешение на выполнение файла, но не на чтение и запись в него:

Удалите разрешение на запись для всех пользователей:

Отвратительно удалите разрешение на выполнение для других пользователей:

Удалите права на чтение, запись и выполнение для всех пользователей, кроме владельца файла:

То же самое можно сделать с помощью следующей формы:

Предоставьте права на чтение, запись и выполнение владельцу файла, права на чтение для группы файла и запретите права всем другим пользователям:

Числовой метод

Синтаксис команды chmod при использовании символьного режима имеет следующий формат:

При использовании числового режима вы можете установить разрешения для всех трех классов пользователей (владельца, группы и всех остальных) одновременно.

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

Каждое разрешение на запись, чтение и выполнение имеет следующее числовое значение:

  • r (читать) = 4
  • w (написать) = 2
  • x (выполнить) = 1
  • нет разрешений = 0

Количество разрешений определенного класса пользователей представлено суммой значений разрешений для этой группы.

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

  • Владелец: rwx = 4 + 2 + 1 = 7
  • Группа: rx = 4 + 0 + 1 = 5
  • Другое: rx = 4 + 0 + 0 = 4

Используя описанный выше метод, мы подходим к числу 754 , которое представляет желаемые разрешения.

Для того, чтобы настроить setuid , setgid и sticky bit флаги, используйте номер четыре цифры.

Когда используется четырехзначный номер, первая цифра имеет следующее значение:

  • setuid = 4
  • setgid = 2
  • липкий = 1
  • без изменений = 0

Следующие три цифры имеют то же значение, что и при использовании трехзначного номера.

Если первая цифра равна 0, ее можно не указывать, а режим можно представить тремя цифрами. Числовой режим 0755 такой же, как 755 .

Для вычисления числового режима вы также можете использовать другой метод (двоичный метод), но он немного сложнее. Знания, как рассчитать числовой режим с использованием 4, 2 и 1, достаточно для большинства пользователей.

Вы можете проверить права доступа к файлу в числовом формате с помощью stat команды:

Вот несколько примеров того, как использовать chmod команду в числовом режиме:

Предоставьте владельцу файла разрешения на чтение и запись и только на чтение членам группы и всем остальным пользователям:

Предоставьте владельцу файла права на чтение, запись и выполнение, права на чтение и выполнение для членов группы и никаких разрешений для всех остальных пользователей:

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

Рекурсивно установить разрешения на чтение, запись и выполнение для владельца файла и отсутствие разрешений для всех других пользователей в данном каталоге:

Заключение

В Linux доступ к файлам ограничен разрешениями, атрибутами и правами собственности на файлы. Чтобы изменить права доступа к файлу, используйте chmod команду.

Источник

Читайте также:  Windows ios safari debug
Оцените статью