Права доступа Linux chmod: как установить, изменить и понять (644, 755, 777) | AdminWiki

Права доступа Linux chmod: Полное руководство для начинающих и DevOps

17 декабря 2025 9 мин. чтения #bash #chmod #devops #linux #permissions #безопасность #командная строка #права доступа

Что такое права доступа в Linux и зачем они нужны?

Представь, что твой Linux-сервер — это многоэтажный дом с охраной. Каждому файлу и папке (квартире) выдается пропуск, который определяет, кто может зайти (прочитать), переставить мебель (записать) или вообще войти в квартиру (выполнить). Эта система пропусков и есть права доступа, а chmod — это инструмент, который выдает или забирает эти пропуски.

Без правильной настройки прав доступа (permissions) твое приложение может не запуститься, скрипты откажутся работать, а злоумышленник получит доступ к критическим данным. Давай разберем, как этим управлять.

Важно: Права доступа проверяются в момент обращения пользователя к файлу. Они не влияют на процессы, уже запущенные от имени этого пользователя.

Как посмотреть текущие права доступа: команда ls -l

Первым делом научимся «читать» пропуска. Для этого используй команду ls -l.

bash
$ ls -l
-rw-r--r-- 1 user group  4096 Dec 10 10:30 index.html
drwxr-xr-x 2 user group  4096 Dec 10 10:35 scripts/
-rwxr-xr-- 1 user group   123 Dec 10 10:40 deploy.sh

Первый символ в строке указывает тип объекта: - (файл), d (директория), l (ссылка). Дальше идут 9 символов прав доступа, разбитые на три группы по три символа:

  • Первая тройка (rw-): Права для владельца файла (user/owner).
  • Вторая тройка (r--): Права для группы (group).
  • Третья тройка (r--): Права для всех остальных (others).

Каждый символ в тройке означает:

  • r (read) — право на чтение (для директории — просмотр содержимого).
  • w (write) — право на запись (для директории — создание/удаление файлов).
  • x (execute) — право на выполнение (для директории — возможность «войти» в нее).
  • - — право отсутствует.

Два способа изменения прав: символьный и числовой (восьмеричный)

Команда chmod позволяет менять права двумя основными способами. Выбор зависит от ситуации и личных предпочтений.

1. Символьный (буквенный) режим

Более наглядный способ. Ты явно указываешь, для кого меняешь права (u,g,o,a), какую операцию выполняешь (+, -, =) и какие права (r,w,x).

Синтаксис: chmod [КТО][ОПЕРАЦИЯ][ПРАВА] файл

Кто (WHO) Операция Права (WHAT)
u — владелец (user) + — добавить r — чтение
g — группа (group) - — убрать w — запись
o — остальные (others) = — установить точно x — выполнение
a — все (all) (по умолчанию)
bash
# Добавить право на выполнение для владельца
chmod u+x script.sh

# Убрать право на запись для группы и остальных
chmod go-w secret.txt

# Установить точные права: владелец — читает/пишет, группа — читает, остальные — ничего
chmod u=rw,g=r,o= config.yaml

# Дать всем право на чтение
chmod a+r public_file.log

2. Числовой (восьмеричный) режим

Более компактный и часто используемый в скриптах способ. Каждая тройка прав представляется числом от 0 до 7.

Как считать: Сложи вес каждого установленного бита в группе: r=4, w=2, x=1.

Комбинация Расчет Число
--- 0 + 0 + 0 0
--x 0 + 0 + 1 1
-w- 0 + 2 + 0 2
-wx 0 + 2 + 1 3
r-- 4 + 0 + 0 4
r-x 4 + 0 + 1 5
rw- 4 + 2 + 0 6
rwx 4 + 2 + 1 7

Теперь, чтобы задать права для всего файла, мы просто пишем три цифры подряд: первая — для владельца, вторая — для группы, третья — для остальных.

bash
# Установить права 644 (rw-r--r--)
chmod 644 index.html

# Установить права 755 (rwxr-xr-x) для директории
chmod 755 /var/www/myapp/

# Установить права 600 (только владелец читает и пишет) для приватного ключа
chmod 600 ~/.ssh/id_rsa

# Опасный пример: 777 (rwxrwxrwx) — полный доступ всем
chmod 777 /tmp/some_file  # НЕ ДЕЛАЙТЕ ЭТОГО БЕЗ ОЧЕНЬ ВЕСКОЙ ПРИЧИНЫ
Опасно: Никогда не используйте chmod 777 на рабочих серверах для файлов приложений или конфигураций. Это грубейшее нарушение безопасности, которое откроет дверь для атак.

Практические примеры и частые кейсы

Давай рассмотрим, как права доступа применяются в реальных задачах DevOps и разработки.

Настройка веб-сервера (Nginx/Apache)

Веб-сервер обычно работает от имени отдельного пользователя (например, www-data или nginx). Файлы должны быть читаемы для него, а директории — доступны для входа.

bash
# Владелец — твой пользователь, группа — www-data
sudo chown -R $USER:www-data /var/www/myproject

# Файлы: владелец читает/пишет, группа читает, остальные читают
find /var/www/myproject -type f -exec chmod 644 {} \;

# Директории: владелец полный доступ, группа читает/входит, остальные читают/входят
find /var/www/myproject -type d -exec chmod 755 {} \;

