Права доступа Unix, SUID, SGID, Sticky биты Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:стандартные_права_unix [2011/10/15 00:41]
[Расширенные права]
wiki:стандартные_права_unix [2020/10/07 17:56] (текущий)
[Расширенные права]
Строка 1: Строка 1:
-====== ​Стандартные ​права Unix, SUID, SGID, Sticky биты ======+====== ​Права доступа Unix, SUID, SGID, Sticky биты ======
 ^  Поддерживаемые версии Ubuntu ​ ^ ^  Поддерживаемые версии Ubuntu ​ ^
 |  Все (теоретически) ​ |  ​ |  Все (теоретически) ​ |  ​
Строка 24: Строка 24:
 |  s  |Unix сокет (unix domain socket)| |  s  |Unix сокет (unix domain socket)|
  
-===== Стандартные ​права =====+===== Права доступа =====
  
 Посмотреть права доступа на объекты можно командой **ls** c ключем **-l** ("​л"​). Также можно добавить ключ **-a**, для того,​чтобы были отображены скрытые объекты:​ Посмотреть права доступа на объекты можно командой **ls** c ключем **-l** ("​л"​). Также можно добавить ключ **-a**, для того,​чтобы были отображены скрытые объекты:​
Строка 38: Строка 38:
 </​code>​ </​code>​
  
-В листинге выше ​используются ​буквенные обозначения прав (т.н. маска режима ​доступа), но большинство администраторов, в том числе и я, используют чаще цифровые обозначения в восьмеричном представлении. Рассмотрим таблицу, чтобы было проще:+Для назначения прав используются ​три группы флагов, первая определяет права для владельца, вторая - права для основной группы ​пользователя, третья - для всех остальных пользователей в системе.
  
-^  OCT  ^  BIN  ^  Mask  ^  Комментарий  ^ +Для файлов: **r** - право на чтение ​из файла; **w** - разрешает запись ​в файл (в частности перезапись или ​изменение); **x** - позволяет исполнить файл.
-|  0  |  000  |  - - -  |отсутствие прав| +
-|  1  |  001  |  ​- x  |права на выполнение+
-|  2  |  010  |  - w -  |права на запись+
-|  3  |  011  |  - w x  |права на запись и выполнение+
-|  4  |  100  |  r - -  |права ​на чтение+
-|  5  |  101  |  r x  |права на чтение и выполнение| +
-|  6  |  110  |  r w -  |права на чтение и запись| +
-|  7  |  111  |  r w x  |полные права|+
  
-Для ​назначения обычных прав используются три восьмеричных цифры (9 битов). Первая цифра определяет права ​для владельца файла, вторая - права ​для основной группы пользователя, третья - для ​всех остальных пользователейТакнапримерчтобы задать права на файл всем и вся, нужно установить права **777** (**rwxrwxrwx**).  +Для ​каталогов, флаги **r w x** имеют несколько отличный смысл: **r** - позволяет читать только имена файлов в каталоге;​ **x** - позволяет ​иметь доступ к самим файлам и их атрибутам (но не именам);​ **w** имеет смысл только в сочетании ​с **x**, и позволяет (в дополнение к **x**) манипулировать с файлами в каталоге (создавать, удалять и переименовывать). **w** без **x** - не имеет никакого эффекта. 
-Существуют также специальные биты, такие как **SUID**, **SGID** и **Sticky**-бит. ​Они ​влияют на запуск файла. При их применении необходимо использовать не три восьмеричных цифры, а 4. Зачастую,​ в различной технической литературе права обозначаются именно 4-мя цифрами,​ например **0744**. ​Почему-то многие стараются не использовать специальные биты, сетуя на безопасностьно, по-моему, их использование в некоторых ситуациях ​очень оправдано. Поговорим о них несколько позже.+ 
 +Рассмотрим таблицу, чтобы было понятнее: 
 + 
 +^  OCT  ^  BIN  ^  Mask  ^  Права на файл ​ ^ Права на каталог ^ 
 +|  0  |  000  |  - - -  |отсутствие ​прав|отсутствие прав| 
 +|  1  |  001  |  - - x  |права на выполнение|доступ к файлам и их атрибутам((Нет ​возможности получить список имен файлов и создать/удалить/​переименовать файл в каталоге.))| 
 +|  2  |  010  |  - w -  |права на запись|отсутствие прав| 
 +|  3  |  011  |  ​w x  |права ​на запись и выполнение|все,​ кроме доступа к именам файлов((Можно читать/​изменять/​запускать(если разрешено правами на сам файл)а также создаватьдалять/переименовывать файлно только если ​вы знаете его имяУзнать имена файлов в каталоге - нет никакой возможности))| 
 +|  4  |  100  |  r - -  |права на чтение|только чтение ​имен файлов| 
 +|  5  |  101  |  r - x  |права на чтение и выполнение|чтение имен файлов и доступ файлам и их атрибутам((Нет возможности создавать/удалять/​переименовывать файлы в каталоге.))| 
 +|  6  |  110  |  r w -  |права на чтение и запись|только чтение имен ​файлов| 
 +|  7  |  111  |  r w x  |полные права|все ​права| 
 + 
 +Для администрирования часто ​удобнее использовать не буквенное представление прав, а цифровое, в восьмеричном представлении (оно короче). Так, например, ​права ​на файл всем и вся, соответствуют записи ​**777** (что аналогично символьному представлению ​**rwxrwxrwx**). 
 + 
 +Существуют также специальные биты, такие как **SUID**, **SGID** и **Sticky**-бит. ​**SUID**, **SGID** ​влияют на запуск файла, а **Sticky** влияет на определение владельца объектов в каталоге. При их применении необходимо использовать не три восьмеричных цифры, а 4. Зачастую,​ в различной технической литературе права обозначаются именно 4-мя цифрами,​ например **0744**. ​Многие стараются не использовать специальные биты, сетуя на безопасность ​(и не без ​основательно), но, в некоторых ситуациях ​без них не обойтись. Поговорим о них несколько позже.
  
 Давайте рассмотрим пример,​ итак: Давайте рассмотрим пример,​ итак:
