Права доступа и файловые флаги

Как и в любой многопользовательской системе, в операционных системах Unix, есть механизм управления доступом пользователей к тем или иным ресурсам системы ( процессорное время, память, файлы, директории и прочее ). Основными участниками данного механизма являются: Пользователь ( user ), Группа ( group ), Другие ( Other ), основными правами доступа в Unix, являются:
  • права доступа на чтение;
  • права доступа на запись;
  • права доступа на выполнение;
Соответственно, в Unix, права доступа и участники, сгруппированы три по три, read/write/execution для user/group/other. Кроме вышеупомянутых прав доступа, операционные системы Unix, поддерживает "файловые флаги", для обеспечения дополнительного уровня защиты, контроля и управления объектами системы. Например, с помощью флагов, можно запретить удаление файла, даже пользователю root. Вообще, правильней говорить не о правах пользователей, на тот или иной файл/директорию, а о правах процессов, так как все манипуляции с файлами ( создание, чтение, изменение, удаление ), производятся с помощью какой-то программы, например текстового редактора, который в запущенном виде, собственно и является процессом. Каждому пользователю системы, присваиваются идентификаторы, UserID ( идентификатор пользователя ) и GroupID ( идентификатор группы ), именно по ним операционная система определяет владельца и группу для того или иного объекта системы. Символические имена назначаются исключительно для удобства чтения, пользователями. Каждый процесс в операционной системе Unix, имеет не два, а четыре идентификатора, это, реальный UserID ( UID ) и эффективный UserID ( UID ) а так-же реальный и эффективный идентификатор группы GroupID ( GID ). Реальный UserID ( Реальный GroupID ) - реальные номера применяются для учета использования системных ресурсов. Эффективный UserID ( Эффективный GroupID ) - новый идентификатор, полученный процессом уже во время выполнения, применяются для определения прав доступа. Процессы запущенные автоматически ( например при старте системы ), так-же получают UserID, какой именно, определяется запускающей программой ( cron, inetd и т.д. ), в обычных случаях, UserID наследуется от родительского процесса. Некоторые процессы - "родители", могут присваивать, дочернему процессу - "потомку", UserID, не совпадающий со своим. Иногда, запущенный процесс, может во время выполнения, менять свои идентификаторы. Это происходит, когда в правах доступа на файл, установлены дополнительные биты, SUID ( Set user ID - бит смены идентификатора пользователя ) и SGID ( Set group ID - бит смены идентификатора группы ). Когда пользователь или процесс запускает файл, у которого установлен один из этих битов, процессу, временно присваиваются права владельца данного файла ( а не того, кто его запускает ). Таким образом, обычный пользователь, может выполнять команды от имени пользователя root. Как было упомянуто выше, права доступа к файлам и директориям, определяются по Реальному UserID и Реальному GroupID. Если идентификатор не меняется в процессе выполнения программы, Реальный UserID ( реальный GroupID ) и Эффективный UserID ( эффективный GroupID ) совпадают. Система обеспечения прав доступа в операционных системах Unix, имеет числовое и символическое, выражения. Числовае выглядит следующим образом:
Значение               Права доступа	                  В списке файлов каталога
 0 (000)            Ничего не разрешено	                                   ---
 1 (001)            Нельзя читать и писать, разрешено исполнять           --x
 2 (010)            Нельзя читать и исполнять, разрешено писать	   -w-
 3 (011)            Нельзя читать, разрешено писать и исполнять	   -wx
 4 (100)            Разрешено читать, нельзя писать и исполнять           r--
 5 (101)            Разрешено читать и исполнять, нельзя писать	   r-x
 6 (110)            Разрешено читать и писать, нельзя исполнять	   rw-
 7 (111)            Разрешено все                                         rwx
