Права доступа в Linux — это не просто «кто может открыть файл». Это механизм который определяет что именно можно сделать с файлом и кому. Три вопроса к каждому файлу: кто владелец, какая группа, что разрешено остальным.
Читать права: что показывает ls -l
ls -l script.sh
-rwxr-xr-- 1 alex devops 2048 Mar 12 10:00 script.sh
Девять символов после первого - — это три тройки:
rwx — владелец (читать, писать, запускать) r-x — группа (читать, запускать, но не писать) r-- — все остальные (только читать)
Прочерк вместо буквы означает: это право отсутствует.
Числовые маски: быстро и однозначно
Каждое право имеет вес: r=4, w=2, x=1. Складываем для каждой группы:
rwx = 4+2+1 = 7 r-x = 4+0+1 = 5 rw- = 4+2+0 = 6 r-- = 4+0+0 = 4
Три цифры подряд — для владельца, группы, остальных.
Стандарт для исполняемых файлов и папок веб-сервера:
chmod 755 script.sh
Стандарт для конфигурационных файлов:
chmod 644 nginx.conf
SSH-ключ — только владелец, без этого ssh откажется его использовать:
chmod 600 ~/.ssh/id_rsa
Полный доступ всем — только когда это действительно нужно:
chmod 777 /tmp/shared
Символьный формат: менять конкретное право
Когда не нужно переписывать все права целиком — удобнее символьный формат. + добавляет право, - убирает, = устанавливает точно.
Дать владельцу право запускать:
chmod u+x deploy.sh
Убрать у группы и остальных право писать:
chmod go-w config.conf
Дать группе читать и запускать:
chmod g+rx /var/www/html
Установить точные права для остальных — только чтение, всё остальное убрать:
chmod o=r file.txt
Изменить несколько групп одной командой:
chmod u+x,go-x script.sh
Рекурсивно: для всей директории
Изменить права для папки и всего содержимого:
chmod -R 755 /var/www/mysite
Проблема -R — он ставит одинаковые права и файлам и папкам. Для файлов обычно нужно 644, для папок 755. Разделить через find:
find /var/www/mysite -type d -exec chmod 755 {} +
find /var/www/mysite -type f -exec chmod 644 {} +
Посмотреть что изменилось (только те файлы у которых права реально поменялись):
chmod -Rc 755 /var/www/mysite
Специальные биты: SUID, SGID, sticky
SUID — файл запускается с правами владельца, а не того кто его запустил. Именно поэтому обычный пользователь может сменить пароль командой passwd — она принадлежит root и имеет SUID:
chmod u+s /usr/bin/myprogram
В выводе ls -l появится s на месте x у владельца: -rwsr-xr-x.
SGID на директории — новые файлы внутри наследуют группу папки, а не группу создателя. Удобно для командных папок где несколько человек работают с одними файлами:
chmod g+s /shared/team
Sticky bit на директории — каждый может создавать файлы, но удалять только свои. Именно так устроен /tmp:
chmod +t /shared/uploads
В выводе появится t в конце: drwxrwxrwt.
Числовые значения — четвёртая цифра в начале маски:
chmod 4755 /usr/bin/myprogram
chmod 2775 /shared/team
chmod 1777 /tmp
Шпаргалка
| Задача | Команда |
|---|---|
| Посмотреть права | ls -l файл |
| Стандарт для скриптов | chmod 755 файл |
| Стандарт для конфигов | chmod 644 файл |
| SSH-ключ (только владелец) | chmod 600 файл |
| Добавить право на запуск | chmod u+x файл |
| Убрать запись у группы | chmod g-w файл |
| Рекурсивно на папку | chmod -R 755 /path/ |
| Папки отдельно от файлов | find /path -type d -exec chmod 755 {} + |
| Только файлы рекурсивно | find /path -type f -exec chmod 644 {} + |
| SUID | chmod u+s файл или chmod 4755 файл |
| SGID на директорию | chmod g+s папка или chmod 2755 папка |
| Sticky bit | chmod +t папка или chmod 1777 папка |