Команда chmod в Linux – изменение прав доступа

Итак, команда chmod (change mode – изменить режим [доступа]) – мегаважная команда, без которой затруднительно будет организовать безопасную среду работы в ОС Linux. При помощи этой команды можно сменить права доступа к тем или иным файлам.

Какие бывают права доступа в Linux?

  1. Чтение (read, “r”, 100 (4)) – для файлов это означает, что можно ознакомиться с его содержимым. Для каталога – показать его содержимое.
  2. Запись (write, “w” 010 (2)) – для файлов это – изменить содержимое. Для каталога – манипуляции с файлами внутри каталога (есть нюансы).
  3. Выполнение (execute, “x” 001 (1)) – для файлов – запустить файл на выполнение. Для каталога – перейти в него и получить атрибуты файлов (не имена). Нюанс, о котором говорил про “w” на каталоге – работает вместе с “x”.

Обратите внимание на числовые коды – их можно использовать вместо буквенных. Например, если нужно назначить право на выполнение – можно установить код 1. Если – на чтение и выполнение – то 5 (4+1). Если на всё – то 7 (4+2+1).

Для кого могут ограничиваться права доступа в Linux?

  1. Владелец файла (user, “u”) – непосредственно тот, кто создал файл. В файловой системе записывается его числовой uid. Все числовые uid приводятся в файле /etc/passwd.
  2. Группа владельца (group, “g”) – общность пользователей. Группы приведены в файле /etc/group. Каждый пользователь входит хотябы в одну группу (по умолчанию – в группу, совпадающую с его именем). Может входить в несколько групп.
  3. Остальные (others, “o”) – все остальные, кроме владельца и его группы.
  4. Все (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-бита на файл не имеет смысла сейчас, современные версии ОС его игнорируют. Раньше он использовался для запрета выгрузки файла из памяти.

Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Comments: 2
  1. TestTest

    Как говорится: Век живи – век учись.
    Спасибо за статью. Я знал про существование дополнительных битов, но никогда не задумывался об их назначении.
    Полезная штука, однако. Особенно Sticky.

    А мне вот что интересно: вышеописанное (про SUID, SGID И Sticky) только к Linux применимо или и к *BSD тоже?

    1. litladmin (author)

      К счастью, там то же самое

Leave a Reply