Плюс к этому, биты смены идентификаторов SUID и SGID, восьмеричные значения 4000 и 2000, как было сказано выше, они обеспечивают программам, доступ к файлам и процессам, к которым в обычных условиях, пользователь доступа не имеет. В случае установки бита SGID для директории, созданные в ней файлы, при запуске, будут принимать идентификатор группы каталога, а не группы в которую входит владелец файла. Существует еще один бит с восьмеричным значением 1000, так называемый Stiky-bit ( липучка ). Если данный бит установлен на директорию, содержащиеся в ней файлы, разрешено удалять и переименовывать, только в случае, если пользователь является, владельцем каталога, владельцем файла или это пользователь root. Символические выражения для установки прав доступа. В качестве аргументов команды chmod, вместо восьмеричных значений, используются буквенные эквиваленты.
Опция	      Буква	    Значение
кто	        u        Пользователь (User)
кто	        g        Группа (Group)
кто	        o        Другие (Other)
кто             a        Все (All, ''world'')
действие	+	 Добавление прав
действие	-        Удаление прав
действие	=        Явная установка прав
права           r        Чтение (Read)
права 	        w        Запись (Write)
права           x        Выполнение (Execute)
права           t        Sticky бит
права           s        SUID или SGID
Что-бы посмотреть права доступа и владельцев на файлы и директории в режиме листинга, можно использовать команду ls с флагом -l.
vds-admin /test# ls -l
total 2
  - rwx r-- r--  1 root  wheel    0 Jun 20 11:10 file.txt
  - rwx r-- r--  1 root  wheel    0 Jun 20 11:10 file.sh
  d rwx r-x r-x  2 root  wheel  512 Jun 20 11:10 test_dir
 \_/\_/ \_/ \_/    \__/  \___/
  1  2   3   4      5      6

1 - тип объекта
2 - права доступа для пользователя ( 744 )
3 - права доступа для группы ( 744 )
4 - права доступа для других ( 755 )
5 - владелец объекта
6 - группа владелец объекта

владелец   группа   другие
 r w x     r w x    r w x
 4-2-1     4-2-1    4-2-1

Таким макаром идет пересчет.
4+2+1 4+2+1 4+2+1
 7  =  7  =  7
В нашем случае:
( 4+2+1 ) + ( 4 ) + ( 4 ) = 744
( 4+2+1 ) + ( 4 ) + ( 4 ) = 744
( 4+2+1 ) + ( 4 + 1 ) + ( 4 + 1 ) = 755
В данном листинге видно, что владельцем всех файлов является пользователь root и группа wheel. Первый символ слева в колонке прав доступа, означает тип объекта, объекты могут быть следующих типов:
- Обычный файл. b Специальный файл блочного устройства. c Файл символьного устройства. d Директория. l Символьная ссылка. p FIFO. s Сокет. w Whiteout ( скрытый ).
В вышеприведенном примере: file.txt и file.sh - являются файлами, test_dir - директория. Начиная со второго бита, запись делится по 3 символа, для пользователя, для группы, для других, в нашем случае:
  • Файл file.txt, доступен на чтение и запись - пользователя, только для чтения - группой и для чтения - другим;
  • Файл file.sh, доступен на чтение, запись и выполнение - пользователем, только для чтения - группой, для чтения - другим;
  • test_dir, является директорией и имеет следующие права доступа, для пользователя: чтение, запись, выполнение; для группы: чтение, выполнение; для других: чтение, выполнение;
