Содержание
Итак, команда chmod (change mode – изменить режим [доступа]) – мегаважная команда, без которой затруднительно будет организовать безопасную среду работы в ОС Linux. При помощи этой команды можно сменить права доступа к тем или иным файлам.
Какие бывают права доступа в Linux?
- Чтение (read, “r”, 100 (4)) – для файлов это означает, что можно ознакомиться с его содержимым. Для каталога – показать его содержимое.
- Запись (write, “w” 010 (2)) – для файлов это – изменить содержимое. Для каталога – манипуляции с файлами внутри каталога (есть нюансы).
- Выполнение (execute, “x” 001 (1)) – для файлов – запустить файл на выполнение. Для каталога – перейти в него и получить атрибуты файлов (не имена). Нюанс, о котором говорил про “w” на каталоге – работает вместе с “x”.
Обратите внимание на числовые коды – их можно использовать вместо буквенных. Например, если нужно назначить право на выполнение – можно установить код 1. Если – на чтение и выполнение – то 5 (4+1). Если на всё – то 7 (4+2+1).
Для кого могут ограничиваться права доступа в Linux?
- Владелец файла (user, “u”) – непосредственно тот, кто создал файл. В файловой системе записывается его числовой uid. Все числовые uid приводятся в файле /etc/passwd.
- Группа владельца (group, “g”) – общность пользователей. Группы приведены в файле /etc/group. Каждый пользователь входит хотябы в одну группу (по умолчанию – в группу, совпадающую с его именем). Может входить в несколько групп.
- Остальные (others, “o”) – все остальные, кроме владельца и его группы.
- Все (all, “a”) – вообще все субъекты (совокупность 1, 2, 3 пунктов).
Как посмотреть установленные права
Для просмотра прав, установленных на объект используется команда ls с ключом -l:
- Первый блок – непосредственно права доступа. Идут они тремя секциями по 3 знака: сперва для владельца (user), затем для группы владельца (group), затем для остальных.
Если какого-то флага нет, то, соответственно, пересчитывается:
- Второй блок – соответственно имя владельца и имя группы владельца.
- Третий блок – имя файла.
Теперь, собственно, как назначаются права:
Синтаксис команды chmod
$ chmod [опции] права файл
Из опций единственная, которой я когда-либо пользовался – -R – рекурсивная обработка каталога. Т.е. если повесить права на каталог, то эти же права будут назначены и для всех объектов, вложенных в него (включая другие каталоги).
Символьная нотация
Определимся, что мы хотим сделать. Если нужно установить права – используем знак “=”. Если убрать какие-то права – то знак “-“. Если добавить – знак “+”.
$ chmod ugo=rx file1.txt
Установит на файл file1.txt права rx для владельца, группы и остальных.
$ chmod o-r file1.txt
Уберёт у остальных право на чтение файла.
$ chmod a+x file3.txt
Добавит всем право на выполнение файла.
Числовая нотация
Здесь всё аналогично, но придётся немного поскладывать в уме числа. Если подразобраться, то этот способ куда более компактный и быстрый. Его основное отличие – он эквивалентен присваиванию прав, а не добавлению или убавлению какого-либо права.
Например вместо $ chmod ugo=rx file1.txt
можно было написать $ chmod 555 file1.txt
.
Чтобы было легче запомнить – вот список:
- 0 – никаких прав
- 1 – только выполнение
- 2 – только запись
- 3 – запись и выполнение
- 4 – только чтение
- 5 – чтение и выполнение
- 6 – чтение и запись
- 7 – чтение запись и выполнение
Немного чёрной магии
Помните, я говорил, что права задаются тремя числами? Для владельца, для группы и для остальных? Это не вся правда. Есть ещё одно число, которое творит настоящую чертовщину в мозгу неопытных пользователей. По умолчанию этот блок не затрагивается (как будто там стоит 0), но если указать явно, то вот что значит тот самый блок:
SUID (4000, “u+s”) – если этот бит назначен на исполняемом файле, то файл запустится от имени владельца файла (а не того пользователя, кто этот файл запустил).
Допустим, у нас есть скрипт, добавляющий новое правило в файрволл. Само-собой, операция требует повышенных прав (root) и обычный пользователь запустив такой скрипт получит отказ в доступе. Но если назначить скрипту SUID-бит и владелец скрипта будет root, то пользователь сможет его запускать от имени root соответственно. Это круто, но в то же время может быть опасно.
Если SUID назначен на каталог – то файл запустится от имени владельца каталога.
SGID (2000, “g+s”) – практически то же самое, только вместо владельца – берётся группа владельца.
Sticky (1000, “t”) – вот тут начинается самая жесть. Если у нас есть каталог, на котором установлен t-бит, то удалить из этого каталога файлы может только владелец, несмотря на то, что на каталоге может стоять право 777.
Поясню. Допустим, у нас есть каталог /tmp. В него может писать кто угодно. Сделаем там права 777 – т.е. полная помойка. Но вам бы не хотелось, чтобы я мог удалять ваши файлы? А мне бы не хотелось, чтобы вы удаляли мои. Поэтому на каталог вешаем бит “t” и всё. Сохранять в каталог могут все, а удалять – только своё.
Установка Sticky-бита на файл не имеет смысла сейчас, современные версии ОС его игнорируют. Раньше он использовался для запрета выгрузки файла из памяти.
Как говорится: Век живи – век учись.
Спасибо за статью. Я знал про существование дополнительных битов, но никогда не задумывался об их назначении.
Полезная штука, однако. Особенно Sticky.
А мне вот что интересно: вышеописанное (про SUID, SGID И Sticky) только к Linux применимо или и к *BSD тоже?
К счастью, там то же самое