# Особый скрипт, который должен выполняться веб-сервером
chmod 755 /var/www/myproject/cgi-bin/script.cgi

Безопасная работа с SSH ключами

OpenSSH очень строг к правам доступа. Неправильные права — и подключение не заработает.

bash
# Права для директории .ssh (только владелец)
chmod 700 ~/.ssh

# Права для приватного ключа (только чтение/запись для владельца)
chmod 600 ~/.ssh/id_rsa

# Права для публичного ключа (может быть читаем всеми)
chmod 644 ~/.ssh/id_rsa.pub

# Права для конфига (только владелец)
chmod 600 ~/.ssh/config

Скрипты и исполняемые файлы

Чтобы запустить скрипт командой ./script.sh, у него должен быть установлен бит выполнения (x).

bash
# Создаем скрипт
echo '#!/bin/bash\necho "Hello World"' > myscript.sh

# Даем право на выполнение для владельца (можно и для всех, если нужно)
chmod u+x myscript.sh

# Теперь его можно запустить
./myscript.sh  # Выведет: Hello World

Рекурсивное изменение прав для директорий

Часто нужно поменять права для всей папки и всего, что внутри. Для этого используется флаг -R (recursive).

bash
# Рекурсивно дать всем право на чтение файлов в директории logs
chmod -R a+r /var/log/myapp/

# Рекурсивно установить права 755 на все поддиректории и 644 на все файлы
# Внимание: это разные команды для файлов и папок!
find /path/to/dir -type d -exec chmod 755 {} \;
find /path/to/dir -type f -exec chmod 644 {} \;
Важно: Будь осторожен с chmod -R. Одна ошибка в пути или маске — и можно сломать права на всей системе. Всегда проверяй команду find без -exec сначала.

Специальные биты: SUID, SGID, Sticky Bit

Помимо основных rwx, существуют специальные биты, которые ставятся в четвертую, старшую цифру числового режима.

  • SUID (Set User ID, 4): Если установлен на исполняемом файле, то он запускается с правами владельца файла, а не запустившего пользователя. Пример: passwd.
  • SGID (Set Group ID, 2): Для файлов — как SUID, но для группы. Для директорий — новые файлы наследуют группу директории, а не создателя.
  • Sticky Bit (1): Для директорий (например, /tmp) разрешает удалять файлы только их владельцам, даже если у других есть право на запись.
bash
# Установить SUID бит (например, 4755)
chmod 4755 /usr/bin/special_program
# Символьный способ:
chmod u+s /usr/bin/special_program

# Установить SGID на директорию (например, 2775)
chmod 2775 /shared/group_folder
chmod g+s /shared/group_folder

# Установить Sticky Bit на /tmp (обычно уже установлен)
chmod 1777 /tmp
chmod o+t /tmp

Часто задаваемые вопросы (FAQ)

Чем отличаются права на файл и на директорию?

Права r, w, x имеют разный смысл для файлов и папок:

Право Для файла Для директории
r (read) Чтение содержимого файла Просмотр списка файлов в директории (команда ls)
w (write) Изменение содержимого файла Создание, удаление, переименование файлов внутри директории
x (execute) Запуск файла как программы/скрипта «Вход» в директорию (cd), доступ к файлам внутри

Чтобы удалить файл, нужны права w на директорию, где он лежит, а не на сам файл!

Что такое umask и как она влияет на chmod?

umask (user mask) — это маска прав по умолчанию, которая вычитается из максимальных прав при создании нового файла или директории. По умолчанию часто 022, что означает: для новых файлов — права 644 (666 - 022), для директорий — 755 (777 - 022). Узнать текущую: umask. Изменить для сессии: umask 027.

Я изменил права, но веб-сервер все равно не может прочитать файл. В чем дело?

Проверь цепочку: 1) Права на сам файл (должны быть как минимум r для пользователя/группы веб-сервера). 2) Права на ВСЕ родительские директории вплоть до корня — на каждой должна быть хотя бы r-x для пользователя/группы веб-сервера, иначе он не «доберется» до файла. Используй namei -l /path/to/your/file для анализа.

Как рекурсивно изменить владельца и группу вместе с правами?

Для изменения владельца и группы используется команда chown. Часто их используют вместе с chmod.

bash
# Рекурсивно изменить владельца и группу
sudo chown -R www-data:www-data /var/www
# Затем установить правильные права
sudo find /var/www -type d -exec chmod 755 {} \;
sudo find /var/www -type f -exec chmod 644 {} \;

Заключение и лучшие практики

Управление правами доступа с помощью chmod — фундаментальный навык для любого, кто работает с Linux. Запомни главное:

  • Соблюдай принцип минимальных привилегий: давай ровно столько прав, сколько нужно для работы, и не больше.
  • Избегай 777 и 666 на продакшене как огня.
  • Для веб-контента используй классическую схему: файлы — 644, директории — 755.
  • Для конфигов и приватных ключей — 600.
  • Всегда проверяй права на цепочку родительских директорий.
  • Используй числовой режим в скриптах для однозначности, а символьный — для быстрых точечных изменений.

Потренируйся на тестовом сервере или в виртуальной машине, создавай файлы, меняй права и проверяй результат. Со временем чтение записей типа drwxr-xr-x станет для тебя таким же естественным, как чтение обычного текста.

Поделиться:
Сохранить гайд? В закладки браузера