Если установлен бит SUID, то в секции 2 ( права доступа для пользователя ), вместо значения "х", будет стоять "s", если установлен бит SGID, так-же будет поставлен символ "s", но уже в секции 3 ( права доступа для группы ), ну и если установлен Styky-bit, в последней позиции, секции 4 ( права доступа для других ), будет установлен символ "t". В случае, если какой-либо из этих битов был установлен, и при этом не был установлен соответствующий бит выполнения, будут установлены символы "S" для SUID и SGID и "T" для Stiky-bit, что сигнализирует об ошибке и данные атрибуты будут проигнорированы. Не лишним будет заметить, что в операционных системах Unix, значения прав доступа для файлов и директорий, несколько различаются. Для файлов:
  • r ( Read ) - чтение. Соответствующий пользователь ( процесс ), имеет права на чтение содержимого данного файла, и копирования этого файла.
  • w ( Write ) - запись. Соответствующий пользователь ( процесс ), имеет права редактировать, изменять, удалять содержимое файла, добавлять в него что-либо ( например содержимое другого файла ). Однако, это не дает прав на удаление или переименование самого файла, это определяется правами доступа на директорию, в которой этот файл находится.
  • x ( eXecute ) - выполнение. Дает право, соответствующему пользователю ( процессу ), запускать данный файл, при условии что он является исполняемой программой или скриптом.
Для директорий:
  • r ( Read ) - чтение. Разрешает получение списка содержимого данной директории ( файлов, поддиректорий ), однако, это еще не означает, что можно получить доступ к содержимому данной директории, читать, изменять или запускать файлы, находящиеся в ней, даже при условии, что права на самих файлах это разрешают. Как правило, данный атрибут устанавливается совместно с правами доступа на запуск, "x" ( eXecute ).
  • w ( Write ) - запись. Атрибут, позволяющий менять содержимое директории, то есть, создавать в ней новые файлы, копировать в нее файлы из других директорий, переименовывать и удалять файлы.
  • x ( eXecute ) - выполнение. Данный атрибут, в контексте директории, означает, что соответствующий пользователь, может зайти в директорию, получив доступ к файлам и поддиректориям и выполнять с ними какие-либо действия, при условии что права на самих файлах, это позволяют.
Важно помнить, что система полностью проверяет путь до конкретной поддиректории или файла, на наличие прав доступа, к каждому участку данного пути, и если на кокой-либо участок пути, не установлен соответствующий бит прав доступа ( x ), пользователю будет отказано в доступе. Проще говоря, есть путь: /usr/home/vds-admin/public_html/, даже если пользователь имеет достаточные права на поддиректории public_html, но на вышестоящую директорию, home, бит x не установлен, при попытке зайти в поддиректорию, ему будет отказано в доступе.

Флаги файлов

Кроме вышеперечисленных атрибутов управления правами доступа к объектам, в операционных системах Unix, есть еще один, так сказать, более сильнодействующий инструмент - набор файловых флагов. Флаги файлов, работают глобально, влияя одинаково на всех пользователей, в том числе, на владельца файла и на пользователя root. Правда владелец файла, как и пользователь root, могут снять флаги и делать с файлом все что угодно, но это уже зависит от того, какой и кем был установлен флаг и на каком уровне безопасности работает система в данный момент. По правам доступа на установку, изменение, снятие, файловые флаги можно разделить на две категории.
  • Пользовательские - флаги доступные для изменения владельцу фала и пользователю root.
  • Суперпользовательские - флаги доступные для изменения, только пользователю root.
В операционных системах Unix, используются следующие флаги:

Суперпользовательские флаги

  • arch ( archived ) - архивный файл.( только пользователь root )
  • sappnd ( sappend ) - в данный файл можно только дописывать, то есть уже имеющуюся информацию изменить нельзя. Если флаг установлен на директорию, нельзя удалять или переименовывать файлы, но можно создавать или копировать ( только пользователь root )
  • schg ( schange, simmutable ) - неизменяемый файл, нельзя ни переименовывать, ни изменять, ни удалять. Если данный флаг установлен на директории, то вы не сможете добавлять или удалять файлы, но менять содержимое уже имеющихся, сможете.( только пользователь root )
  • sunlnk ( sunlink ) - файл не может быть переименован или удален. Содержимое изменить можно при соответствующих правах доступа. ( только пользователь root )