Строка 63: Строка 70:
  
     * Первый символ (флаг) пустой:​ " - " ​ - для файлов. ​     * Первый символ (флаг) пустой:​ " - " ​ - для файлов. ​
-    * Следующие три символа (**rwx**) обозначают права для владельца файла, в данном случае полные права для пользователя **allexserv**.((По умолчанию,​ при создании ​объекта (файла или каталога) устанавливаются полные права ​для ​его ​владельца).)) +    * Следующие три символа (**rwx**) обозначают права для владельца файла, в данном случае полные права для пользователя **allexserv**.((При создании файла или каталога ​его ​владелец получает полные права ​на него.)) ​
     * Следующие три (- - -) - определяют права для группы **nogroup**,​ в нашем примере для всех пользователей группы **nogroup** доступ запрещен.     * Следующие три (- - -) - определяют права для группы **nogroup**,​ в нашем примере для всех пользователей группы **nogroup** доступ запрещен.
     * Ну и последние три символа (- - -) определяют права для всех остальных пользователей, ​ в нашем случае доступ запрещен. ​     * Ну и последние три символа (- - -) определяют права для всех остальных пользователей, ​ в нашем случае доступ запрещен. ​
Строка 72: Строка 79:
  
     * Для владельца каталога **allexserv** - полные права (rwx). ​     * Для владельца каталога **allexserv** - полные права (rwx). ​
-    * Для группы **nogroup** - права ​только ​на листинг каталога (r-x). +    * Для группы **nogroup** - права на листинг каталога ​и доступ к файлам ​(r-x). 
-    * Для пользователя "​все остальные"​ - права ​только ​на листинг каталога (r-x). ​+    * Для пользователя "​все остальные"​ - права на листинг каталога ​и доступ к файлам ​(r-x). ​
  
