chmod в Linux: права доступа на файлы и директории в Ubuntu
chmod (change mode) — основная команда управления правами доступа в Linux. Каждый файл имеет три набора прав (для владельца, группы и остальных) и три действия (чтение, запись, исполнение). Разбираем числовой и символический формат записи, recursive-операции, специальные биты SUID/SGID/sticky и типичные сценарии — права на SSH-ключи, файлы веб-сервера, скрипты.
Модель прав доступа в Linux
В Linux каждый файл и директория имеют владельца, группу и набор прав доступа. Права делятся на три категории:
- User (u) — владелец файла.
- Group (g) — члены группы файла.
- Other (o) — все остальные пользователи системы.
Для каждой категории определены три действия:
- r (read) — чтение содержимого файла или листинг директории.
- w (write) — изменение файла или создание/удаление файлов в директории.
- x (execute) — запуск файла (для скриптов и бинарей) или вход в директорию (
cd).
Итого — 9 битов прав плюс 3 специальных бита (SUID, SGID, sticky).
Просмотр прав
ls -l /etc/ssh/sshd_config
# -rw-r--r-- 1 root root 3104 Apr 24 10:15 /etc/ssh/sshd_config
Расшифровка строки:
- rw- r-- r-- 1 root root
│ │ │ │
│ │ │ └── права для остальных (o): только чтение
│ │ └────── права для группы (g): только чтение
│ └────────── права для владельца (u): чтение и запись
└──────────── тип файла: - = обычный, d = директория, l = симлинк, c/b = устройство
-rw-r--r-- в восьмеричной нотации — это 0644 (или просто 644).
Числовой формат (octal)
Каждая тройка битов представляется одной восьмеричной цифрой:
| Биты | Восьмеричная | Что значит |
|---|---|---|
--- |
0 | нет прав |
--x |
1 | execute |
-w- |
2 | write |
-wx |
3 | write + execute |
r-- |
4 | read |
r-x |
5 | read + execute |
rw- |
6 | read + write |
rwx |
7 | read + write + execute |
Полные права кодируются тремя цифрами: для user, group, other.
chmod 644 file.txt # rw-r--r-- (стандарт для обычных файлов)
chmod 755 script.sh # rwxr-xr-x (стандарт для исполняемых)
chmod 600 .ssh/id_rsa # rw------- (только владелец, SSH-ключ)
chmod 700 .ssh/ # rwx------ (директория, только владелец)
chmod 666 socket # rw-rw-rw- (все могут читать/писать — редко)
chmod 777 anywhere # rwxrwxrwx (полный доступ всем — почти никогда!)
777 — флаг тревоги. Если в проекте видите chmod 777 — это почти всегда плохое решение, исправляющее симптом, а не причину.
Символический формат
Альтернативная запись через буквы:
chmod u+x script.sh # добавить execute владельцу
chmod g-w file.txt # убрать write у группы
chmod o=r file.txt # установить остальным только read
chmod a+x script.sh # добавить execute всем (a = all = ugo)
chmod ugo+r file.txt # добавить read всем
Операторы:
+— добавить право.-— убрать право.=— установить точно (заменить).
Категории: u, g, o, a (все).
Можно комбинировать:
chmod u+rwx,g+rx,o-rwx script.sh
# = chmod 750 script.sh
Символический формат удобнее, когда нужно изменить одно право, не трогая остальных. Числовой — когда нужно установить полную маску.
Recursive операции
# Применить ко всем файлам и директориям внутри
chmod -R 755 /var/www/html
Опасность recursive: если применить ко всему дереву chmod -R 755, файлам тоже выставится +x, что им не нужно (только директориям). Решение — раздельные команды для файлов и директорий:
# Директориям — 755, файлам — 644
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
# Альтернатива через chmod с операторами X (capital)
chmod -R u=rwX,g=rX,o=rX /var/www/html
X (заглавная) — выставляет x только директориям и файлам, у которых уже есть x хотя бы для одной категории. Это безопаснее обычного -R 755.
Специальные биты: SUID, SGID, sticky
Помимо rwx есть три специальных бита, добавляющиеся как четвёртая цифра в восьмеричной записи (старший разряд):
SUID (Set User ID) — 4000
При запуске файла процесс получает права владельца файла, а не запустившего. Классический пример — passwd:
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# ↑
# s в позиции user-x = SUID
passwd принадлежит root и имеет SUID — поэтому обычный пользователь, запуская passwd, временно получает права root для записи в /etc/shadow.
Установка SUID:
chmod u+s binary # символически
chmod 4755 binary # числово
Опасность: SUID на скрипте или плохо написанной программе — вектор эскалации привилегий. Поиск всех SUID-файлов на системе для аудита:
sudo find / -type f -perm /4000 2>/dev/null
SGID (Set Group ID) — 2000
Аналог для группы. На файле — процесс при запуске получает права группы файла. На директории — все новые файлы внутри получают группу директории (не группу создателя).
Полезно для shared-директорий проектной команды:
sudo mkdir /srv/shared
sudo chgrp developers /srv/shared
sudo chmod 2775 /srv/shared
# Любой файл, созданный в /srv/shared, автоматически принадлежит группе developers
Sticky bit — 1000
На директории: файлы внутри может удалять только их владелец (или root). Применяется к /tmp:
ls -ld /tmp
# drwxrwxrwt 17 root root ... /tmp
# ↑
# t = sticky
Без sticky любой пользователь смог бы удалять чужие файлы в /tmp.
Установка:
chmod +t /shared/upload
chmod 1777 /shared/upload
Типичные сценарии
SSH-ключи
# Приватный ключ — только владелец
chmod 600 ~/.ssh/id_ed25519
# Публичный ключ можно публичный
chmod 644 ~/.ssh/id_ed25519.pub
# authorized_keys
chmod 600 ~/.ssh/authorized_keys
# Директория .ssh
chmod 700 ~/.ssh
SSH откажется работать с ключом, у которого права шире 600 — это защита от кражи ключа через шаринг.
Web-сервер
# Файлы статики и скриптов
sudo find /var/www/html -type f -exec chmod 644 {} +
sudo find /var/www/html -type d -exec chmod 755 {} +
# Загружаемые папки (PHP запись)
sudo chmod 775 /var/www/html/uploads
sudo chown www-data:www-data /var/www/html/uploads
# Конфиги — только root
sudo chmod 640 /etc/nginx/nginx.conf
Скрипты и бинари
# Свой shell-скрипт
chmod +x deploy.sh
chmod 755 deploy.sh
# Скрипт с секретами внутри — только владельцу
chmod 700 backup.sh
# Глобальный бинарь
sudo cp tool /usr/local/bin/
sudo chmod 755 /usr/local/bin/tool
Конфигурационные файлы
# Стандарт для /etc
chmod 644 /etc/myconfig.conf
# Конфиги с паролями
chmod 600 /etc/myapp/secrets.conf
chmod 640 /etc/postfix/sasl_passwd
sudo chown root:postfix /etc/postfix/sasl_passwd
umask: маска по умолчанию
Umask определяет, какие биты не выставляются при создании файла:
# Текущая umask
umask
# 0022
# Это значит: новые файлы создаются с 666 & ~022 = 644
# Новые директории: 777 & ~022 = 755
Изменить временно:
umask 027 # файлы 640, директории 750
touch test
ls -l test
# -rw-r----- 1 user user ...
Постоянно — в ~/.bashrc или /etc/profile:
# В ~/.bashrc
umask 027
Для повышенной безопасности umask 077 — только владелец имеет доступ к новым файлам.
Распространённые ошибки
chmod 777 «чтобы заработало»
Сценарий: «PHP не может писать в загрузочную папку — поставлю 777». Это неправильно: вы открываете запись всему миру, включая потенциальных атакующих. Правильно — поставить 755 или 775 и владельца www-data:
sudo chown -R www-data:www-data /var/www/html/uploads
sudo chmod 755 /var/www/html/uploads
Recursive 755 на файлы
chmod -R 755 /var/www делает все файлы исполняемыми, что не нужно. Используйте X (capital):
chmod -R u=rwX,g=rX,o=rX /var/www
SUID на скриптах
Linux игнорирует SUID на интерпретируемых скриптах (bash, python) из соображений безопасности. SUID работает только на скомпилированных бинарях. Если нужно дать обычному пользователю запускать что-то под другим UID — используйте sudo с конкретным правилом в /etc/sudoers.d/.
Забыть про .gitignore
После chmod файла часто меняется git-индекс. По умолчанию git отслеживает execute-бит. Чтобы он не отвлекал:
git config core.fileMode false
Частые вопросы
Что значит chmod 644 и chmod 755?
644 — rw-r--r--: владелец читает и пишет, остальные только читают. Стандарт для обычных файлов (документы, конфиги, исходники). 755 — rwxr-xr-x: владелец полный доступ, остальные читают и могут зайти/запустить. Стандарт для директорий и исполняемых файлов.
Какие права ставить на SSH-ключ?
Приватный ключ — 600 (rw-------), только владелец. Публичный ключ — 644. Директория ~/.ssh — 700. Файл authorized_keys — 600. SSH откажется работать с приватным ключом, права которого слабее (например, 644).
Чем отличается chmod от chown?
chmod меняет права доступа (что разрешено делать). chown меняет владельца и группу файла (кто его владелец). Это разные операции: можно поменять права, не трогая владельца, и наоборот. Часто используются в паре: chown www-data:www-data file && chmod 644 file.
Что такое 777 и почему это плохо?
777 — rwxrwxrwx, полный доступ для всех пользователей системы. Используется как «быстрое решение» проблем с правами, но фактически открывает файл для любого процесса, включая возможных атакующих. Правильное решение — выставить корректного владельца через chown и адекватные права (644 или 755), а не открывать всё миру.
Как массово поменять права на директорию с файлами?
chmod -R рекурсивно. Но обычно нужны разные права для файлов (644) и директорий (755). Используйте find: find /path -type d -exec chmod 755 {} + и find /path -type f -exec chmod 644 {} +. Или одной командой через X (заглавная): chmod -R u=rwX,g=rX,o=rX /path.
Что запомнить
- Права в Linux: 9 битов
rwxдля user/group/other + 3 специальных. - Числовая нотация:
644(rw-r--r--),755(rwxr-xr-x),600(rw-------). - Символическая:
chmod u+x,chmod g-w,chmod o=r. - Recursive с разделением файлов и директорий:
find ... -type d/f -exec chmod .... - SUID/SGID/sticky — четвёртая цифра в начале (
4755,2755,1777). - SSH-ключи:
600приватный,644публичный,700директория. 777— почти всегда неправильное решение; используйтеchown+ адекватные права.- SUID игнорируется Linux на интерпретируемых скриптах.
umask 022— дефолт;umask 077— для повышенной безопасности.