Пользовательские флаги

  • nodump - не включать данный файл в дамп. ( владелец файла и пользователь root )
  • uappnd ( uappend ) - то-же что и для пользователя root, плюс для владельца файла.
  • uchg ( uchange, uimmutable ) - то-же, что и для пользователя root, плюс для владельца файла.
  • uunlnk ( uunlink ) - то-же, что и для пользователя root, плюс для владельца файла.
Например, чтобы установить на файл флаг schg ( неизменяемый ), нужно выполнить следующую команду:
vds-admin /test# chflags schg test_file
Посмотреть установленные флаги можно командой ls c опциями -lo.
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  schg 0 Jun 21 07:33 test_file
Кроме того, можно установить сразу несколько флагов, перечислив их через запятую:
vds-admin /test# chflags schg, arch, suppnd test_file
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  sappnd,arch,schg 0 Jun 21 07:33 test_file
Снять флаг можно, добавив к его названию, приставку "no":
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  schg 0 Jun 21 07:33 test_file
vds-admin /test# chflags noschg test_file
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  - 0 Jun 21 07:33 test_file
Так-же есть возможность сбросить все флаги, для этого вместо флага, достаточно просто поставить "0" ( ноль ).
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  sappnd,arch,schg 0 Jun 21 07:33 test_file
vds-admin /test# chflags 0 test_file
vds-admin /test# ll -lo
total 0
-rw-r--r--  1 root  wheel  - 0 Jun 21 07:33 test_file

Основные команды для установки и изменения прав доступа и работы с флагами в операционных системах Unix

Основными утилитами для работы с правами доступа и флагами, в операционной системе Unix, являются следующие:
  • ls -l, ls -lo Листинг каталога, без флагов и с флагами
  • chown Изменение владельца объекта
  • chmod Установка, удаление, изменения прав доступа к объекту
  • chflags Установка, удаление, изменение файловых флагов
Удачного администрирования./em

Комментарии

Можно подробнее про SUID и SGID. Самой сути я не услышал. Понятно что если "х", то то файл может исполнить у кого есть эти права. А если "s"??? Какие преимущества?
Как назначается "s"?
Допустим мне нужно-rwsrwsrwx.

А если "s"???

если данный бит установлен, файл выполняется с правами ВЛАДЕЛЬЦА ФАЙЛА, а не того, кто его запустил.
Например, любой пользователь может изменять свой пароль, используя программу passwd, но файл паролей, доступен для редактирования только пользователю root, поэтому на бинарнике passwd установлен SUID. То есть, обычный юзер запускает passwd, но выполняется passwd с правами своего владельца, то есть root'а, что-бы изменить файл master.passwd

Допустим мне нужно

chmod u+s /path/to/file.name или так chmod 4777 /path/to/file.name4 - установка SUID бита
777 - остальные права
chmod +s /path/to/file.name установка SUID и SGID
chmod -s /path/to/file.name снятие SUID и SGID

Спасибо. Очень внятно объяснили по "Permissions" в части установки SUID, SGID.Остальное в статье все понятно.Правда есть с десяток вопросов по: настройке OpenWindows;Initialization Files и т.д.

Привет сдается мне, что в этом примере не точность пропущен "x" - rw"x"- r-- r-- 1 root wheel 0 Jun 20 11:10 file.txt

так и есть, спасибо, поправил

А разве chflags с манипуляцией этими суперпользовательскими флагами не доступно только в BSD-системах? Что-то не припомню, что в линуксе, например, есть такое.

так и есть

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
 oooooo   oooo      .      .o   oooooooooo.                  .   
`888. .8' .o8 o888 `888' `Y8b .o8
`888. .8' .o888oo 888 888 888 .ooooo. .o888oo
`888.8' 888 888 888oooo888' d88' `88b 888
`888' 888 888 888 `88b 888ooo888 888
888 888 . 888 888 .88P 888 .o 888 .
o888o "888" o888o o888bood8P' `Y8bod8P' "888"


Введите код, изображенный в стиле ASCII-арт.