-Восьмеричное обозначение в этом примере:​ **0755**.((Напомню,​ что для того, чтобы пользователи могли просматривать каталог,​ необходимы права на чтение и выполнение каталога,​ т.е. минимальные права на каталог 0555 (r-xr-xr-x),​ прав 0444 (r - - r - - r - -) будет недостаточно для входа в каталог.))+Восьмеричное обозначение в этом примере:​ **0755**.
  
 +<note important>​Для полноценного просмотра каталога,​ необходимы права на чтение каталога и доступ к файлам,​ а главное к их атрибутам,​ т.е. минимальные разумные права на каталог - 5 (r-x). Прав 4 (r--) хватит только на просмотр имен файлов,​ без атрибутов,​ т.е. не будут известны размер файла, права доступа,​ владелец.
 +
 +На практике для каталогов используется только три режима:​ 7 (rwx), 5 (r-x) и 0 (---).</​note>​
 +
 +<note tip>​Очень любопытный режим доступа к каталогу - 3 (-wx): он позволяет делать в директории все, что угодно,​ но не позволяет прочитать имена объектов в директории. Т.е. если вам не известны названия объектов в этом каталоге,​ то вы сделать с ними ничего не сможете (даже удалить по маске * т.к. маску не к чему применять - имена то недоступны). ​
 +
 +В каталоге с режимом доступа 3 (-wx) можно создавать новые, переименовывать и удалять файлы и каталоги (если вы знаете их имя); читать,​ изменять,​ запускать файл (если достаточно на него прав, и опять же - вы знаете его имя). Можно даже менять права доступа на файлы и каталоги (если вы знаете имя). Но самое интересное,​ что если вы сможете перейти (по cd((Хотя графические файловые менеджеры могут и отказаться открывать такой подкаталог.))) в подкаталог такого каталога (а для этого вам опять нужно знать его имя), то там у вас будет "​все в ожуре"​ (если конечно у этого подкаталога будет нормальный режим доступа).
 +
 +Никакой рекурсивный поиск/​удаление тоже не сможет залезть внутрь такого каталога - ему ведь нужны названия - а их из такого каталога - никак не получить. ​
 +
 +Но не надо думать,​ что такой каталог полноценно заменяет крипто-контейнер (т.е. может использоваться для хранения очень секретных данных). Да, имен объектов из такого каталога никак не получить,​ однако если попытаться создать объект с именем,​ которое уже существует,​ то такая операция закончится неудачей (т.е. мы получим подтверждение,​ что такое имя уже есть). Так же можно пытаться открыть (как файл или как каталог) объект с произвольным именем,​ если такого имени нет, то мы получим ошибку. Безусловно имя может быть очень длинным и шансы угадать его могут быть не велики,​ но не надо забывать,​ что права доступа могут сменить как владелец каталога так root. Да и пути доступа могут сохраниться в различных логах и файлах истории.</​note>​
 ===== Команда chmod ===== ===== Команда chmod =====
  
-Права устанавливаются командой **chmod**. По умолчанию использовать ее может только **root**. Команда **chmod** поддерживает установку прав как в восьмеричном представлении,​ так и в символьном (маска режима доступа).+Права устанавливаются командой **chmod**. Команда **chmod** поддерживает установку прав как в восьмеричном представлении,​ так и в символьном (маска режима доступа).
  
 Синтаксис команды прост: Синтаксис команды прост:
Строка 127: Строка 145:
     * **chmod ug=rw spisok.doc** - Выставить права на чтение и запись файлу spisok.doc для владельца и группы. Обратите внимание,​ что если у пользователя "​все остальные"​ были какие-либо права, они сохранятся в неизменном виде.     * **chmod ug=rw spisok.doc** - Выставить права на чтение и запись файлу spisok.doc для владельца и группы. Обратите внимание,​ что если у пользователя "​все остальные"​ были какие-либо права, они сохранятся в неизменном виде.
  
-Очевидно,​ использование восьмеричного представления ​несколько рациональнее, ввиду ​четкого определения прав ​для каждого из трех "пользователей". Напримерчтобы выставить ​разные права для ​группы и владельца ​объекта с помощью символьного представления, придется воспользоваться командой **chmod** в два присестав то время как восьмеричным ​представлением все это можно сделать за один раз.  +Использование ​символьного представления ​позволяет ​редактировать права файлов более гибко:​ 
-В то же время символьное назначение окажет неоценимую услугу, ​если требуется добавить права на объект к уже существующим правам.+ 
 +    * **chmod u+x,g+w-x koshki.txt** - Добавить владельцу файла koshki.txt права на его ​выполнение, ​пользователям группы разрешить запись и запретить выполнение и оставить ​права остальных пользователей ​без ​изменений;​ 
 +    * **chmod u=rwx,g+w,go-x sobaki.doc** - Установить ​полные права для владельца ​файла, разрешить пользователям группы запись и запретить выполнение всем пользователям,​ кроме владельца файла. 
 + 
 +Символьное назначение окажет неоценимую услугу, если требуется добавить ​права на объект к уже существующим правам. 
 + 
 +=== Массовое назначение прав === 
 + 
 +Иногда, бывает, нужно массово установить ​права на определенный тип объектов, например, ​только на каталоги или только на файлы. Простое использование опции ​**-R** (рекурсия) здесь не поможет т.к. chmod будет ​проходить по всем объектам удовлетворяющим маске, что иногда ​вовсе не то, что нужно.  
 + 
 +Итак, чтобы массово установить права на определенный тип объектов можно ​использовать один ​из вариантов ​(вообщеих очень много): 
 + 
 +  * **chmod -R 770 $(find . -type d)**  
 + 
 +где **-type d** - каталоги,​ **-type f** - файлы. В данном примере chmod установит, ​начиная от текущего каталога((О чем сообщает точка после ​**find**.)), ​ права на все каталоги (включая подкаталоги) разрешения 770 (rwx rwx- - -) при этом не трогая ​права на другие ​объекты.  
 + 
 +Более длинный вариант аналогичной операции:​ 
 + 
 +  * **find ./ -type f -exec sudo chmod 775 {} \;** 
 + 
 +где **-type d** - каталоги,​ **-type f** - файлы. В данном варианте chmod установит разрешения 775 на все файлы включая файлы в подкаталогах начиная от текущего. 
  
 ===== Биты SUID, SGID и Sticky ===== ===== Биты SUID, SGID и Sticky =====
