Skip to content

Latest commit

 

History

History
473 lines (350 loc) · 22.3 KB

File metadata and controls

473 lines (350 loc) · 22.3 KB

Этап 3. Права доступа и владение файлами

Зачем нужны права доступа

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 — изменение прав

Команда 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.txt

Числовой формат

chmod <число> файл

Примеры:

# Стандартные права для файла: владелец 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 777 — плохая идея

Если вы будете искать решения проблем в интернете, вы неизбежно встретите совет: «просто сделайте chmod -R 777». Не следуйте ему. Разберёмся, почему.

Права 777 означают rwxrwxrwx — любой пользователь системы может читать, изменять и выполнять файл. Это полное отсутствие защиты.

Чем это опасно на практике:

  • Безопасность. Если на веб-сервере файлы WordPress имеют права 777, любой процесс (включая взломанный скрипт) сможет изменить код сайта, подложить вредоносный файл или прочитать конфигурацию с паролями к базе данных.
  • Маскировка проблем. chmod 777 не устраняет причину ошибки — он просто снимает все ограничения. Настоящая проблема (неправильный владелец, не тот пользователь у сервиса) остаётся скрытой и может всплыть позже.
  • Привычка. Если привыкнуть «чинить» всё через 777, вы никогда не разберётесь, как права доступа работают на самом деле.

Что делать вместо этого:

  1. Определите, какой пользователь и какой процесс должен обращаться к файлу (например, www-data для nginx).
  2. Назначьте правильного владельца (chown) и группу (chgrp).
  3. Выставьте минимально необходимые права: обычно 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 и chgrp — смена владельца и группы

chown — смена владельца

chown admin notes.txt

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

chown admin:developers notes.txt

Рекурсивно — для каталога и всего его содержимого:

chown -R admin:developers project/

chgrp — смена группы

chgrp developers notes.txt

Важно. Менять владельца файла может только root (суперпользователь). Обычный пользователь может менять группу файла — но только на группу, в которой он сам состоит. Подробнее о root, sudo и управлении пользователями — в главе 08.

Пока вы работаете под своей учётной записью, вы можете менять права (chmod) только на свои файлы. Для chown вам понадобится sudo — эту команду мы разберём позже.

Практика: права для проекта WordPress

Вернёмся к структуре каталогов из главы 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

Задание 1. Изучите текущие права

ls -la wordpress-project/config/

Обратите внимание: файлы nginx.conf и php.ini имеют права 644 (rw-r--r--). Это значит, что владелец может читать и писать, а все остальные — только читать.

Задание 2. Сделайте конфиги доступными только владельцу

Конфигурационные файлы могут содержать пароли. Уберём доступ для группы и остальных:

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

Теперь файлы доступны только владельцу.

Задание 3. Создайте скрипт и сделайте его исполняемым

Создадим простой скрипт (содержимое пока не важно — подробно о скриптах в главе 06):

echo '#!/bin/bash' > wordpress-project/backup.sh
echo 'echo "Backup started"' >> wordpress-project/backup.sh

Что делают > и >>? Символ > записывает вывод команды в файл (создаёт или перезаписывает), а >> добавляет в конец файла, не затирая содержимое. Подробно мы разберём перенаправление ввода-вывода в главе 05.

Попробуем запустить:

./wordpress-project/backup.sh
bash: ./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.sh
Backup started

Задание 4. Ограничьте доступ к каталогу logs

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 владельца)

Практическое задание

  1. Создайте файл secret.txt в домашнем каталоге. Установите права 600. Убедитесь с помощью ls -l, что только владелец может его читать и писать.

  2. Создайте каталог shared/. Установите права 755. Создайте внутри файл info.txt с правами 644. Объясните, кто и что может делать с этим файлом и каталогом.

  3. Создайте файл run.sh. Добавьте ему право на выполнение для владельца с помощью символьного формата (chmod u+x). Проверьте результат.

  4. Посмотрите права на каталог /tmp (ls -ld /tmp). Какой специальный бит вы видите? Что он означает?

  5. Переведите в числовой формат:

    • rwxr-xr-- = ?
    • rw-rw---- = ?
    • rwx------ = ?
  6. Переведите в буквенный формат:

    • 644 = ?
    • 711 = ?
    • 000 = ?

Итоги

В этой главе вы:

  • узнали, зачем нужны права доступа в многопользовательской системе;
  • разобрались с концепцией «владелец / группа / остальные»;
  • научились читать строку прав в выводе ls -l;
  • освоили числовой (восьмеричный) формат прав;
  • научились изменять права командой chmod (символьный и числовой формат);
  • познакомились с chown и chgrp для смены владельца и группы;
  • узнали о существовании специальных битов (SUID, SGID, sticky bit).

В следующей главе мы освоим текстовые редакторы — nano и основы vim. Они понадобятся для редактирования конфигурационных файлов на сервере.