ServerAID
Найти гайд, команду, тег… ⌘ K
Безопасность

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?

644rw-r--r--: владелец читает и пишет, остальные только читают. Стандарт для обычных файлов (документы, конфиги, исходники). 755rwxr-xr-x: владелец полный доступ, остальные читают и могут зайти/запустить. Стандарт для директорий и исполняемых файлов.

Какие права ставить на SSH-ключ?

Приватный ключ — 600 (rw-------), только владелец. Публичный ключ — 644. Директория ~/.ssh700. Файл authorized_keys600. SSH откажется работать с приватным ключом, права которого слабее (например, 644).

Чем отличается chmod от chown?

chmod меняет права доступа (что разрешено делать). chown меняет владельца и группу файла (кто его владелец). Это разные операции: можно поменять права, не трогая владельца, и наоборот. Часто используются в паре: chown www-data:www-data file && chmod 644 file.

Что такое 777 и почему это плохо?

777rwxrwxrwx, полный доступ для всех пользователей системы. Используется как «быстрое решение» проблем с правами, но фактически открывает файл для любого процесса, включая возможных атакующих. Правильное решение — выставить корректного владельца через 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 — для повышенной безопасности.

Похожие материалы

Безопасность

chown в Linux: смена владельца и группы файлов в Ubuntu

chown (change owner) — команда смены владельца и группы файла или директории в Linux. Часто используется вместе с chmod при настройке прав веб-сервера, передаче файлов между пользователями и работе с Docker-волюмами. Разбираем синтаксис, рекурсивные операции, как не сломать симлинки и сохранять владельцев при бэкапах через rsync.

Редакция
Безопасность

Let's Encrypt и certbot на Ubuntu: бесплатный SSL для nginx

Let's Encrypt — бесплатные SSL/TLS-сертификаты для любого домена. На Ubuntu выпускаются через утилиту certbot одной командой; автообновление работает само через systemd-таймер. Разбираем установку, выпуск для nginx, DNS-challenge для wildcard-сертификатов и грабли с rate-limit.

Редакция
Безопасность

SSH-ключи на Ubuntu: вход без пароля, отключение паролей и смена порта

Заходить на сервер по SSH без пароля и при этом безопаснее, чем с паролем — главная польза от ключей. Разбираем `ssh-keygen ed25519`, `ssh-copy-id`, отключение парольного входа в `sshd_config`, смену SSH-порта, настройку `~/.ssh/config` на клиенте и генерацию ключей из Windows. Всё на Ubuntu 24.04 LTS.

Редакция
Безопасность

fail2ban на Ubuntu: защита SSH от перебора пароля

fail2ban читает /var/log/auth.log, ловит N неудачных попыток входа с одного IP за окно времени и временно банит этот IP через UFW или nftables. После UFW это второй слой защиты SSH: фаервол режет порты, fail2ban — назойливых ботов, которые подобрались к разрешённому 22/tcp. В статье — установка fail2ban на Ubuntu 24.04, дисциплина jail.local вместо jail.conf, готовый jail для sshd, диагностика fail2ban-client status и что делать, если забанили самого себя.

Редакция