Строка 147: Строка 186:
 </​code>​ </​code>​
  
-**1000** - идентификатор (GID) дополнительной группы allexserv пользователя **allexserv**((Обратите внимание,​ в этом примере основная группа пользователя **allexserv** - это группа **root** (идентификатор 0), а группа **allexserv** (1000) - считалась бы дополнительной. В данном примере ​пользователь **allexserv** не входит ​больше в группу **allexserv** (видимо я, при создании себя вручную изменил принадлежность к группам), так что группа ​**allexserv** на данный момент пуста.))+**1000** - идентификатор (GID) дополнительной группы allexserv пользователя **allexserv**((Обратите внимание,​ в этом примере основная группа пользователя **allexserv** - это группа **root** (идентификатор 0) - при создании этого пользователя ему была явно указана принадлежность к группе **root**.))
  
-Зачастую, ​при создании пользователя, если не указано иноеидентификатор группы пользователя равен идентификатору ​пользователя. Например:​+Если при создании пользователя ​основная группа ​не указана явно, то основной ​группой пользователя ​будет группа с тем же именем, что и имя пользователя. Например:​
  
 <​code>​ <​code>​
Строка 169: Строка 208:
  
 <note tip>​**Возьмите на заметку!** ​ <note tip>​**Возьмите на заметку!** ​
-Если установить **SGID** для каталога,​ то все файлы созданные ​ в нем при запуске будут принимать идентификатор группы каталога,​ а не группы владельца,​ который создал файл в этом каталоге. Аналогично **SUID**. Одним словом,​ если пользователь поместил исполняемый файл в такой каталог,​ запустив его, процесс запустится от имени владельца (группы) каталога,​ в котором лежит этот файл.</​note>​+Если установить **SGID** для каталога,​ то все файлы созданные ​ в нем при запуске будут принимать идентификатор группы каталога,​ а не группы владельца,​ который создал файл в этом каталоге. Аналогично **SUID**. Одним словом,​ если пользователь поместил исполняемый файл в такой каталог,​ запустив его, процесс запустится от имени владельца (группы) каталога,​ в котором лежит этот файл. 
 + 
 +Однако,​ в системе FreeBSD, если скомпилировать ядро с поддержкой **suiddir**,​ а так же смонтировать раздел с этой опцией,​ то, все объекты создаваемые в каталоге где установлен **SUID** будут иметь владельца этого каталога (наследование). Реализация подобного в Linux возможна (?) на файловой системе GFS2. Данная функция считается уязвимостью. 
 +</​note>​
  
 Установить **SUID** и **SGID** можно командой **chmod**: ​ Установить **SUID** и **SGID** можно командой **chmod**: ​
Строка 184: Строка 226:
 Снять установленные биты можно различными способами:​ Снять установленные биты можно различными способами:​
  
-    * **chmod ​g-s koshka.pl** - убираем SUID +    * **chmod ​u-s koshka.pl** - убираем SUID 
-    * **chmod ​u-s koshka.pl** - убираем SGID+    * **chmod ​g-s koshka.pl** - убираем SGID
     * **chmod 0644 koska.pl** - Убираем все дополнительные биты и меняем права на 644.     * **chmod 0644 koska.pl** - Убираем все дополнительные биты и меняем права на 644.
  
Строка 286: Строка 328:
 В больших сетях, ​ с многоуровневыми схемами доступа применяется более гибкая реализация назначения прав, именуемая как **ACL** - [[access_control_list|Списки контроля доступа]]. ​   В больших сетях, ​ с многоуровневыми схемами доступа применяется более гибкая реализация назначения прав, именуемая как **ACL** - [[access_control_list|Списки контроля доступа]]. ​  
  
-<style right> --- //​[[allexmail@pisem.net|Соловьев Алексей aka allexnew]] upd 15.10.2011 00:39// </​style>​+<style right> --- //​[[allexmail@yandex.ru|Соловьев Алексей aka allexnew]] upd 07.10.2020 17:56// </​style>​
  
 {{tag>​Администрирование система Права_доступа }} {{tag>​Администрирование система Права_доступа }}