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() (или аналог) вызывается для замены исполняемого файла другим. На этом этапе доступный набор процесса маскируется наследуемым набором для получения доступного набора, который будет использоваться для нового процесса.
Читайте также:  Write to ext4 from 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

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

Читайте также:  Samsung notes для windows как установить

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

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

Изначально каждый файл имел три параметра доступа. Вот они:

  • Чтение — разрешает получать содержимое файла, но на запись нет. Для каталога позволяет получить список файлов и каталогов, расположенных в нем;
  • Запись — разрешает записывать новые данные в файл или изменять существующие, а также позволяет создавать и изменять файлы и каталоги;
  • Выполнение — вы не можете выполнить программу, если у нее нет флага выполнения. Этот атрибут устанавливается для всех программ и скриптов, именно с помощью него система может понять, что этот файл нужно запускать как программу.

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

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

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

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

Специальные права доступа к файлам в Linux

Для того, чтобы позволить обычным пользователям выполнять программы от имени суперпользователя без знания его пароля была придумана такая вещь, как SUID и SGID биты. Рассмотрим эти полномочия подробнее.

  • SUID — если этот бит установлен, то при выполнении программы, id пользователя, от которого она запущена заменяется на id владельца файла. Фактически, это позволяет обычным пользователям запускать программы от имени суперпользователя;
  • SGID — этот флаг работает аналогичным образом, только разница в том, что пользователь считается членом группы, с которой связан файл, а не групп, к которым он действительно принадлежит. Если SGID флаг установлен на каталог, все файлы, созданные в нем, будут связаны с группой каталога, а не пользователя. Такое поведение используется для организации общих папок;
  • Sticky-bit — этот бит тоже используется для создания общих папок. Если он установлен, то пользователи могут только создавать, читать и выполнять файлы, но не могут удалять файлы, принадлежащие другим пользователям.

Теперь давайте рассмотрим как посмотреть и изменить права на файлы в Linux.

Как посмотреть права доступа к файлам в Linux

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

Читайте также:  Devops linux cybersecurity что это

Чтобы узнать права на файл linux выполните такую команду, в папке где находится этот файл:

За права файлов в linux тут отвечают черточки. Первая это тип файла, который рассмотрен в отдельной статье. Дальше же идут группы прав сначала для владельца, для группы и для всех остальных. Всего девять черточек на права и одна на тип.

Рассмотрим подробнее, что значат условные значения флагов прав:

  • — нет прав, совсем;
  • —x — разрешено только выполнение файла, как программы но не изменение и не чтение;
  • -w- — разрешена только запись и изменение файла;
  • -wx — разрешено изменение и выполнение, но в случае с каталогом, вы не можете посмотреть его содержимое;
  • r— — права только на чтение;
  • r-x — только чтение и выполнение, без права на запись;
  • rw- — права на чтение и запись, но без выполнения;
  • rwx — все права;
  • —s — установлен SUID или SGID бит, первый отображается в поле для владельца, второй для группы;
  • —t — установлен sticky-bit, а значит пользователи не могут удалить этот файл.

В нашем примере, файл test1 имеет типичные разрешения для программ, владелец может все, группа только чтение и выполнение, а все остальные — только выполнение. Для test2 дополнительно установлен флаг SUID и SGID. А для папки test3 установлен Sticky-bit. Файл test4 доступный всем. Теперь вы знаете как посмотреть права на файл linux.

Как изменить права файла в Linux

Чтобы изменить права на файл в linux вы можете использовать утилиту chmod. Она позволяет менять все флаги, включая специальные. Рассмотрим ее синтаксис:

$ chmod опции категория действие флаг файл

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

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

  • u — владелец файла;
  • g — группа файла;
  • o — другие пользователи.

Действие может быть одно из двух, либо добавить — знак «+», либо убрать — знак — «-«. Что касается самих прав доступа, то они аналогичны выводу утилиты ls: r — чтение, w — запись, x — выполнение, s — suid/sgid, в зависимости от категории, для которой вы его устанавливаете, t — устанавливает sticky-bit. Например, всем пользователям полный доступ к файлу test5:

chmod ugo+rwx test5

Или заберем все права у группы и остальных пользователей:

chmod go-rwx test5

Дадим группе право на чтение и выполнение:

chmod g+rx test5

Остальным пользователям только чтение:

Для файла test6 установим SUID:

А для test7 — SGID:

Посмотрим что получилось:

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

Выводы

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

На завершение хочу предложить неплохое видео про права доступа в Linux:

Источник

Оцените статью