Linux — многопользовательская система. На одном сервере могут работать десятки пользователей, и каждый из них не должен случайно (или намеренно) читать, изменять или удалять чужие файлы. Для этого в Linux существует система прав доступа.
Права доступа определяют, кто и что может делать с каждым файлом и каталогом.
Привязка к проекту. Когда мы будем настраивать nginx и WordPress, права доступа станут критически важны. Веб-сервер nginx работает от имени специального пользователя
www-data. Файлы сайта должны быть доступны ему для чтения, но при этом посторонние пользователи не должны иметь возможности их изменять. Неправильные права — одна из самых частых причин ошибок «403 Forbidden» и проблем с безопасностью.
Каждый файл в Linux имеет:
- владельца (user, u) — обычно того, кто создал файл;
- группу (group, g) — набор пользователей, которым нужен общий доступ;
- остальных (others, o) — все, кто не является владельцем и не входит в группу.
Посмотрим на знакомый вывод ls -l:
-rw-r--r-- 1 student student 0 мар 10 15:00 notes.txt
Здесь:
- третий столбец (
student) — владелец файла; - четвёртый столбец (
student) — группа файла.
При создании файла владельцем становится текущий пользователь, а группой — его основная группа (обычно совпадает с именем пользователя).
Для каждой категории (владелец, группа, остальные) устанавливаются три вида прав:
| Право | Буква | Для файла | Для каталога |
|---|---|---|---|
| Чтение | r (read) |
просмотр содержимого | просмотр списка файлов (ls) |
| Запись | w (write) |
изменение содержимого | создание и удаление файлов внутри |
| Выполнение | x (execute) |
запуск как программы | вход в каталог (cd) |
Обратите внимание на важный нюанс: для каталогов права работают иначе, чем для файлов. В частности:
rбезxна каталоге позволяет увидеть имена файлов, но не их атрибуты (размер, дату и т.д.) и не позволяет войти внутрь;xбезrпозволяет войти в каталог и обратиться к файлу по имени, но не позволяет получить список файлов;wбезxбесполезен — нельзя создавать файлы в каталоге, в который нельзя войти.
На практике каталоги почти всегда имеют права r и x вместе.
Вернёмся к выводу ls -l и разберём первый столбец:
-rw-r--r--
Эта строка из 10 символов состоит из четырёх частей:
- rw- r-- r--
│ │ │ │
│ │ │ └── права для остальных (others): r-- = только чтение
│ │ └─────── права для группы (group): r-- = только чтение
│ └──────────── права для владельца (user): rw- = чтение и запись
└─────────────── тип файла: - = обычный файл
Каждая тройка — это три позиции: r, w, x. Если право есть — стоит
соответствующая буква, если нет — прочерк (-).
| Строка прав | Тип | Владелец | Группа | Остальные | Описание |
|---|---|---|---|---|---|
-rwxr-xr-x |
файл | rwx | r-x | r-x | Исполняемый файл, все могут запускать |
-rw-r--r-- |
файл | rw- | r-- | r-- | Обычный файл, все могут читать |
-rw------- |
файл | rw- | --- | --- | Только владелец может читать и писать |
drwxr-xr-x |
каталог | rwx | r-x | r-x | Обычный каталог, все могут заходить и смотреть |
drwx------ |
каталог | rwx | --- | --- | Каталог только для владельца |
Помимо буквенного представления, права можно записать числами. Каждому праву соответствует число:
| Право | Число |
|---|---|
r (чтение) |
4 |
w (запись) |
2 |
x (выполнение) |
1 |
| нет права | 0 |
Числа складываются для каждой тройки:
| Комбинация | Сумма | Значение |
|---|---|---|
rwx |
4+2+1 = 7 | все права |
rw- |
4+2+0 = 6 | чтение и запись |
r-x |
4+0+1 = 5 | чтение и выполнение |
r-- |
4+0+0 = 4 | только чтение |
--- |
0+0+0 = 0 | нет прав |
Три цифры подряд задают права для владельца, группы и остальных:
| Числовой формат | Буквенный | Типичное применение |
|---|---|---|
755 |
rwxr-xr-x |
исполняемые файлы, каталоги |
644 |
rw-r--r-- |
обычные файлы (конфиги, тексты) |
700 |
rwx------ |
личный каталог, приватные скрипты |
600 |
rw------- |
файлы с паролями, ключи SSH |
Совет. Запомните две комбинации: 644 для файлов и 755 для каталогов и скриптов. Это самые распространённые наборы прав.
Команда chmod (change mode) изменяет права доступа. Она работает в двух форматах.
chmod <кто><действие><права> файлГде:
- кто:
u(владелец),g(группа),o(остальные),a(все) - действие:
+(добавить),-(убрать),=(установить точно) - права:
r,w,x
Примеры:
# Добавить право на выполнение для владельца
chmod u+x script.sh
# Убрать право на запись у группы и остальных
chmod go-w config.txt
# Добавить чтение для всех
chmod a+r readme.txt
# Установить точные права: владелец — всё, группа и остальные — только чтение
chmod u=rwx,go=r file.txtchmod <число> файлПримеры:
# Стандартные права для файла: владелец rw, остальные r
chmod 644 config.txt
# Стандартные права для каталога или скрипта
chmod 755 scripts/
# Только владелец может читать и писать
chmod 600 secret.key
# Применить рекурсивно ко всему каталогу и его содержимому
chmod -R 755 wordpress-project/Осторожно с
-R. Флаг-R(recursive) применяет права ко всем файлам и подкаталогам внутри. Это удобно, но помните: обычным файлам редко нужен битx, а каталогам он нужен почти всегда. Поэтомуchmod -R 755на каталог с файлами — не всегда хорошая идея (файлы станут исполняемыми).
Если вы будете искать решения проблем в интернете, вы неизбежно встретите совет: «просто сделайте
chmod -R 777». Не следуйте ему. Разберёмся, почему.Права
777означаютrwxrwxrwx— любой пользователь системы может читать, изменять и выполнять файл. Это полное отсутствие защиты.Чем это опасно на практике:
- Безопасность. Если на веб-сервере файлы WordPress имеют права
777, любой процесс (включая взломанный скрипт) сможет изменить код сайта, подложить вредоносный файл или прочитать конфигурацию с паролями к базе данных.- Маскировка проблем.
chmod 777не устраняет причину ошибки — он просто снимает все ограничения. Настоящая проблема (неправильный владелец, не тот пользователь у сервиса) остаётся скрытой и может всплыть позже.- Привычка. Если привыкнуть «чинить» всё через
777, вы никогда не разберётесь, как права доступа работают на самом деле.Что делать вместо этого:
- Определите, какой пользователь и какой процесс должен обращаться к файлу (например,
www-dataдля nginx).- Назначьте правильного владельца (
chown) и группу (chgrp).- Выставьте минимально необходимые права: обычно
644для файлов и755для каталогов.Правильная настройка требует чуть больше усилий, но зато вы точно понимаете, кто и к чему имеет доступ, — а это основа безопасного администрирования.
На практике часто нужно выставить одни права на каталоги (например, 755) и другие
на файлы (644). Это типичная ситуация при настройке веб-сайта.
Если структура простая и файлы лежат в одном каталоге, можно обойтись двумя командами:
# Сначала выставляем права на сам каталог
chmod 755 wordpress-project/site
# Затем на файлы внутри
chmod 644 wordpress-project/site/*Но если каталогов много и они вложенные, этот способ не сработает. Правильное
решение — команда find, которую мы подробно разберём в главе 05. Здесь покажем
паттерн, который вам пригодится в реальной работе:
# Выставить 755 на все каталоги внутри /var/www/site
find /var/www/site -type d -exec chmod 755 {} +
# Выставить 644 на все файлы внутри /var/www/site
find /var/www/site -type f -exec chmod 644 {} +Первая команда находит все каталоги (-type d) и применяет к ним chmod 755.
Вторая находит все обычные файлы (-type f) и применяет chmod 644.
Не нужно сейчас запоминать синтаксис find — просто знайте, что такой приём
существует. Когда дойдём до главы 05, вы поймёте, как он работает.
chown admin notes.txtСменить владельца и группу одновременно:
chown admin:developers notes.txtРекурсивно — для каталога и всего его содержимого:
chown -R admin:developers project/chgrp developers notes.txtВажно. Менять владельца файла может только root (суперпользователь). Обычный пользователь может менять группу файла — но только на группу, в которой он сам состоит. Подробнее о root, sudo и управлении пользователями — в главе 08.
Пока вы работаете под своей учётной записью, вы можете менять права (
chmod) только на свои файлы. Дляchownвам понадобитсяsudo— эту команду мы разберём позже.
Вернёмся к структуре каталогов из главы 02. Если вы её удалили — создайте заново:
cd ~
mkdir -p wordpress-project/{config,logs,site}
touch wordpress-project/config/nginx.conf
touch wordpress-project/config/php.ini
touch wordpress-project/site/index.htmlЧто за фигурные скобки? Запись
{config,logs,site}— это механизм bash, который называется brace expansion (раскрытие скобок). Оболочка автоматически разворачивает такую запись в несколько слов. То есть командаmkdir -p wordpress-project/{config,logs,site}равносильна трём командам:
mkdir -p wordpress-project/config mkdir -p wordpress-project/logs mkdir -p wordpress-project/siteФигурные скобки — просто удобное сокращение, чтобы не набирать одно и то же несколько раз. Внутри скобок элементы перечисляются через запятую без пробелов.
Посмотрим текущие права:
ls -la wordpress-project/drwxr-xr-x 5 student student 4096 мар 10 16:00 .
drwxr-xr-x 3 student student 4096 мар 10 16:00 ..
drwxr-xr-x 2 student student 4096 мар 10 16:00 config
drwxr-xr-x 2 student student 4096 мар 10 16:00 logs
drwxr-xr-x 2 student student 4096 мар 10 16:00 site
ls -la wordpress-project/config/Обратите внимание: файлы nginx.conf и php.ini имеют права 644 (rw-r--r--).
Это значит, что владелец может читать и писать, а все остальные — только читать.
Конфигурационные файлы могут содержать пароли. Уберём доступ для группы и остальных:
chmod 600 wordpress-project/config/nginx.conf
chmod 600 wordpress-project/config/php.iniПроверим:
ls -l wordpress-project/config/-rw------- 1 student student 0 мар 10 16:00 nginx.conf
-rw------- 1 student student 0 мар 10 16:00 php.ini
Теперь файлы доступны только владельцу.
Создадим простой скрипт (содержимое пока не важно — подробно о скриптах в главе 06):
echo '#!/bin/bash' > wordpress-project/backup.sh
echo 'echo "Backup started"' >> wordpress-project/backup.shЧто делают
>и>>? Символ>записывает вывод команды в файл (создаёт или перезаписывает), а>>добавляет в конец файла, не затирая содержимое. Подробно мы разберём перенаправление ввода-вывода в главе 05.
Попробуем запустить:
./wordpress-project/backup.shbash: ./wordpress-project/backup.sh: Отказано в доступе
Файл не имеет права на выполнение. Добавим:
chmod u+x wordpress-project/backup.shПроверим и запустим:
ls -l wordpress-project/backup.sh-rwxr--r-- 1 student student 38 мар 10 16:05 backup.sh
./wordpress-project/backup.shBackup started
chmod 700 wordpress-project/logsТеперь только владелец может заходить в этот каталог и видеть его содержимое.
Помимо стандартных rwx в Linux существуют три специальных бита. Подробно они
вам понадобятся не скоро, но полезно знать об их существовании:
- SUID — при запуске файла он выполняется от имени владельца, а не от имени
того, кто запустил. Используется, например, командой
passwd, чтобы обычный пользователь мог изменить свой пароль. - SGID — аналогично, но для группы. На каталоге означает, что новые файлы внутри наследуют группу каталога.
- Sticky bit — на каталоге запрещает пользователям удалять чужие файлы.
Классический пример — каталог
/tmp.
Вы можете заметить их в выводе ls -l как s или t вместо x:
drwxrwxrwt — sticky bit на /tmp (буква t вместо последнего x)
-rwsr-xr-x — SUID на /usr/bin/passwd (буква s вместо x владельца)
-
Создайте файл
secret.txtв домашнем каталоге. Установите права600. Убедитесь с помощьюls -l, что только владелец может его читать и писать. -
Создайте каталог
shared/. Установите права755. Создайте внутри файлinfo.txtс правами644. Объясните, кто и что может делать с этим файлом и каталогом. -
Создайте файл
run.sh. Добавьте ему право на выполнение для владельца с помощью символьного формата (chmod u+x). Проверьте результат. -
Посмотрите права на каталог
/tmp(ls -ld /tmp). Какой специальный бит вы видите? Что он означает? -
Переведите в числовой формат:
rwxr-xr--= ?rw-rw----= ?rwx------= ?
-
Переведите в буквенный формат:
644= ?711= ?000= ?
В этой главе вы:
- узнали, зачем нужны права доступа в многопользовательской системе;
- разобрались с концепцией «владелец / группа / остальные»;
- научились читать строку прав в выводе
ls -l; - освоили числовой (восьмеричный) формат прав;
- научились изменять права командой
chmod(символьный и числовой формат); - познакомились с
chownиchgrpдля смены владельца и группы; - узнали о существовании специальных битов (SUID, SGID, sticky bit).
В следующей главе мы освоим текстовые редакторы — nano и основы vim. Они понадобятся для редактирования конфигурационных файлов на сервере.