Различия

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


Предыдущая версия
chmod [2024/04/01 14:59] (текущий) – [Заключение] darkfire
Строка 1: Строка 1:
 +====== Chmod: Управляйте доступом к файлам и папкам в Linux ======
 +~~Title: Что такое chmod? Руководство по управлению правами доступа в Linux ~~
 +{{htmlmetatags>
 +metatag-description=(Узнайте, как использовать команду chmod для управления правами доступа в Linux. Понятные примеры и советы.)
 +}}
 +{{ ::chmod-01.png?nolink&600 |}}
  
 +chmod — программа для изменения прав доступа к файлам и каталогам. Название происходит от программы ОС Unix chmod, которая, собственно, изменяет права доступа к файлам, каталогам и символическим ссылкам.
 +
 +  * [[umask]] — функция изменяющая права доступа, которые присваиваются новым файлам и директориям по умолчанию.
 +  * [[find]] - наиболее эффективное средство поиска и «массовой обработки» файлов. Удобно использовать в связке с chmod.
 +
 +Права устанавливаются командой chmod. Команда chmod поддерживает установку прав как в восьмеричном представлении, так и в символьном (маска режима доступа). 
 +
 +  * Назначение прав всем объектам текущего каталога, включая подкаталоги.<file bash>
 +chmod -R 755 *
 +</file>
 +  * Значениями по умолчанию являются (umask 0022):<file bash>
 +для файлов: 644 (-rw-r--r--)
 +для директорий: 755 (drwxr-xr-x)
 +</file>
 +  * **Использование chmod.** Рекурсивно изменить права доступа файла_или_папки <file bash>
 +chmod -R 755 имя_файла_или_папки ( 7 - хозяин, 5 - группа, 5 - другие)
 +</file>
 +  * Сменить рекурсивно права на 640 на все файлы начиная с текущей директории: <code bash>find . -type f -exec chmod 640 {} \;
 +</code>
 +  * Сменить рекурсивно права на 750 на все директории начиная с текущей директории:<code bash>find . -type d -exec chmod 750 {} \;</code>
 +  * Поиск файлов с установленным [[SUID]] -битом. Для GUID perm будет 02000<file bash>
 +find / -type f -perm -04000 -ls
 +4335260  340 -rwsr-xr--   1 root     dip        347296 кві 21 20:35 /usr/sbin/pppd
 +4326414   20 -rwsr-sr-x   1 libuuid  libuuid     18904 вер  2 21:35 /usr/sbin/uuidd
 +...
 +</file>
 +  * Рекурсивно удалить атрибуты [[SUID]] и SGID:<file bash>
 +chmod -R u-s,g-s directory
 +</file>
 +
 +**Популярные цифровые значения**:
 +
 +  * 777 (-rwxrwxrwx) Каждый пользователь может читать, редактировать и запускать на выполнение
 +  * 1555 (-r-xr-xr-t) Каждый пользователь имеет право читать и запускать на выполнение; удалить файл может только владелец этого файла. Символ **t** обозначает Sticky бит, который указывает, что удалять файлы в этой директории может только владелец этого файла.
 +  * 2555 (-r-xr-sr-x) **GUID** Каждый пользователь имеет право читать и запускать на выполнение с правами группы(user group) владельца файла.
 +  * 2775 (drwxrwsr-x) **GUID** Созданные новые файлы всегда будут получать ту группу, какая стоит у папки, в которой они находятся. За это отвечает бит 2 в правах на папки. Это важно, если с этим файловым пространством (сайтом) работают несколько пользователей.
 +  * 4555 (-r-sr-xr-x) **SUID** Каждый пользователь имеет право читать и запускать на выполнение с правами владельца файла
 +<panel type="info">
 +Символ **s** - означает [[SUID]]-бит. Программа с этим битом выполняется от того пользователя, которому принадлежит файл. Например, если ваша программа называется **daemon** и вы хотите запускать его от пользователя user группы users, то сделать надо примерно следующее:<file bash>
 +chown user:users daemon
 +chmod ug+sx daemon
 +</file></panel>
 +
 +  * [[bash|Bash скрипт]] для рекурсивного изменения права доступа для вложенных файлов и каталогов.Cкрипт не понимает файлы и директории с пробелами. Для устранения ошибки, названия файлов и директории в строке запуска chmod нужно заключить в одинарные скобки.
 +<file bash>
 +#!/bin/bash
 +
 +ROOT_DIR=$1
 +DIR_PERM=$2
 +FILE_PERM=$3
 +
 +for name in $(find ${ROOT_DIR})
 +do
 +if [ -d $name ]
 +then
 +chmod ${DIR_PERM} ${name}
 +echo "DIRECTORY: '${name}' PERMS CHANGED TO 0x${DIR_PERM}"
 +else
 +chmod ${FILE_PERM} ${name}
 +echo "FILE: '${name}' PERMS CHANGED TO 0x${FILE_PERM}"
 +fi
 +done
 +
 +#Пример запуска:
 +#/понятный путь для FreeBSD/*doperm.sh(пробел)
 +#/полный путь к нужному каталогу/(пробел)аттрибуты каталога в цифрах,
 +#например: 00770(пробел) аттрибуты файла в цифрах, например: 00600
 +#./doperm.sh /mnt/archive/oldmail 00770 00600
 +</file>
 +====== Права доступа в Linux/Unux ======
 +
 +Поскольку [[Linux|Linux]] — система многопользовательская, для нее был разработан механизм разграничения доступа.
 +
 +В основе механизмов разграничения доступа лежат имена пользователей и имена групп пользователей. В Linux каждый пользователь имеет уникальное имя, под которым он входит в систему (логируется). Кроме того, в системе создается некоторое число групп пользователей, причем каждый пользователь может быть включен в одну или несколько групп. Создает и удаляет группы суперпользователь, он же может изменять состав участников той или иной группы. Члены разных групп могут иметь разные права по доступу к файлам, например, группа администраторов может иметь больше прав, чем группа программистов.
 +<alert type="warning">Хочется отметить, что пользователь 'root' всегда сможет получить доступ к Вашим файлам (вне зависимости какие были выставлены права) т.к. это супер-администратор (суперпользователь).</alert>
 +
 +В индексном дескрипторе каждого файла записаны имя так называемого владельца файла и группы, которая имеет права на этот файл. Первоначально, при создании файла его владельцем объявляется тот пользователь, который этот файл создал. Точнее — тот пользователь, от чьего имени запущен процесс, создающий файл. Группа тоже назначается при создании файла — по идентификатору группы процесса, создающего файл.
 +
 +Посмотреть права доступа на объекты можно командой ls или stat (которая выводим например права доступа сразу в символьном и цифровом виде). Утилита **ls**<file bash>
 +ls -l /bin/ls
 +-rwxr-xr-x 1 root root 110080 Янв 14  2015 /bin/ls
 +</file>Утилита **stat**<file bash>
 +stat /bin/ls
 +Доступ: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
 +</file>
 +
 +<file bash>
 +    rwx    r-x    r-x
 +---  -----  -----  -----
 +          |      |
 +          |      +----  Права доступа для всех остальных
 +          |      
 +          +-----------  Права доступа для группы
 +     |
 +     +------------------  Права достува для владельца (read, write, execute)
 + |
 + +------------------------ Тип файла. "-" означет, что это обычный файл.
 +                           "d" - директория. "l" - ссылка
 +</file>
 +
 +Для назначения прав используются три группы флагов, первая определяет права для владельца, вторая - права для основной группы пользователя, третья - для всех остальных пользователей в системе.
 +
 +**Для файлов**: r - право на чтение из файла; w - разрешает запись в файл (в частности перезапись или изменение); x - позволяет исполнить файл.
 +
 +**Для каталогов**, флаги r w x имеют несколько отличный смысл: r - позволяет читать только имена файлов в каталоге; x - позволяет иметь доступ к самим файлам и их атрибутам (но не именам); w имеет смысл только в сочетании с x, и позволяет (в дополнение к x) манипулировать с файлами в каталоге (создавать, удалять и переименовывать). w без x - не имеет никакого эффекта.
 +
 +
 +<alert type="info">Для полноценного просмотра каталога, необходимы права на чтение каталога и доступ к файлам, а главное к их атрибутам, т.е. минимальные разумные права на каталог - 5 (r-x). Прав 4 (r–) хватит только на просмотр имен файлов, без атрибутов, т.е. не будет известен ни размер файла, ни его тип (что даже не позволит отличить директории от файлов).
 +
 +На практике для каталогов используется только три режима: 7 (rwx), 5 (r-x) и 0 (—).</alert>
 +
 +===== Режим доступа к каталогу - 3 (-wx) =====
 +
 +Очень любопытный режим доступа к каталогу - 3 (-wx): он позволяет делать в директории все, что угодно, но не позволяет прочитать имена объектов в директории. Т.е. если вам не известны названия объектов в этом каталоге, то вы сделать с ними ничего не сможете (даже удалить по маске * т.к. маску не к чему применять - имена то недоступны).
 +
 +В каталоге с режимом доступа 3 (-wx) можно создавать новые, переименовывать и удалять файлы и каталоги (если вы знаете их имя); читать, изменять, запускать файл (если достаточно на него прав, и опять же - вы знаете его имя). Можно даже менять права доступа на файлы и каталоги (если вы знаете имя). Но самое интересное, что если вы сможете перейти по команде cd в подкаталог такого каталога (а для этого вам опять нужно знать его имя), то там у вас будет «все в ожуре» (если конечно у этого подкаталога будет нормальный режим доступа).
 +
 +Никакой рекурсивный поиск/удаление тоже не сможет залезть внутрь такого каталога - ему ведь нужны названия - а их из такого каталога - никак не получить.
 +
 +В этом примере пользователь "user1" может создавать, удалять или изменять файлы в каталоге "my_directory" и также может переходить в него, но не может видеть его содержимое.
 +<file bash>
 +d-wx-wx-wx 2 user1 users 4096 Apr  1 12:00 my_directory
 +</file>
 +Но не надо думать, что такой каталог полноценно заменяет крипто-контейнер (т.е. может использоваться для хранения очень секретных данных). Да, имен объектов из такого каталога никак не получить, однако если попытаться создать объект с именем, которое уже существует, то такая операция закончится неудачей (т.е. мы получим подтверждение, что такое имя уже есть). Так же можно пытаться открыть (как файл или как каталог) объект с произвольным именем, если такого имени нет, то мы получим ошибку. Безусловно имя может быть очень длинным и шансы угадать его могут быть не велики, но не надо забывать, что права доступа могут сменить как владелец каталога так root. Да и пути доступа могут сохраниться в различных логах и файлах истории.
 +===== Заключение =====
 +Несколько команд, которые помогут вам управлять правами доступа в Linux:
 +  * chown: Команда chown используется для изменения владельца и/или группы файла или директории. Пример использования:<file bash>
 +chown user:group my_file.txt  # Изменить владельца и группу файла
 +</file>
 +  * chgrp: Команда chgrp используется для изменения группы файла или директории. 
 +  * id: Команда id показывает информацию о текущем пользователе, включая UID (User Identifier) и GID (Group Identifier)

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!