Освоение разрешений файлов Linux с помощью команды 'chmod'
Изучите chmod с символическими и числовыми режимами, безопасными значениями по умолчанию, рекурсивными изменениями и специальными битами разрешений.
Освоение прав доступа к файлам в Linux с помощью команды 'chmod'
Права доступа к файлам в Linux определяют, кто может читать, изменять или запускать файл. Когда скрипт не выполняется, веб-сервер не может прочитать файл или закрытый ключ отклоняется как слишком открытый, chmod часто является частью решения.
Команда chmod изменяет биты разрешений. Вы можете использовать читаемые символические режимы, такие как u+x, или компактные числовые режимы, например 755.
Чтение строк разрешений
Выполните ls -l, чтобы увидеть тип файла и его разрешения:
ls -l deploy.sh
Пример вывода:
-rwxr-xr-- 1 app deploy 1200 May 23 10:00 deploy.sh
Первый символ — это тип файла. Обычный файл начинается с -, каталог — с d, а символическая ссылка — с l.
Следующие девять символов — это три группы разрешений:
- Пользователь: владелец файла.
- Группа: члены группы файла.
- Остальные: все остальные.
Каждая группа может иметь:
r: чтение содержимого файла или список имен в каталоге.w: изменение файла или создание/удаление/переименование записей в каталоге.x: выполнение файла или переход по каталогу.
Разрешение на выполнение для каталога имеет значение. Без x для каталога вы не сможете войти в него или получить доступ к файлам внутри по имени, даже если сможете просмотреть некоторые метаданные в другом месте.
Использование символических режимов для небольших изменений
Символический синтаксис выглядит так:
chmod [кто][оператор][разрешения] путь
кто может быть u для пользователя, g для группы, o для остальных или a для всех. Операторы: + для добавления, - для удаления и = для точной установки.
Сделайте скрипт исполняемым для владельца:
chmod u+x deploy.sh
Разрешите группе редактировать общий файл:
chmod g+w shared_document.txt
Удалите права на запись для группы и остальных:
chmod go-w config.yml
Установите для остальных только чтение, заменив все существующие разрешения для остальных:
chmod o=r project_plan.txt
Символические режимы полезны, потому что они изменяют только те биты, которые вы указываете.
Использование числовых режимов для полных наборов разрешений
Числовые режимы устанавливают разрешения для пользователя, группы и остальных одной командой. Каждое разрешение имеет значение:
- Чтение:
4 - Запись:
2 - Выполнение:
1
Сложите значения для каждой группы:
| Режим | Значение |
|---|---|
7 |
rwx |
6 |
rw- |
5 |
r-x |
4 |
r-- |
0 |
--- |
Установите для обычного текстового файла чтение/запись для владельца и только чтение для всех остальных:
chmod 644 important_file.txt
Установите для обычного каталога возможность управления владельцем и возможность входа и чтения для остальных:
chmod 755 public_assets
Заблокируйте закрытый ключ, чтобы только владелец мог его читать и записывать:
chmod 600 private_key.pem
Избегайте 777, если только вы не находитесь во временной тестовой среде и понимаете риск:
chmod 777 scratch
777 позволяет любому локальному пользователю читать, записывать и выполнять или переходить по пути. В общих системах это редко приемлемо.
Обработка файлов и каталогов по-разному
Файлы и каталоги обычно требуют разных режимов. Файлы часто используют 644; каталоги часто используют 755. Если вы выполните это вслепую, вы сделаете каждый файл исполняемым:
chmod -R 755 web_root/
Для веб-каталога более безопасный шаблон:
find web_root -type d -exec chmod 755 {} +
find web_root -type f -exec chmod 644 {} +
Затем добавьте разрешение на выполнение только для скриптов, которые действительно в этом нуждаются:
chmod 755 web_root/scripts/deploy.sh
Осторожное использование специальных битов разрешений
Числовые режимы могут включать четвертую ведущую цифру для специальных битов:
| Значение | Имя | Общий эффект |
|---|---|---|
4 |
SetUID | Исполняемый файл запускается с эффективным идентификатором пользователя владельца файла. |
2 |
SetGID | Исполняемый файл запускается с эффективным идентификатором группы файла; для каталогов новые записи наследуют группу каталога. |
1 |
Sticky bit | В каталогах пользователи могут удалять только те файлы, которые они владеют, владелец каталога или root. |
Установите бит SetGID для общего каталога проекта, чтобы новые файлы наследовали группу каталога:
chmod 2770 shared_group_files
Установите sticky bit для общего каталога с возможностью записи:
chmod 1777 /srv/shared-upload
Классический пример — /tmp, который доступен для записи всем, но защищен sticky bit.
Будьте осторожны с SetUID и SetGID для исполняемых файлов. Они могут создать серьезный риск повышения привилегий, если программа доступна для записи, плохо спроектирована или принимает небезопасный ввод. Многие Unix-подобные системы также игнорируют SetUID для скриптов по соображениям безопасности.
Проверка результата
После изменения разрешений проверьте их:
ls -ld web_root web_root/index.html
Используйте stat, когда вам нужен числовой режим:
stat -c '%a %n' web_root/index.html
В macOS формат stat отличается:
stat -f '%Lp %N' web_root/index.html
Вывод
Используйте символический chmod, когда хотите добавить или удалить одно разрешение. Используйте числовой chmod, когда хотите точно установить полный режим. Относитесь к рекурсивным изменениям с осторожностью, держите файлы и каталоги отдельно и проверяйте с помощью ls -l или stat, прежде чем продолжить.