Всем привет. Это перевод статьи из книги RedHat RHCSA RHCE 7 RedHat Enterprise Linux 7 EX200 and EX300.
От себя: Надеюсь статья будет полезна не только начинающим, но и поможет более опытным администраторам упорядочить свои знания.
Итак, поехали.
Чтобы получить доступ к файлам в Linux, используются разрешения. Эти разрешения назначаются трем объектам: файлу, группе и другому объекту (то есть всем остальным). В этой статье вы узнаете, как применять разрешения.
Статья начинается с обзора основных понятий, после чего обсуждаются специальные разрешения (Special permissions) и списки контроля доступа (ACL). В конце этой статьи рассматривается настройка прав доступа по умолчанию через umask, а также управление расширенными атрибутами пользователя.
Управление владением файлами
Прежде чем обсуждать разрешения, вы должны знать о роли владельца файла и каталога. Владение файлами и каталогами жизненно важно для работы с разрешениями. В этом разделе вы сначала узнаете, как вы можете увидеть владельца. Затем вы узнаете, как изменить владельца группы и пользователя для файлов и каталогов.
Отображение владельца файла или каталога
В Linux у каждого файла и каждого каталога есть два владельца: пользователь и группа.
Эти владельцы устанавливаются при создании файла или каталога. Пользователь, который создаёт файл становится владельцем этого файла, а первичная группа, в которую входит этот же пользователь, так же становится владельцем этого файла. Чтобы определить, есть ли у вас как у пользователя права доступа к файлу или каталогу, оболочка проверяет владение ими.
Это происходит в следующем порядке:
- Оболочка проверяет, являетесь ли вы владельцем файла, к которому вы хотите получить доступ. Если вы являетесь этим владельцем, вы получаете разрешения и оболочка прекращает проверку.
- Если вы не являетесь владельцем файла, оболочка проверит, являетесь ли вы участником группы, у которой есть разрешения на этот файл. Если вы являетесь участником этой группы, вы получаете доступ к файлу с разрешениями, которые для группы установлены, и оболочка прекратит проверку.
- Если вы не являетесь ни пользователем, ни владельцем группы, вы получаете права других пользователей (Other).
Чтобы увидеть текущие назначения владельца, вы можете использовать команду ls -l. Эта команда показывает пользователя и группу-владельца. Ниже вы можете увидеть настройки владельца для каталогов в каталоге /home.
[root@server1 home]# ls -l
total 8
drwx------. 3 bob bob 74 Feb 6 10:13 bob
drwx------. 3 caroline caroline 74 Feb 6 10:13 caroline
drwx------. 3 fozia fozia 74 Feb 6 10:13 fozia
drwx------. 3 lara lara 74 Feb 6 10:13 lara
drwx------. 5 lisa lisa 4096 Feb 6 10:12 lisa
drwx------. 14 user user 4096 Feb 5 10:35 user
С помощью команды ls вы можете отобразить владельца файлов в данном каталоге. Иногда может оказаться полезным получить список всех файлов в системе, в которых в качестве владельца указан данный пользователь или группа. Для этого вы можете использовать find. Аргумент find -user может быть использован для этой цели. Например, следующая команда показывает все файлы, у которых в качестве владельца указан пользователь linda:
find / -user linda
Вы также можете использовать find для поиска файлов, у которых определенная группа является их владельцем.
Например, следующая команда ищет все файлы, принадлежащие группе users:
find / -group users
Изменение владельца
Чтобы применить соответствующие разрешения, первое, что нужно учитывать, это владение. Для этого есть команда chown. Синтаксис этой команды несложен для понимания:
chown кто что
Например, следующая команда меняет владельца каталога /home/account на пользователя linda:
chown linda /home/account
Команда chown имеет несколько опций, одна из которых особенно полезна: -R. Вы можете догадаться, что она делает, потому что эта опция доступна и для многих других команд. Это позволяет вам рекурсивно устанавливать владельца, что позволяет вам установить владельца текущего каталога и всего, что находится ниже. Следующая команда меняет владельца для каталога /home и всего, что находится под ним, на пользователя lisa:
Сейчас владельцы выглядят так:
[root@localhost ~]# ls -l /home
total 0
drwx------. 2 account account 62 Sep 25 21:41 account
drwx------. 2 lisa lisa 62 Sep 25 21:42 lisa
Выполним:
[root@localhost ~]# chown -R lisa /home/account
[root@localhost ~]#
Теперь пользователь lisa стал владельцем каталога account:
[root@localhost ~]# ls -l /home
total 0
drwx------. 2 lisa account 62 Sep 25 21:41 account
drwx------. 2 lisa lisa 62 Sep 25 21:42 lisa
Изменение владельца группы
Есть два способа изменить владение группой. Вы можете сделать это, используя chown, но есть специальная команда с именем chgrp, которая выполняет эту работу. Если вы хотите использовать команду chown, используйте . или : перед названием группы.
Следующая команда изменяет какого-либо владельца группы /home/account на группу account:
chown .account /home/account
Вы можете использовать chown для изменения владельца пользователя и/или группы несколькими способами. Вот несколько примеров:
- chown lisa myfile1 устанавливает пользователя lisa владельцем файла myfile1.
- chown lisa.sales myfile устанавливает пользователя lisa владельцем файла myfile, а так же устанавливает группу sales владельцем этого же файла.
- chown lisa:sales myfile то же самое, что и предыдущая команда.
- chown .sales myfile устанавливает группу sales владельцем файла myfile без изменения владельца пользователя.
- chown :sales myfile то же самое, что и предыдущая команда.
Вы можете использовать команду chgrp, чтобы изменить владельца группы. Рассмотрим следующий пример, где вы можете с помощью chgrp установить владельцем каталога account группу sales:
chgrp .sales /home/account
Как и в случае с chown, вы можете использовать опцию -R с chgrp, а также рекурсивно менять владельца группы.
Понимание владельца по умолчанию
Вы могли заметить, что когда пользователь создает файл, применяется владение по умолчанию.
Пользователь, который создает файл, автоматически становится владельцем этого файла, а основная группа этого пользователя автоматически становится владельцем этого файла. Обычно это группа, которая указана в файле /etc/passwd в качестве основной группы пользователя. Однако если пользователь является членом нескольких групп, он может изменить эффективную основную группу.
Чтобы показать текущую эффективную первичную группу, пользователь может использовать команду groups:
[root@server1 ~]# groups lisa
lisa : lisa account sales
Если текущий пользователь linda хочет изменить эффективную первичную группу, он будет использовать команду newgrp, за которой следует имя группы, которую он хочет установить в качестве новой эффективной первичной группы. После использования команды newgrp первичная группа будет активна, пока пользователь не введет команду exit или не выйдет из системы.
Ниже показано, как пользователь lisa использует эту команду, что бы первичной группой стала группа sales:
lisa@server1 ~]$ groups
lisa account sales
[lisa@server1 ~]$ newgrp sales
[lisa@server1 ~]$ groups
sales lisa account
[lisa@server1 ~]$ touch file1
[lisa@server1 ~]$ ls -l
total 0
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
После изменения действующей основной группы все новые файлы, созданные пользователем, получат эту группу в качестве группы-владельца.Чтобы вернуться к исходной настройке первичной группы, используйте exit.
Чтобы иметь возможность использовать команду newgrp, пользователь должен быть членом той группы, которую он хочет использовать в качестве первичной. Кроме этого, групповой пароль может быть использован для группы с помощью команды gpasswd. Если пользователь использует команду newgrp, но не является членом целевой группы, оболочка запрашивает пароль группы. После того, как вы введете правильный групповой пароль, будет установлена новая эффективная первичная группа.
Управление основными правами
Система разрешений Linux была изобретена в 1970-х годах. Поскольку вычислительные потребности были ограничены в те годы, базовая система разрешений была довольно ограничена. Эта система разрешений использует три разрешения, которые можно применять к файлам и каталогам. В этом разделе вы узнаете, как использовать и изменять эти разрешения.
Понимание прав на чтение, запись и выполнение
Три основных разрешения позволяют вам читать, записывать и выполнять файлы. Эффект этих разрешений отличается при применении к файлам или каталогам. Применительно к файлу разрешение на чтение дает вам право открыть файл для чтения. Следовательно, вы можете прочитать его содержимое, но это означает, что ваш компьютер может открыть файл, чтобы что-то с ним сделать.
Программный файл, которому требуется доступ к библиотеке, должен, например, иметь доступ для чтения к этой библиотеке. Из этого следует, что разрешение на чтение — это самое основное разрешение, которое вам нужно для работы с файлами.
Применительно к каталогу чтение позволяет отображать содержимое этого каталога. Вы должны знать, что это разрешение не позволяет вам читать файлы в каталоге. Система разрешений Linux не знает наследования, и единственный способ прочитать файл — использовать разрешения на чтение для этого файла.
Как вы, вероятно, можете догадаться, разрешение на запись, если оно применяется к файлу, позволяет записывать в файл. Иначе говоря, позволяет изменять содержимое существующих файлов. Однако он не позволяет создавать или удалять новые файлы или изменять права доступа к файлу. Для этого вам нужно дать разрешение на запись каталогу, где вы хотите создать файл. В каталогах это разрешение также позволяет создавать и удалять новые подкаталоги.
Разрешение на выполнение — это то, что вам нужно для выполнения файла. Оно никогда не будет установлено по умолчанию, что делает Linux практически полностью невосприимчивым к вирусам. Только кто-то с правами записи на каталог может применять разрешение на выполнение.
Ниже обобщается использование основных разрешений:
Использование chmod
Для управления правами используется команда chmod. При использовании chmod вы можете устанавливать разрешения для пользователя (user), группы (group) и других (other). Вы можете использовать эту команду в двух режимах: относительный режим и абсолютный режим. В абсолютном режиме три цифры используются для установки основных разрешений.
При настройке разрешений рассчитайте необходимое вам значение. Если вы хотите установить чтение, запись и выполнение для пользователя, чтение и выполнение для группы, а также чтение и выполнение для других в файле /somefile, то вы используете следующую команду chmod:
chmod 755 /somefile
Когда вы используете chmod таким способом, все текущие разрешения заменяются установленными вами разрешениями.
Если вы хотите изменить разрешения относительно текущих разрешений, вы можете использовать chmod в относительном режиме. При использовании chmod в относительном режиме вы работаете с тремя индикаторами, чтобы указать, что вы хотите сделать:
- Сначала вы указываете, для кого вы хотите изменить разрешения. Для этого вы можете выбрать между пользователем (u), группой (g) и другими (o).
- Затем вы используете оператор для добавления или удаления разрешений из текущего режима или устанавливаете их абсолютно.
- В конце вы используете r, w и x, чтобы указать, какие разрешения вы хотите установить.
При изменении разрешений в относительном режиме вы можете пропустить часть «кому», чтобы добавить или удалить разрешение для всех объектов. Например, эта команда добавляет разрешение на выполнение для всех пользователей:
chmod +x somefile
При работе в относительном режиме вы также можете использовать более сложные команды. Например, эта команда добавляет разрешение на запись в группу и удаляет чтение для других:
chmod g+w,o-r somefile
При использовании chmod -R o+rx /data вы устанавливаете разрешение на выполнение для всех каталогов, а также для файлов в каталоге /data. Чтобы установить разрешение на выполнение только для каталогов, а не для файлов, используйте chmod -R o+ rX /data.
Верхний регистр X гарантирует, что файлы не получат разрешение на выполнение, если файл уже не установил разрешение на выполнение для некоторых объектов. Это делает X более разумным способом работы с разрешениями на выполнение; это позволит избежать установки этого разрешения на файлы, где оно не требуется.
Расширенные права
Помимо основных разрешений, о которых вы только что прочитали, в Linux также есть набор расширенных разрешений. Это не те разрешения, которые вы устанавливаете по умолчанию, но иногда они предоставляют полезное дополнение. В этом разделе вы узнаете, что они из себя представляют и как их настроить.
Понимание расширенных прав SUID, GUID и sticky bit
Есть три продвинутых разрешения. Первое из них — это разрешение на установку идентификатора пользователя (SUID). В некоторых особых случаях вы можете применить это разрешение к исполняемым файлам. По умолчанию пользователь, запускающий исполняемый файл, запускает этот файл со своими собственными разрешениями.
Для обычных пользователей это обычно означает, что использование программы ограничено. Однако в некоторых случаях пользователю требуются специальные разрешения, только для выполнения определенной задачи.
Рассмотрим, например, ситуацию, когда пользователю необходимо сменить пароль. Для этого пользователь должен записать свой новый пароль в файл /etc/shadow. Однако этот файл недоступен для записи пользователям, не имеющим прав доступа root:
root@hnl ~]# ls -l /etc/shadow
----------. 1 root root 1184 Apr 30 16:54 /etc/shadow
Разрешение SUID предлагает решение этой проблемы. В утилите /usr/bin/passwd это разрешение применяется по умолчанию. Это означает, что при смене пароля пользователь временно получает права root, что позволяет ему записывать в файл /etc/shadow. Вы можете видеть разрешение SUID с ls -l как s в позиции, где обычно вы ожидаете увидеть x для пользовательских разрешений:
[root@hnl ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32680 Jan 28 2010 /usr/bin/passwd
Разрешение SUID может выглядеть полезным (и в некоторых случаях так оно и есть), но в то же время оно потенциально опасно. При неправильном применении вы можете случайно раздать права доступа root. Поэтому я рекомендую использовать его только с максимальной осторожностью.
Большинству администраторов никогда не придется его использовать; вы увидите его только в некоторых файлах, где операционная система должна установить его по умолчанию.
Второе специальное разрешение — это идентификатор группы (SGID). Это разрешение имеет два эффекта. При применении к исполняемому файлу, он дает пользователю, который исполняет файл, разрешения владельца группы этого файла. Таким образом, SGID может выполнить более или менее то же самое, что SUID. Однако для этой цели SGID практически не используется.
Как и в случае с разрешением SUID, SGID применяется к некоторым системным файлам в качестве настройки по умолчанию.
Когда применяется к каталогу, SGID может быть полезен, потому что вы можете использовать его для установки владельца группы по умолчанию для файлов и подкаталогов, созданных в этом каталоге. По умолчанию, когда пользователь создает файл, его эффективная первичная группа устанавливается как владелец группы для этого файла.
Это не всегда очень полезно, особенно потому, что у пользователей Red Hat/CentOS в качестве основной группы задана группа с тем же именем, что и у пользователя, и из которых пользователь является единственным участником. Таким образом, по умолчанию файлы, которые создает пользователь, будут групповыми для общего доступа.
Представьте себе ситуацию, когда пользователи linda и lori работают в бухгалтерии и являются членами группы account. По умолчанию эти пользователи являются членами частной группы, единственным членом которой они являются. Однако оба пользователя являются членами группы account, но также и в качестве параметра вторичной группы.
Ситуация по умолчанию состоит в том, что когда любой из этих пользователей создает файл, основная группа становится владельцем. Поэтому по умолчанию linda не может получить доступ к файлам, созданным lori, и наоборот. Однако, если вы создаете общий каталог группы (скажем, /groups/account) и убедитесь, что разрешение SGID применено к этому каталогу и что учет группы установлен как владелец группы для этого каталога, все файлы, созданные в этом каталоге и во всех его подкаталогах, также получают account группы как владельца группы по умолчанию.
По этой причине разрешение SGID является очень полезным разрешением для установки в каталогах общих групп.
Разрешение SGID показывается в выводе ls -ld как s в позиции, где вы обычно находите разрешение на выполнение группы:
[root@hnl data]# ls -ld account
drwxr-sr-x. 2 root account 4096 Apr 30 21:28 account
Третий из специальных разрешений — sticky bit. Это разрешение полезно для защиты файлов от случайного удаления в среде, где несколько пользователей имеют права на запись в один и тот же каталог. Если применяется закрепленный sticky bit, пользователь может удалить файл, только если он является пользователем-владельцем файла или каталога, в котором содержится файл. По этой причине он применяется в качестве разрешения по умолчанию для каталога /tmp и может быть полезен также для каталогов общих групп.
Без sticky bit, если пользователь может создавать файлы в каталоге, он также может удалять файлы из этого каталога. В общедоступной групповой среде это может раздражать. Представьте себе пользователей linda и lori, которые оба имеют права на запись в каталог /data/account и получают эти разрешения благодаря участию в группе account. Поэтому linda может удалять файлы, созданные lori, и наоборот.
Когда вы применяете sticky bit, пользователь может удалять файлы, только если выполняется одно из следующих условий:
- Пользователь является владельцем файла;
- Пользователь является владельцем каталога, в котором находится файл.
При использовании ls -ld, вы можете видеть sticky bit как t в позиции, где вы обычно видите разрешение на выполнение для других:
[root@hnl data]# ls -ld account/
drwxr-sr-t. 2 root account 4096 Apr 30 21:28 account/
Применение расширенных прав
Чтобы применить SUID, SGID и sticky bit, вы также можете использовать chmod. SUID имеет числовое значение 4, SGID имеет числовое значение 2, а sticky bit имеет числовое значение 1.
Если вы хотите применить эти разрешения, вам нужно добавить четырехзначный аргумент в chmod, первая цифра которого относится к специальным разрешениям. Следующая строка, например, добавит разрешение SGID на каталог и установит rwx для пользователя и rx для группы и других:
chmod 2755 /somedir
Это довольно непрактично, если вам нужно посмотреть текущие права доступа, которые установлены, прежде чем работать с chmod в абсолютном режиме. (Вы рискуете перезаписать разрешения, если вы этого не сделаете.) Поэтому я рекомендую работать в относительном режиме, если вам нужно применить какое-либо из специальных разрешений:
- Для SUID используйте chmod u+s.
- Для SGID используйте chmod g+s.
- Для sticky bit используйте chmod +t, а затем имя файла или каталога, для которого вы хотите установить разрешения.
В таблице обобщено все, что важно знать об управлении специальными разрешениями.
Пример работы со специальными правами
В этом примере вы используете специальные разрешения, чтобы членам группы было проще обмениваться файлами в каталоге общей группы. Вы назначаете ID-бит установленного идентификатора группы, а также sticky bit, и видите, что после их установки добавляются функции, облегчающие совместную работу членов группы.
- Откройте терминал, в котором вы являетесь пользователем linda. Создать пользователя можно командой useradd linda, добавить пароль passwd linda.
- Создайте в корне каталог /data и подкаталог /data/sales командой mkdir -p /data/sales. Выполните cd /data/sales, чтобы перейти в каталог sales. Выполните touch linda1 и touch linda2, чтобы создать два пустых файла, владельцем которых является linda.
- Выполните su — lisa для переключения текущего пользователя на пользователя lisa, который также является членом группы sales.
- Выполните cd /data/sales и из этого каталога выполните ls -l. Вы увидите два файла, которые были созданы пользователем linda и принадлежат группе linda. Выполните rm -f linda*. Это удалит оба файла.
- Выполните touch lisa1 и touch lisa2, чтобы создать два файла, которые принадлежат пользователю lisa.
- Выполните su – для повышения ваших привилегий до уровня root.
- Выполните chmod g+s,o+t /data/sales, чтобы установить бит идентификатора группы (GUID), а также sticky bit в каталоге общей группы.
- Выполните su — linda. Затем выполните touch linda3 и touch linda4. Теперь вы должны увидеть, что два созданных вами файла принадлежат группе sales, которая является владельцем группы каталога /data/sales.
- Выполните rm -rf lisa*. Sticky bit предотвращает удаление этих файлов от имени пользователя linda, поскольку вы не являетесь владельцем этих файлов. Обратите внимание, что если пользователь linda является владельцем каталога /data/sales, он в любом случае может удалить эти файлы!
Управление ACL (setfacl, getfacl) в Linux
Даже если расширенные права, которые обсуждались выше, добавляют полезную функциональность к тому, как Linux работает с разрешениями, это не позволяет вам предоставлять разрешения более чем одному пользователю или одной группе в одном файле.
Списки контроля доступа предлагают эту функцию. Кроме того, они позволяют администраторам устанавливать разрешения по умолчанию сложным способом, при котором установленные разрешения могут различаться в разных каталогах.
Понимание ACL
Хотя подсистема ACL добавляет отличные функциональные возможности вашему серверу, у нее есть один недостаток: не все утилиты поддерживают ее. Следовательно, вы можете потерять настройки ACL при копировании или перемещении файлов, а программное обеспечение для резервного копирования может не выполнить резервное копирование настроек ACL.
Утилита tar не поддерживает ACL. Чтобы убедиться, что настройки ACL не будут потеряны при создании резервной копии, используйте star вместо tar. star работает с теми же параметрами, что и tar; он просто добавляет поддержку настроек ACL.
Вы также можете создать резервную копию ACL с помощью getfacl, которую можно восстановить с помощью команды setfacl. Чтобы создать резервную копию, используйте getfacl -R /directory > file.acls. Чтобы восстановить настройки из файла резервной копии, используйте setfacl –restore=file.acl.
Отсутствие поддержки некоторыми инструментами не должно быть проблемой. Списки ACL часто применяются к каталогам как структурная мера, а не к отдельным файлам.
Поэтому их будет не много, а всего лишь несколько, примененных в умных местах файловой системы. Следовательно, восстановить исходные списки ACL, с которыми вы работали, относительно легко, даже если ваше ПО для резервного копирования их не поддерживает.
Подготовка файловой системы для ACL
Перед началом работы с ACL может потребоваться подготовить файловую систему для поддержки ACL. Поскольку метаданные файловой системы необходимо расширять, не всегда есть поддержка по умолчанию для ACL в файловой системе. Если при настройке списков ACL для файловой системы вы получаете сообщение «operation not supported», возможно, в вашей файловой системе отсутствует поддержка ACL.
Чтобы это исправить, вам нужно добавить опцию acl mount в файле /etc/fstab, чтобы файловая система была смонтирована с поддержкой ACL по умолчанию.
Изменение и просмотр настроек ACL с помощью setfacl и getfacl
Чтобы установить ACL, вам нужна команда setfacl. Чтобы увидеть текущие настройки ACL, вам нужен getfacl. Команда ls -l не показывает никаких существующих ACL; он просто показывает + после списка разрешений, который указывает, что списки ACL применяются и к файлу.
Перед настройкой списков ACL всегда полезно показать текущие настройки ACL с помощью getfacl. Ниже на примере вы можете увидеть текущие права доступа, как показано с помощью ls -ld, а также как показано с getfacl. Если вы посмотрите достаточно внимательно, вы увидите, что показанная информация точно такая же.
[root@server1 /]# ls -ld /dir
drwxr-xr-x. 2 root root 6 Feb 6 11:28 /dir
[root@server1 /]# getfacl /dir
getfacl: Removing leading '/' from absolute path names
# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
В результате выполнения команды getfacl ниже видно, что разрешения показаны для трех разных объектов: пользователя, группы и других. Теперь давайте добавим ACL, чтобы дать права на чтение и выполнение и группе sales. Команда для этого setfacl -m g:sales:rx /dir. В этой команде -m указывает, что текущие настройки ACL необходимо изменить. После этого g:sales:rx сообщает команде установить ACL для чтения и выполнения (rx) для группы (g) sales. Ниже вы можете увидеть, как выглядит команда, а также вывод команды getfacl после изменения текущих настроек ACL.
[root@server1 /]# setfacl -m g:sales:rx /dir
[root@server1 /]# getfacl /dir
getfacl: Removing leading '/' from absolute path names
# file: dir
# owner: root
# group: root
user::rwx
group::r-x
group:sales:r-x
mask::r-x
other::r-x
Теперь, когда вы понимаете, как установить групповой ACL, легко понять ACL для пользователей и других пользователей. Например, команда setfacl -m u:linda:rwx /data дает разрешения пользователю linda в каталоге /data, не делая его владельцем и не изменяя назначение текущего владельца.
Команда setfacl имеет много возможностей и опций. Один вариант особенно важен, параметр -R. Если используется, опция делает настройку ACL для всех файлов и подкаталогов, которые в настоящее время существуют в каталоге, где вы устанавливаете ACL. Рекомендуется всегда использовать эту опцию при изменении списков ACL для существующих каталогов.
Работа с ACL по умолчанию
Одним из преимуществ использования списков ACL является то, что вы можете давать разрешения нескольким пользователям или группам в каталоге. Еще одним преимуществом является то, что вы можете включить наследование, работая с ACL по умолчанию.
Установив ACL по умолчанию, вы определите разрешения, которые будут установлены для всех новых элементов, создаваемых в каталоге. Имейте в виду, что ACL по умолчанию не меняет разрешения для существующих файлов и подкаталогов. Чтобы изменить их, нужно добавить и обычный ACL!
Это важно знать. Если вы хотите использовать ACL для настройки доступа нескольких пользователей или групп к одному и тому же каталогу, вы должны установить ACL дважды. Сначала используйте setfacl -R -m, чтобы изменить ACL для текущих файлов. Затем используйте setfacl -m d:, чтобы позаботиться обо всех новых элементах, которые также будут созданы.
Чтобы установить ACL по умолчанию, вам просто нужно добавить опцию d после опции -m (порядок имеет значение!). Поэтому используйте setfacl -m d:g:sales:rx /data, если вы хотите, чтобы группа sales имела доступ на чтение и выполнение всего, что когда-либо будет создано в каталоге /data.
При использовании списков ACL по умолчанию также может быть полезно установить ACL для других. Обычно это не имеет особого смысла, потому что вы также можете изменить разрешения для других, используя chmod. Однако, что вы не можете сделать с помощью chmod, это указать права, которые должны быть предоставлены другим пользователям для каждого нового файла, который когда-либо будет создан. Если вы хотите, чтобы другие не получали никаких разрешений на что-либо, созданное в /data, например, используйте setfacl -m d:o::- /data.
ACL и обычные разрешения не всегда хорошо интегрированы. Проблемы могут возникнуть, если вы применили ACL по умолчанию к каталогу, после чего элементы были добавлены в этот каталог, и затем попытаетесь изменить обычные разрешения. Изменения, которые применяются к обычным разрешениям, не будут хорошо отражены в обзоре ACL. Чтобы избежать проблем, сначала установите обычные разрешения, после чего установите ACL по умолчанию (и после этого старайтесь не изменять их снова).
Пример управления расширенными правами с использованием ACL
В этом примере вы продолжите работу с каталогами /data/account и /data/sales, которые вы создали ранее. В предыдущих примерах вы гарантировали, что группа sales имеет разрешения на /data/sales, а группа account имеет разрешения на /data/account.
Сначала убедитесь, что группа account получает разрешения на чтение в каталоге /data/sales, а группа sales получает разрешения на чтение в каталоге /data/account.
Затем вы устанавливаете списки ACL по умолчанию, чтобы убедиться, что для всех новых файлов правильно установлены разрешения для всех новых элементов.
- Откройте терминал.
- Выполните setfacl -m g:account:rx /data/sales и setfacl -m g:sales:rx /data/account.
- Выполните getfacl, чтобы убедиться, что права доступа были установлены так, как вы хотели.
- Выполните setfacl -m d:g:account:rwx,g:sales:rx /data/sales, чтобы установить ACL по умолчанию для каталога sales.
- Добавьте ACL по умолчанию для каталога /data/account, используя setfacl -m d:g:sales:rwx,g:account:rx /data/account.
- Убедитесь, что настройки ACL действуют, добавив новый файл в /data/sales. Выполните touch /data/sales/newfile и выполните getfacl /data/sales/newfile для проверки текущих разрешений.
Установка прав по умолчанию с помощью umask
Выше вы узнали, как работать с ACL по умолчанию. Если вы не используете ACL, есть параметр оболочки, который определяет права по умолчанию, которые вы получите: umask (обратная маска). В этом разделе вы узнаете, как изменить разрешения по умолчанию с помощью umask.
Вы, наверное, заметили, что при создании нового файла устанавливаются некоторые разрешения по умолчанию. Эти разрешения определяются настройкой umask. Этот параметр оболочки применяется ко всем пользователям при входе в систему. В параметре umask используется числовое значение, которое вычитается из максимальных разрешений, которые могут быть автоматически установлены для файла; максимальная настройка для файлов — 666, а для каталогов — 777.
Однако некоторые исключения относятся к этому правилу. Вы можете найти полный обзор настроек umask в таблице внизу.
Из цифр, используемых в umask, как и в случае числовых аргументов для команды chmod, первая цифра относится к разрешениям пользователя, вторая цифра относится к разрешениям группы, а последняя относится к разрешениям по умолчанию, установленным для других. Значение umask по умолчанию 022 дает 644 для всех новых файлов и 755 для всех новых каталогов, созданных на вашем сервере.
Полный обзор всех числовых значений umask и их результатов в таблице ниже.
Простой способ увидеть, как работает параметр umask, выглядит следующим образом: начните с разрешений по умолчанию для файла, установленного на 666, и вычтите umask, чтобы получить действующие разрешения. Сделайте то же самое для каталога и его разрешений по умолчанию 777.
Есть два способа изменить настройку umask: для всех пользователей и для отдельных пользователей. Если вы хотите установить umask для всех пользователей, вы должны убедиться, что параметр umask учитывается при запуске файлов среды оболочки, как указано в /etc/profile. Правильный подход — создать сценарий оболочки с именем umask.sh в каталоге /etc/profile.d и указать umask, который вы хотите использовать в этом сценарии оболочки. Если в этом файле изменяется umask, он применяется ко всем пользователям после входа на сервер.
Альтернативой настройке umask через /etc/profile и связанные файлы, где он применяется ко всем пользователям, входящим в систему, является изменение настроек umask в файле с именем .profile, который создается в домашнем каталоге каждого пользователя.
Настройки, примененные в этом файле, применяются только для отдельного пользователя; следовательно, это хороший метод, если вам нужно больше детализации. Мне лично нравится эта функция, чтобы изменить значение umask по умолчанию для пользователя root на 027, тогда как обычные пользователи работают с umask по умолчанию 022.
Работа с расширенными атрибутами пользователя
Это заключительный раздел о правах в Linux.
При работе с разрешениями всегда существует связь между объектом пользователя или группы и разрешениями, которые эти объекты пользователя или группы имеют для файла или каталога. Альтернативный метод защиты файлов на сервере Linux — работа с атрибутами.
Атрибуты выполняют свою работу независимо от пользователя, который обращается к файлу.
Как и в случае с ACL, для атрибутов файла может потребоваться включить параметр mount.
Это опция user_xattr. Если вы получаете сообщение «operation not supported» при работе с расширенными атрибутами пользователя, обязательно установите параметр mount в файле /etc/fstab.
Многие атрибуты задокументированы. Некоторые атрибуты доступны, но еще не реализованы. Не используйте их; они ничего вам не принесут.
Ниже приведены наиболее полезные атрибуты, которые вы можете применить:
A Этот атрибут гарантирует, что время доступа к файлу файла не изменяется.
Обычно каждый раз, когда файл открывается, время доступа к файлу должно быть записано в метаданные файла. Это отрицательно влияет на производительность; поэтому для файлов, к которым осуществляется регулярный доступ, атрибут A можно использовать для отключения этой функции.
a Этот атрибут позволяет добавлять, но не удалять файл.
c Если вы используете файловую систему, в которой поддерживается сжатие на уровне тома, этот атрибут файла гарантирует, что файл будет сжат при первом включении механизма сжатия.
D Этот атрибут гарантирует, что изменения в файлах записываются на диск немедленно, а не в кэширование в первую очередь. Это полезный атрибут в важных файлах базы данных, позволяющий убедиться, что они не теряются между файловым кешем и жестким диском.
d Этот атрибут гарантирует, что файл не будет сохранен в резервных копиях, где используется утилита дампа.
I Этот атрибут включает индексирование для каталога, в котором он включен. Это обеспечивает более быстрый доступ к файлам для примитивных файловых систем, таких как Ext3, которые не используют базу данных B-tree для быстрого доступа к файлам.
i Этот атрибут делает файл неизменным. Следовательно, в файл нельзя вносить изменения, что полезно для файлов, которые нуждаются в дополнительной защите.
j Этот атрибут гарантирует, что в файловой системе ext3 файл сначала записывается в журнал, а затем — в блоки данных на жестком диске.
s Перезаписать блоки, в которых файл был сохранен, на 0 с после удаления файла. Это гарантирует, что восстановление файла невозможно после того, как он был удален.
u Этот атрибут сохраняет информацию об удалении. Это позволяет разрабатывать утилиту, которая работает с этой информацией для спасения удаленных файлов.
Если вы хотите применить атрибуты, вы можете использовать команду chattr. Например, используйте chattr +s somefile, чтобы применить атрибуты к somefile. Нужно удалить атрибут? Тогда используйте chattr -s somefile, и он будет удален. Чтобы получить обзор всех атрибутов, которые в настоящее время применяются, используйте команду lsattr.
Резюме
В этой статье вы узнали, как работать с разрешениями. Вы прочитали о трех основных разрешениях, расширенных разрешениях и о том, как применять ACL-списки в файловой системе. Вы также узнали, как использовать параметр umask для применения разрешений по умолчанию. В конце этой статьи вы узнали, как использовать расширенные пользователем атрибуты для применения дополнительного уровня безопасности файловой системы.
Если вам понравился этот перевод, то прошу написать об этом в комментариях. Будет больше мотивации делать полезные переводы.
В статье исправил некоторые опечатки и грамматические ошибки. Уменьшил некоторые громоздкие абзацы на более мелкие для удобства восприятия.
Вместо «Только кто-то с административными правами на каталог может применять разрешение на выполнение.» исправил на «Только кто-то с правами записи на каталог может применять разрешение на выполнение.», что будет более правильным.
За замечания спасибо berez.
Заменил:
Если вы не являетесь владельцем пользователя, оболочка проверит, являетесь ли вы участником группы, которая также называется группой файла.На:
Если вы не являетесь владельцем файла, оболочка проверит, являетесь ли вы участником группы, у которой есть разрешения на этот файл. Если вы являетесь участником этой группы, вы получаете доступ к файлу с разрешениями, которые для группы установлены, и оболочка прекратит проверку.Спасибо за замечание CryptoPirate
Система полномочий в Linux имеет очень важное значение, поскольку благодаря ей можно разделять привилегии между пользователями, ограничить доступ к нежелательным файлам или возможностям, контролировать доступные действия для сервисов и многое другое. В Linux существует всего три вида прав – право на чтение, запись и выполнение, а также три категории пользователей, к которым они могут применяться – владелец файла, группа файла и все остальные.
Эти права применяются для каждого файла, а поскольку все в системе Linux, даже устройства, считаются файлами, то, получается что эти права применимы ко всему. Мы более подробно рассматривали как работают права доступа к файлам Linux в отдельной статье, а этой, я хочу остановиться на команде chmod, которая используется для установки прав.
Эта команда имеет типичный для команд linux синтаксис, сначала команда, затем опции, а в конце файл или папка, к которой ее нужно применить:
$ chmod опции права /путь/к/файлу
Сначала рассмотрим какими бывают права доступа linux и как они устанавливаются. Пред этим рекомендую прочитать статью про права, ссылка на которую есть выше. Есть три основных вида прав:
- r – чтение;
- w – запись;
- x – выполнение;
- s – выполнение от имени суперпользователя (дополнительный);
Также есть три категории пользователей, для которых вы можете установить эти права на файл linux:
- u – владелец файла;
- g – группа файла;
- o – все остальные пользователи;
Синтаксис настройки прав такой:
группа_пользователейдействиевид_прав
В качестве действий могут использоваться знаки “+” – включить или “-“ – отключить. Рассмотрим несколько примеров:
- u+x – разрешить выполнение для владельца;
- ugo+x – разрешить выполнение для всех;
- ug+w – разрешить запись для владельца и группы;
- o-x – запретить выполнение для остальных пользователей;
- ugo+rwx – разрешить все для всех;
Но права можно записывать не только таким способом. Есть еще восьмеричный формат записи, он более сложен для понимания, но пишется короче и проще. Я не буду рассказывать как считать эти цифры, просто запомните какая цифра за что отвечает, так проще:
- 0 – никаких прав;
- 1 – только выполнение;
- 2 – только запись;
- 3 – выполнение и запись;
- 4 – только чтение;
- 5 – чтение и выполнение;
- 6 – чтение и запись;
- 7 – чтение запись и выполнение.
Права на папку linux такие же, как и для файла. Во время установки прав сначала укажите цифру прав для владельца, затем для группы, а потом для остальных. Например, :
- 744 – разрешить все для владельца, а остальным только чтение;
- 755 – все для владельца, остальным только чтение и выполнение;
- 764 – все для владельца, чтение и запись для группы, и только чтение для остальных;
- 777 – всем разрешено все.
Каждая из цифр не зависит от предыдущих, вы вбираете именно то, что вам нужно. Теперь давайте рассмотрим несколько опций команды, которые нам понадобятся во время работы:
- -c – выводить информацию обо всех изменениях;
- -f – не выводить сообщения об ошибках;
- -v – выводить максимум информации;
- –preserve-root – не выполнять рекурсивные операции для корня “/”;
- –reference – взять маску прав из указанного файла;
- -R – включить поддержку рекурсии;
- –version – вывести версию утилиты;
Теперь, когда вы знаете опции и как настраиваются права доступа chmod, давайте рассмотрим несколько примеров как работает команда chmod linux.
Примеры использования chmod
Я не буду приводить много примеров, так как там и так все более-менее понятно после пояснения правил создания выражений установки прав. Сначала самый частый случай – разрешить выполнения скрипта владельцу:
chmod u+x file
Или можно воспользоваться цифровой записью:
chmod 766 file
ls - l file
Недостаток цифровой записи в том, что вы не можете модифицировать уже существующие права доступа linux. Например, в первом варианте вы просто добавили флаг выполнения для владельца файла, а все остальные права оставили неизменными. В восьмеричном варианте мы полностью заменили текущие права новыми – все для владельца и чтение/запись для группы и остальных. Как видите, права установлены как и ожидалось. Теперь отключим выполнение владельцем:
chmod u-x file
И снова проверяем:
ls -l file
Дальше разрешим только чтение всем, кроме владельца:
chmod 744 file
ls -l file
Или отберем все права:
chmod ugo-rwx file
Файлы с правами 000 недоступны никаким пользователям, кроме суперпользователя и владельца. Вернем права обратно:
chmod 755 file
ls -l file
Такая же ситуация с файлами, владельцем которых вы не являетесь, если вы хотите изменить их права – используйте sudo. Из модификаторов прав вы можете конструировать любые последовательности, я думаю тут нет смысла разбирать их все. Для того чтобы поменять права на все файлы в папке используйте опцию -R:
chmod -R ug+rw dir
ls -l dir/
Также вы можете смотреть подробную информацию про вносимые изменения, например:
chmod -Rv ug+rw dir
Выводы
В этой небольшой статье была рассмотрена команда chmod linux. Она очень часто используется наряду с такими командами, как chown и umask для управления правами. Надеюсь, эта информация была полезной для вас. Если у вас остались вопросы, спрашивайте в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
File systems use permissions and attributes to regulate the level of interaction that system processes can have with files and directories.
Warning: When used for security purposes, permissions and attributes only defend against attacks launched from the booted system. To protect the stored data from attackers with physical access to the machine, one must also implement data-at-rest encryption.
Viewing permissions
Use the ls command’s -l
option to view the permissions (or file mode) set for the contents of a directory, for example:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie archie 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie archie 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie archie 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie archie 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie archie 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie archie 2048 Jul 6 12:56 myscript.sh
The first column is what we must focus on. Taking an example value of drwxrwxrwx+
, the meaning of each character is explained in the following tables:
d
|
rwx
|
rwx
|
rwx
|
+
|
The file type, technically not part of its permissions. See info ls -n "What information is listed" for an explanation of the possible values.
|
The permissions that the owner has over the file, explained below. | The permissions that the group has over the file, explained below. | The permissions that all the other users have over the file, explained below. | A single character that specifies whether an alternate access method applies to the file. When this character is a space, there is no alternate access method. A . character indicates a file with a security context, but no other alternate access method. A file with any other combination of alternate access methods is marked with a + character, for example in the case of Access Control Lists.
|
Each of the three permission triads (rwx
in the example above) can be made up of the following characters:
Character | Effect on files | Effect on directories | |
---|---|---|---|
Read permission (first character) | -
|
The file cannot be read. | The directory’s contents cannot be shown. |
r
|
The file can be read. | The directory’s contents can be shown. | |
Write permission (second character) | -
|
The file cannot be modified. | The directory’s contents cannot be modified. |
w
|
The file can be modified. | The directory’s contents can be modified (create new files or directories; rename or delete existing files or directories); requires the execute permission to be also set, otherwise this permission has no effect. | |
Execute permission (third character) | -
|
The file cannot be executed. | The directory cannot be accessed with cd. |
x
|
The file can be executed. | The directory can be accessed with cd; this is the only permission bit that in practice can be considered to be “inherited” from the ancestor directories, in fact if any directory in the path does not have the x bit set, the final file or directory cannot be accessed either, regardless of its permissions; see path_resolution(7) for more information.
|
|
s
|
The setuid bit when found in the user triad; the setgid bit when found in the group triad; it is not found in the others triad; it also implies that x is set.
|
||
S
|
Same as s , but x is not set; rare on regular files, and useless on directories.
|
||
t
|
The sticky bit; it can only be found in the others triad; it also implies that x is set.
|
||
T
|
Same as t , but x is not set; rare on regular files.
|
See info Coreutils -n "Mode Structure"
and chmod(1) for more details.
Tip: You can view permissions along a path with namei -l path
.
Examples
Let us see some examples to clarify:
drwx------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie has full access to the Documents
directory. They can list, create files and rename, delete any file in Documents, regardless of file permissions. Their ability to access a file depends on the file’s permissions.
dr-x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie has full access except they can not create, rename, delete any file. They can list the files and (if the file’s permissions allow it) may access an existing file in Documents.
d-wx------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie can not do ls
in the Documents
directory but if they know the name of an existing file then they may list, rename, delete or (if the file’s permissions allow it) access it. Also, they are able to create new files.
d--x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie is only capable of (if the file’s permissions allow it) accessing those files the Documents
directory which they know of. They can not list already existing files or create, rename, delete any of them.
You should keep in mind that we elaborate on directory permissions and it has nothing to do with the individual file permissions. When you create a new file it is the directory that changes. That is why you need write permission to the directory.
Let us look at another example, this time of a file, not a directory:
-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
Here we can see the first letter is not d
but -
. So we know it is a file, not a directory. Next the owner’s permissions are rw-
so the owner has the ability to read and write but not execute. This may seem odd that the owner does not have all three permissions, but the x
permission is not needed as it is a text/data file, to be read by a text editor such as Gedit, EMACS, or software like R, and not an executable in its own right (if it contained something like python programming code then it very well could be). The group’s permissions are set to r--
, so the group has the ability to read the file but not write/edit it in any way — it is essentially like setting something to read-only. We can see that the same permissions apply to everyone else as well.
Changing permissions
chmod is a command in Linux and other Unix-like operating systems that allows to change the permissions (or access mode) of a file or directory.
Text method
To change the permissions — or access mode — of a file, use the chmod command in a terminal. Below is the command’s general structure:
chmod who=permissions filename
Where who
is any from a range of letters, each signifying who is being given the permission. They are as follows:
u
: the user that owns the file.g
: the user group that the file belongs to.o
: the other users, i.e. everyone else.a
: all of the above; use this instead of typingugo
.
The permissions are the same as discussed in #Viewing permissions (r
, w
and x
).
Now have a look at some examples using this command. Suppose you became very protective of the Documents directory and wanted to deny everybody but yourself, permissions to read, write, and execute (or in this case search/look) in it:
Before: drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents
$ chmod g= Documents $ chmod o= Documents
After: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
Here, because you want to deny permissions, you do not put any letters after the =
where permissions would be entered. Now you can see that only the owner’s permissions are rwx
and all other permissions are -
.
This can be reverted with:
Before: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
$ chmod g=rx Documents $ chmod o=rx Documents
After: drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents
In the next example, you want to grant read and execute permissions to the group, and other users, so you put the letters for the permissions (r
and x
) after the =
, with no spaces.
You can simplify this to put more than one who
letter in the same command, e.g:
$ chmod go=rx Documents
Note: It does not matter in which order you put the who
letters or the permission letters in a chmod
command: you could have chmod go=rx file
or chmod og=xr file
. It is all the same.
Now let us consider a second example, suppose you want to change a foobar
file so that you have read and write permissions, and fellow users in the group web
who may be colleagues working on foobar
, can also read and write to it, but other users can only read it:
Before: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
After: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
This is exactly like the first example, but with a file, not a directory, and you grant write permission (just so as to give an example of granting every permission).
Text method shortcuts
The chmod command lets add and subtract permissions from an existing set using +
or -
instead of =
. This is different from the above commands, which essentially re-write the permissions (e.g. to change a permission from r--
to rw-
, you still need to include r
as well as w
after the =
in the chmod command invocation. If you missed out r
, it would take away the r
permission as they are being re-written with the =
. Using +
and -
avoids this by adding or taking away from the current set of permissions).
Let us try this +
and -
method with the previous example of adding write permissions to the group:
Before: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
After: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
Another example, denying write permissions to all (a):
Before: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
After: -r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar
A different shortcut is the special X
mode: this is not an actual file mode, but it is often used in conjunction with the -R
option to set the executable bit only for directories, and leave it unchanged for regular files, for example:
$ chmod -R a+rX ./data/
Copying permissions
It is possible to tell chmod to copy the permissions from one class, say the owner, and give those same permissions to group or even all. To do this, instead of putting r
, w
, or x
after the =
, put another who letter. e.g:
Before: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
After: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
This command essentially translates to “change the permissions of group (g=
), to be the same as the owning user (=u
). Note that you cannot copy a set of permissions as well as grant new ones e.g.:
$ chmod g=wu foobar
In that case chmod throw an error.
Numeric method
chmod can also set permissions using numbers.
Using numbers is another method which allows you to edit the permissions for all three owner, group, and others at the same time, as well as the setuid, setgid, and sticky bits. This basic structure of the code is this:
$ chmod xxx filename
Where xxx
is a 3-digit number where each digit can be anything from 0 to 7. The first digit applies to permissions for owner, the second digit applies to permissions for group, and the third digit applies to permissions for all others.
In this number notation, the values r
, w
, and x
have their own number value:
r=4 w=2 x=1
To come up with a 3-digit number you need to consider what permissions you want owner, group, and all others to have, and then total their values up. For example, if you want to grant the owner of a directory read write and execution permissions, and you want group and everyone else to have just read and execute permissions, you would come up with the numerical values like so:
- Owner:
rwx
=4+2+1=7 - Group:
r-x
=4+0+1=5 - Other:
r-x
=4+0+1=5
$ chmod 755 filename
This is the equivalent of using the following:
$ chmod u=rwx filename $ chmod go=rx filename
To view the existing permissions of a file or directory in numeric form, use the stat(1) command:
$ stat -c %a filename
Where the %a option specifies output in numeric form.
Most directories are set to 755
to allow reading, writing and execution to the owner, but deny writing to everyone else, and files are normally 644
to allow reading and writing for the owner but just reading for everyone else; refer to the last note on the lack of x
permissions with non executable files: it is the same thing here.
To see this in action with examples consider the previous example that has been used but with this numerical method applied instead:
Before: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
After: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
If this were an executable the number would be 774
if you wanted to grant executable permission to the owner and group. Alternatively if you wanted everyone to only have read permission the number would be 444
. Treating r
as 4, w
as 2, and x
as 1 is probably the easiest way to work out the numerical values for using chmod xxx filename
, but there is also a binary method, where each permission has a binary number, and then that is in turn converted to a number. It is a bit more convoluted, but here included for completeness.
Consider this permission set:
-rwxr-xr--
If you put a 1 under each permission granted, and a 0 for every one not granted, the result would be something like this:
-rwxrwxr-x 111111101
You can then convert these binary numbers:
000=0 100=4 001=1 101=5 010=2 110=6 011=3 111=7
The value of the above would therefore be 775.
Consider we wanted to remove the writable permission from group:
-rwxr-xr-x 111101101
The value would therefore be 755 and you would use chmod 755 filename
to remove the writable permission. You will notice you get the same three digit number no matter which method you use. Whether you use text or numbers will depend on personal preference and typing speed. When you want to restore a directory or file to default permissions e.g. read and write (and execute) permission to the owner but deny write permission to everyone else, it may be faster to use chmod 755/644 filename
. However if you are changing the permissions to something out of the norm, it may be simpler and quicker to use the text method as opposed to trying to convert it to numbers, which may lead to a mistake. It could be argued that there is not any real significant difference in the speed of either method for a user that only needs to use chmod on occasion.
You can also use the numeric method to set the setuid
, setgid
, and sticky
bits by using four digits.
setuid=4 setgid=2 sticky=1
For example, chmod 2777 filename
will set read/write/executable bits for everyone and also enable the setgid
bit.
Bulk chmod
Generally directories and files should not have the same permissions. If it is necessary to bulk modify a directory tree, use find to selectively modify one or the other.
To chmod only directories to 755:
$ find directory -type d -exec chmod 755 {} +
To chmod only files to 644:
$ find directory -type f -exec chmod 644 {} +
Changing ownership
chown changes the owner of a file or directory, which is quicker and easier than altering the permissions in some cases.
Consider the following example, making a new partition with GParted for backup data. Gparted does this all as root so everything belongs to root by default. This is all well and good but when it comes to writing data to the mounted partition, permission is denied for regular users.
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
As you can see the device in /dev
is owned by root, as is the mount location (/media/Backup
). To change the owner of the mount location one can do the following:
Before: drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
# chown archie /media/Backup
After: drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup
Now the partition can have data written to it by the new owner, archie, without altering the permissions (as the owner triad already had rwx
permissions).
Note:
chown
always clears the setuid and setgid bits.- Non-root users cannot use
chown
to “give away” files they own to another user.
Access Control Lists
Access Control Lists provides an additional, more flexible permission mechanism for file systems by allowing to set permissions for any user or group to any file.
Umask
The umask utility is used to control the file-creation mode mask, which determines the initial value of file permission bits for newly created files.
File attributes
Apart from the file mode bits that control user and group read, write and execute permissions, several file systems support file attributes that enable further customization of allowable file operations.
Warning: By default, file attributes are not preserved by cp, rsync, and other similar programs.
The e2fsprogs package contains the programs lsattr(1) and chattr(1) that list and change a file’s attributes, respectively.
These are a few useful attributes. Not all filesystems support every attribute.
a
– append only: File can only be opened for appending.c
– compressed: Enable filesystem-level compression for the file.i
– immutable: Cannot be modified, deleted, renamed, linked to. Can only be set by root.j
– data journaling: Use the journal for file data writes as well as metadata.m
– no compression: Disable filesystem-level compression for the file.A
– no atime update: The file’s atime will not be modified.C
– no copy on write: Disable copy-on-write, for filesystems that support it.
See chattr(1) for a complete list of attributes and for more info on what each attribute does.
For example, if you want to set the immutable bit on some file, use the following command:
# chattr +i /path/to/file
To remove an attribute on a file just change +
to -
.
Extended attributes
From xattr(7): “Extended attributes are name:value pairs associated permanently with files and directories”. There are four extended attribute classes: security, system, trusted and user.
Warning: By default, extended attributes are not preserved by cp, rsync, and other similar programs, see #Preserving extended attributes.
Extended attributes are also used to set Capabilities.
User extended attributes
User extended attributes can be used to store arbitrary information about a file. To create one:
$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.txt
Use getfattr to display extended attributes:
$ getfattr -d foo.txt
# file: foo.txt user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"
Finally, to remove an extended attribute:
$ setfattr -x user.checksum foo.txt
Preserving extended attributes
Command | Required flag |
---|---|
cp |
--preserve=mode,ownership,timestamps,xattr
|
mv |
preserves by default1 |
tar |
--xattrs for creation and --xattrs-include='*' for extraction
|
bsdtar |
-p for extraction
|
rsync | --xattrs
|
- mv silently discards extended attributes when the target file system does not support them.
To preserve extended attributes with text editors you need to configure them to truncate files on saving instead of using rename(2).[1]
Tips and tricks
Preserve root
Use the --preserve-root
flag to prevent chmod
from acting recursively on /
. This can, for example, prevent one from removing the executable bit systemwide and thus breaking the system. To use this flag every time, set it within an alias. See also [2].
See also
- wikipedia:Chattr
- Linux File Permission Confusion
- Linux File Permission Confusion part 2
- wikipedia:Extended file attributes#Linux
- Extended attributes: the good, the not so good, the bad.
- Backup and restore file permissions in Linux
- Why is “chmod -R 777 /” destructive?
- The How and Why of User Private Groups in Unix
Команда chmod, команда chown и команда chgrp.
Оглавление
- Команда chmod
- Изменение прав доступа командой chmod
- Запись прав доступа числом
- Запись прав доступа символами
- Рекурсивное изменение прав доступа
- Видео-обзор команды chmod
- Команда chown — изменение владельца и группы
- Команда chgrp — изменение группы
- Изменение прав доступа командой chmod
- Резюме
Команда chmod
Команда chmod предназначена для изменения прав доступа файлов и директорий в Linux. Название команды произошло от словосочетания «change mode».
Синтаксис команды chmod следующий:
chmod разрешения имя_файла
Разрешения можно задавать двумя способами:
- Числом
- Символами
Изменение прав доступа командой chmod
Запись прав доступа числом
Пример:
chmod 764 myfile
В данном формате права доступа задаются не символами rwx, как описано выше, а трехзначным числом. Каждая цифра числа означает определенный набор прав доступа.
- Первая цифра используется для указания прав доступа для пользователя.
- Вторая цифра для группы.
- Третья для всех остальных.
В таблице ниже приводятся все возможные комбинации разрешений rwx и соответсвующие им числа (которые используются в команде chmod):
Число | Разрешения | Символьное обозначение |
---|---|---|
0 | разрешения отсутствуют | — |
1 | x — запуск | –x |
2 | w — изменение | -w- |
3 | x+w — запуск+изменение | -wx |
4 | r — чтение | r– |
5 | r+x — чтение+запуск | r-x |
6 | r+w — чтение+изменение | rw- |
7 | r+w+x — чтение+изменение+запуск | rwx |
Рассмотрим использование команды chmod с записью прав доступа числом на примере. Установим для файла права доступа 764:
chmod 764 myfile
Это означает (см. таблицу выше), что для файла myfile мы устанавливаем права доступа 764, которые означают:
- 7 — права для владельца-пользователя. Владелец файла может читать, изменять и запускать файл (r+w+x).
- 6 — права для группы. Пользователи, которые принадлежат группе могут читать и изменять файл (r+w).
- 4 — права для всех остальных. Все остальные могут только читать файл (r).
Если записать 764 с помощью символов (см. таблицу), то мы получим: «rwxrw-r-».
В таблице ниже приведены некоторые часто используемые значения числовых значений прав доступа:
Числовое обозначение |
“rwx”-обозначение | Описание |
---|---|---|
400 | -r——– | Владелец файла может только читать файл. Для всех остальных все действия с файлом запрещены. |
644 | -rw-r–r– | Все пользователи могут читать файл. Владелец может изменять файл. |
660 | -rw-rw—- | Владелец и группа могут читать и изменять файл. Для всех остальных все действия с файлом запрещены. |
664 | -rw-rw-r– | Все могут читать файл. Владелец и группа могут изменять. |
666 | -rw-rw-rw- | Все могут читать и изменять файл. |
700 | -rwx—— | Владелец может читать, изменять и запускать файл. Для всех остальных все действия с файлом запрещены. |
744 | -rwxr–r– | Все могут читать файл. Владелец может также изменять и запускать файл. |
755 | -rwxr-xr-x | Все могут читать и запускать файл. Владелец может также изменять файл. |
777 | -rwxrwxrwx | Все пользователи могут читать, изменять и редактировать файл. |
Запись прав доступа символами
Примеры:
chmod +x myfile1
chmod g=rw myfile2
chmod u-w myfile3
Как вы можете видеть, в данном формате права доступа задаются символами rwx, но в синтаксисе используются и другие вспомогательные символы, например, математические операции «+» и «–» и такие символы как, например, «g» или «u».
Общий синтаксис можно записать примерно так:
chmod (владелец)(математическая операция)(разрешения) имя_файла
Обозначения для владельцев файла следующие:
Обозначение | Описание |
---|---|
u | Владелец-пользователь. |
g | Группа. |
o | Все остальные. |
a | Вообще все. |
Математические операции означают следующее:
Оператор | Описание |
---|---|
+ | Добавляет к текущим правам доступа новое разрешение. |
– | Удаляет из текущих прав доступа определенное разрешение. |
= | Устанавливает полностью новые разрешения (предыдущие перезаписываются новыми). |
В одной команде можно перечислять владельцев и их разрешения через запятую (см. пример ниже).
Рассмотрим примеры:
-
chmod +x myfile1
В данном случае мы не используем обозначения для владельцев, а значит разрешения устанавливаются для всех пользователей. «+x» означает — установить разрешение на запуск (x) файла для всех пользователей. Это эквивалентно выполнению команды: chmod a+x myfile1.
-
chmod g=rw myfile2
Здесь используется обозначение g и символ равенства «=». Это означает, что для группы мы устанавливаем права доступа на чтение и запись файла (rw).
-
chmod u-w myfile3
Для владельца файла (u) мы удаляем разрешение на изменение (w) файла.
-
chmod ug+x myfile2
Разрешаем владельцу (u) и группе (g) запускать файл (x).
-
chmod u+x,g-w,o-r myfile3
Это как раз тот случай, когда мы перечисляем владельцев через запятую и устанавливаем для них разрешения. Для владельца файла (u) мы разрешаем запуск файла, для группы (g) мы запрещаем изменять файл, для всех остальных (o) мы запрещаем читать файл.
Рекурсивное изменение прав доступа
Если необходимо изменить права доступа на все файлы в директории, включая вложенные директории, то для этого существует опция -R, что означает рекурсивное изменение прав доступа для директорий и их содержимого. Например, изменим права доступа у всех файлов в директории Mydir:
chmod -R 644 Mydir
И еще один момент. Если пользователь не является владельцем файла, но ему нужно изменить права доступа у данного файла, то команду chmod необходимо выполнять с использованием sudo, например:
sudo chmod 644 file
Видео-обзор команды chmod
Команда chown — изменение владельца и группы
Для изменения владельца и группы файла используется команда chown.
Для изменения владельца файла используется следующий синтаксис:
chown новый_владелец имя_файла
Например, установим для файла myfile нового владельца vasya:
chown vasya myfile
Для изменения владельца и группы файла используется следующий синтаксис:
chown новый_владелец:новая_группа имя_файла
Например, установим для файла myfile нового владельца vasya и группу sambashare:
chown vasya:sambashare myfile
Команда chgrp — изменение группы
Есть еще одна команда — chgrp. Она позволяет изменить только группу. Например:
chgrp sambashare myfile
Резюме
В Linux у каждого файла есть права доступа — это разрешения, владелец и группа.
Разрешения задаются для владельца, группы и для всех остальных.
Есть три вида разрешений — r — чтение, w — изменение, x — запуск.
Чтобы изменить разрешения у файла используется команда chmod.
Чтобы изменить владельца или группу используется команда chown.
Чтобы изменить группу используется chgrp.
Just as with other operating systems, multiple users can create user accounts and share the same machine running Linux OS.
But whenever different users share a system, problems of privacy can easily arise. The first user may not wish the next user to view, edit, or delete their files, for example.
The Linux Terminal possesses some superpowers when it comes to handling file permissions. You can grant or revoke permissions for every file and directory from your Linux Terminal.
File permissions control which actions can be performed by which users. Read, Write, and Execute are the three actions possible for every file.
Users are classified under three broad categories: Normal users, Groups, and Others. Linux allows users to set permissions at a very granular level. You can secure your file or directory in every possible location of a file system.
This seems useful, right?
There are three important commands you’ll use when managing file permissions:
chmod
(Change mode)chown
(Change ownership)chgrp
(Change group)
Among these, chmod
is one of the most important commands. We’ll discuss the chmod
command in this tutorial, and I’ll get into the others in upcoming articles.
Let’s deep dive into the chmod
command 🏊.
Actions you can perform on a file
Before we proceed further, I want to make sure you’re clear about how the Read, Write, and Execute actions of a file work. Read and write are pretty are self-explanatory – they determine whether a user can read or write to a file.
But, what’s an executable file?
A file is said to be executable if it has a sequence of instructions to achieve something. A good example is scripting files (Shell Scripts).
What is the chmod
Command?
chmod
is a command that lets you change the permissions of a file or directory to all types of users.
Here’s the syntax of the chmod command:
chmod <Operations> <File/Directory Name>
You can grant or revoke the permission by replacing the Operations in the above command.
What are the operations you can perform?
The Operations in the above syntax are divided into 2 categories. Let’s explore them below.
User Level permissions
These operations control permissions on the user level. Here’s the commands you can use:
u
– Grant permission to a userg
– Grant permission to a group (A Group of users)o
– Grant permission to others (who do not come under either of the above).
Note: If this option is left empty, permissions will be applied to the logged-in user. Most of the time it’ll be left empty.
File Level permissions
These control permissions on the file level.
r
– Grants read permissionw
– Grant write permissionx
– Grant execute permission
These operations need to be preceded with a ‘+’ or ‘-‘ operator.
‘+’ indicates adding a new permission, and ‘-‘ indicates removing an existing permission.
Here’s an example:
chmod +r sample.txt
The above command adds read permission for the sample.txt
file.
Pretty straightforward, right? Let’s continue.
How to Make a File Executable in Linux
I can explain this more clearly with an example from my experience.
Linux is the default operating system of my team. We recently hired an intern, who has zero knowledge of Linux but was curious to learn and explore. We started to train him initially by asking him to write some shell scripts, because most servers run Linux OS. He found the entire code on the internet and copied it (we gave such a task intentionally).
He saved the file but was not able to run the script. He didn’t know the actual problem. He started removing a few blocks of code and tried to run it again and again.
He repeatedly got the error stating “Command not found”.
Finally, he reached the 1st line. He replaced that line with a print statement (the “echo” command) and ran the file with the hope to see the output. But he still hadn’t found that error.
With some frustration, he asked for help.
Let’s see the issue now.
Basically, we can execute .sh files by just running them like this:
./install.sh
Let’s see the code inside install.sh
echo "This is executable file 🎉"
He ran the same command but it did not work. This is because the file was not in executable format. So I ran the magic command to make the file executable:
chmod +x install.sh
Now it is executable. He stared at me as if I was a hacker 😂. But really, it’s a pretty simple and basic concept.
How to Remove Permissions from a File in Linux
I work with my colleague Divad on lots of projects, and he likes to try to fool me. We work together on many hobby projects and we often write shell scripts for quick deployment.
Whenever he writes shell scripts, he always removes all the permissions from the file and pushes the changes to the remote repo. So every time I have to grant permissions using the above commands for whatever action I have to do.
Let’s have a quick look at the command he uses to remove file permissions.
Here we have a file named install.sh
which has all permissions (Read, Write, Execute). Let’s remove the execute permission for this script file.
chmod -x install.sh
You’ll not be able to execute this file now. Trying so will give you an error as shown in the above screenshot.
Let’s remove the read permission from the file.
chmod -r install.sh
Alright, with this command we’ve removed the read permission. Let’s try to read that file using Nano (the file editor for the Linux terminal). You will be able to see the “Permission Denied” error at the bottom.
The same applies to removing write permission from the file:
chmod -w install.sh
You can achieve all the above together using the below command:
chmod -rwx install.sh
This is the core part of handling file permissions in Linux. Remember that we have barely scratched the surface of it, though. Try to understand it and play around with some sample files. Because who knows – in the future, you may get a colleague like Divad. 🙂
How to Add or Remove Permissions for Directories (Folders) in Linux
If you work with Linux, you might have come across various directories such as /etc
, /var
, /opt
, and others. But you may not be aware of why these directories exist.
There’s one thing in common for all these folders, though: that is, you’ll not be able to create a file or folder inside them without root permission.
This setting will be pre-configured in your system when Linux OS is installed.
But, you might wonder, can I restrict my folder in a /home
directory similar to the above directories? The answer is yes. You can achieve this by changing the permission of the directory using the chmod
command.
Let’s understand this with an example.
I created a directory named locked_directory
and removed read permission from this directory. If I try to read the contents of the folder using the ls
command, I’ll end up seeing the “Permission Denied” error message.
chmod -r locked_directory/
chmod
command to remove read permission from a directoryBut, did you know that I can create another directory inside locked_directory
named dir1
and read the files and folders in dir1
?
Then what’s the purpose of the command we just ran before? Removing the read permission on the parent should remove the same on child directories too, right?
Well. That’s the exact thing I told you earlier. Linux manages a very granular level of file permissions.
If you want to apply the permissions to the parent directory and all its child directories, you need to pass an exclusive flag with the chmod
command.
That flag is -R
. It basically means applying the same permissions recursively to all sub-directories (child directories). So this permission will apply to the end child of a file/directory.
Here’s the syntax for that:
sudo chmod -R <permission> <filename>
Remember that running the command to do a recursive operation needs root permission. So you need to add sudo
at the beginning of this command. Here’s what it looks like:
sudo chmod -R -r locked_directory
From the above screenshot, you can see that trying to view the child directory files has failed after removing the read permission recursively from the parent directory.
Another Way to Handle File Permissions in Linux
Alternatively, you can use Octal representation to control the file permissions.
We can use numbers to represent file permissions (the method most commonly used to set permissions). When you change permissions using the Octal mode, you represent permissions for each triplet using a number (4, 2, 1, or combination of 4, 2, and 1).
Let’s see the syntax for using octal mode:
chmod <user><group><others> install.sh
Here’s an example of octal mode:
chmod 777 install.sh
How can I remove permissions using Octal Mode?
We can use 0
to remove permissions from a file. Here’s an example:
chmod 000 install.sh
Access | Symbolic Mode | Octal Mode |
Read | r | 4 |
Write | w | 2 |
Execute | x | 1 |
The table shows the Octal code for each file permission:
Access | Symbolic Mode Eg:u+rwx,g+rw,o+r |
Octal Mode Eg:764 ( User, Group, Others ) |
User | u | <first place> |
Group | g | <middle place> |
Others | o | <last place> |
You might be confused 😖. Read further to understand clearly.
Let’s consider a scenario.
You want to grant read, write, and execute permissions to users and read-only permission for groups and others to the install.sh
file.
Let’s see how to do that using the above two methods.
How to manage permissions in Symbolic Mode
chmod u+rwx,go+r install.sh
Let’s dismantle each part and try to understand them:
u+rwx
represents adding read, write, and execute permissions for usersgo+r
represents adding read permission for groups and others
How to manage permissions in Octal Mode
chmod 744 install.sh
Let’s dismantle each of these numbers and try to understand them:
- The first number (7) represents permission for a user: 7 = ( 4 (
read
) +2 (write
) +1(execute
) ) - The second number (4) represents permissions for a group: 4 (
read
) - The third number (4) represents permissions for others: 4 (
read
)
Which Mode is Best?
It turns out that symbolic mode is more powerful than octal mode.
The reason is, in the symbolic mode we can mask out the permission bits we want to change. But in octal mode, permission modes are absolute and can’t be used to change individual bits.
How to Find Permissions of a File
We can find the existing permissions of a file using ls command.
I hope you all know about ls
command. Adding the -l
flag and file name with the ls
command shows some more info about the file, including the permissions.
ls -l install.sh
Look at the first part of the output (-rwxrwxrwx
) from the above screenshot. Let’s explore what it means:
The first character indicates the type of input.
- “-” indicates a file
- “d” indicates a directory
- “i” indicates a link (a symlink, which is a shortcut to a file/directory)
You group the next set of letters, at a maximum of 3 for each group. These groups represents corresponding permissions for user, group, and others.
Conclusion
In this article, you have learned about handling basic file and folder permissions.
I hope you enjoyed reading this tutorial. I have one request to all: give it a try on your own with some complicated scenarios like having permutations and combinations of permissions 😂. It’ll definitely be helpful in your entire career.
Subscribe to my newsletter by visiting my site and also have a look at the consolidated list of all my blogs.
Cheers!
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started