Сегодня хочется задеть одну очень скользкую тему: права (и обязанности) на файлы в системах, основанных на 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» можно не указывать.
Файлы в Unix
Начнём с того, что файлы в Unix бывают разные. Идеология «всё есть файл» предполагает, что файлы — не то, чем кажутся.
- Обычный файл — как раз всё то, что мы называем файлом.
- Директория — она же «папка», она же «каталог».
- Символическая ссылка — этакий ярлык на другой «файл».
- Блочное устройство — те же жёсткие диски, флешки.
- Символьное устройство — например, терминалы tty.
- Канал (fifo) — один из вариантов межпроцессорного взаимодействия.
- Unix сокет — ещё один из вариантов межпроцессорного взаимодействия.
Так что даже с понятием «файл» не так уж и просто. Зато есть возможность на всех них единообразно раздавать права, пользоваться ими. Например, можно сделать cat на устройство, echo для записи в сеть и т. д.
Во FreeBSD я успешно делал cat на директорию, правда получал не особо читаемую информацию. Но и её можно было использовать для получения нужной информации о файле типа «каталог».
В особо весёлых Unix-ах, например Plan9 можно использовать вместо интерфейса сокетов файлы типа /net/tcp. В общем, как всегда идеология «всё есть что-то» не имеет границ здравого смысла. И это прекрасно!
Права в Unix
Здесь мы рассмотрим базовую модель прав в Unix (модель дискреционного управления доступом), без всяких расширений типа атрибутов файлов, эффективных прав и прочих липких битов.
Суть модели прав довольно проста:
- У каждого файла есть владелец. Владелец устанавливает права доступа на свои файлы (например, командой chmod).
- В системе есть супер-пользователь (root), который устанавливает владельцев файлов (например, командой chown).
Теперь подробнее по первому пункту.
Доступ по пользователям делится на 3 группы
- Владелец (user) — тот самый, что имеет возможность изменять права доступа.
- Группа (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
. - Все другие (other) — любой пользователь, существующий в системе.
Сами права доступа также делятся на 3 группы
- Права на чтения (read или «4» в битовой маске) — право читать файл или читать содержимое директории.
- Права на запись (write или «2» в битовой маске) — право писать в файл или создавать файлы в директории.
- Право на исполнение (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 — постарайтесь понять, что это значит, чтобы закрепить полученные знания.