Программы
Права на файлы и папки в Linux, FreeBSD и MacOS

Права на файлы и папки в Linux, FreeBSD и MacOS

Сегодня хочется задеть одну очень скользкую тему: права (и обязанности) на файлы в системах, основанных на Unix.

Сегодня хочется задеть одну очень скользкую тему: права (и обязанности) на файлы в системах, основанных на Unix.

Как всегда, хочется рассказать интересно и не упустить важные моменты. Но многим это просто не надо. Им нужен очередной stackoverflow с ответами, в которые не надо вдумываться… Вжух-вжух и ты ботнет.

Поэтому вот рецепты (tl;dr), а объяснение будет ниже.

Чтобы сменить владельца файлов в директории и во всех поддиректориях (рекурсивно), выполните:

sudo chown -R user:group /home/user/path/to/directory/

Например, чтобы apache смог в какой-то папке сохранять файлы, выполняем:

sudo chown -R www-data:www-data /home/user/www/site/upload/

Чтобы дать права на чтение файла для всех, выполните:

chmod o+r /var/www/index.html

Чтобы сделать это для всей папки и подпапок (рекурсивно):

chmod -R o+r /var/www/index.html

Чтобы для всех файлов в папке (рекурсивно) выставить права «владелец может читать и менять, остальные — только читать»:

find /var/www/html-site -type f -exec chmod 644 {} \;

Чтобы для папки и подпапок (рекурсивно) выставить права «владелец может просматривать содержимое и создавать файлы и папки, остальные — только просматривать»:

find /var/www/html-site -type d -exec chmod 755 {} \;

Чтобы проверить, что у пользователя есть права, самое простое — зайти под ним:

sudo su user_name

— прочитать файл / создать файл прямо под этим пользователем.

Ну и самое интересное, что я нашёл в популярных вопросах:

$ sudo chown -R user:group /data/
chown: неверный пользователь: «user:group»

— замените user на имя пользователя (не «Иван Иванович Иванов», а «ivanov»), а «:group» можно не указывать.

А на самом деле…

Изображение Шпаргалка по командам Linux, FreeBSD и MacOS

Файлы в Unix

Начнём с того, что файлы в Unix бывают разные. Идеология «всё есть файл» предполагает, что файлы — не то, чем кажутся.

  1. Обычный файл — как раз всё то, что мы называем файлом.
  2. Директория — она же «папка», она же «каталог».
  3. Символическая ссылка — этакий ярлык на другой «файл».
  4. Блочное устройство — те же жёсткие диски, флешки.
  5. Символьное устройство — например, терминалы tty.
  6. Канал (fifo) — один из вариантов межпроцессорного взаимодействия.
  7. Unix сокет — ещё один из вариантов межпроцессорного взаимодействия.

Так что даже с понятием «файл» не так уж и просто. Зато есть возможность на всех них единообразно раздавать права, пользоваться ими. Например, можно сделать cat на устройство, echo для записи в сеть и т. д.

Во FreeBSD я успешно делал cat на директорию, правда получал не особо читаемую информацию. Но и её можно было использовать для получения нужной информации о файле типа «каталог».

В особо весёлых Unix-ах, например Plan9 можно использовать вместо интерфейса сокетов файлы типа /net/tcp. В общем, как всегда идеология «всё есть что-то» не имеет границ здравого смысла. И это прекрасно!

Права в Unix

Здесь мы рассмотрим базовую модель прав в Unix (модель дискреционного управления доступом), без всяких расширений типа атрибутов файлов, эффективных прав и прочих липких битов.

Суть модели прав довольно проста:

  1. У каждого файла есть владелец. Владелец устанавливает права доступа на свои файлы (например, командой chmod).
  2. В системе есть супер-пользователь (root), который устанавливает владельцев файлов (например, командой chown).

Теперь подробнее по первому пункту.

Доступ по пользователям делится на 3 группы

  1. Владелец (user) — тот самый, что имеет возможность изменять права доступа.
  2. Группа (group) — какая-то группа пользователей, которая должна иметь определённые права на файл. Посмотреть группы пользователя можно командой
    $ groups gosha
    gosha : gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
    

    — пользователь gosha состоит в группах: gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd.

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

    $ grep cdrom /etc/group
    cdrom:x:24:gosha
    

    Не самый элегантный способ, но работает на всех Unix. Также можно использовать утилиты lid и members.

  3. Все другие (other) — любой пользователь, существующий в системе.

Сами права доступа также делятся на 3 группы

  1. Права на чтения (read или «4» в битовой маске) — право читать файл или читать содержимое директории.
  2. Права на запись (write или «2» в битовой маске) — право писать в файл или создавать файлы в директории.
  3. Право на исполнение (execute или «1» в битовой маске) — право запускать файл (программу, записанную в файле) или переходить по директории вглубь (например, сделать cd в поддиреторию).

Битовая маска прав доступа

Давайте посмотрим права на папку /bin, например, с помощью команды ls -l / | grep bin :

drwxr-xr-x   2 root root  4096 май  6 03:24 bin
||||||||||
|||||||||+-исполнение для всех остальных - разрешено
||||||||+--запись для всех остальных - НЕ разрешено
|||||||+---чтение для всех остальных - разрешено
||||||+----исполнение для группы владельца - разрешено
|||||+-----запись для группы владельца - НЕ разрешено
||||+------чтение для группы владельца - разрешено
|||+-------исполнение для владельца - разрешено
||+--------запись для владельца - разрешено
|+---------чтение для владельца - разрешено
+----------тип файла - диретория

Кроме указанного представления полномочий доступа (символьного), существует так же и числовое представление. Для общего понимания, приведу таблицу соответствия числового (двоичного и десятичного) значения прав доступа и буквенного:

  владелец группа остальные
буквенное rwx r-x r-x
числовое (десятичное) 421 401 401
итоговое (сумма) 7 5 5

В приведенной таблице показано, что право чтения, соответствует значению 4, право записи — 2, право выполнения — 1, отсутствие права — 0, складывая данные показатели, можно представлять и назначать права в числовом виде. Таким образом, вместо drwxr-xr-x можно написать 755. Часто можно увидеть именно числовое определение прав доступа — теперь вы понимаете, что это значит.

Часто можно увидеть на файле права 644 — постарайтесь понять, что это значит, чтобы закрепить полученные знания.