Удалять файлы операционной системы или читать список паролей нельзя почти никогда, а запускать команду ls можно всегда.

В Unix есть два основных механизма для управления тем, что разрешено делать: пользователи и группы пользователей.

Каждый файл принадлежит какому-то пользователю и какой-то группе.

Пользователи

Unix — многопользовательская система. Список пользователей обычно находится в файле /etc/passwd. Каждая строка там — это описание пользователя в виде разделённых двоеточиями полей (см. passwd(5)):

  • Имя;
  • Пароль (в /etc/passwd не пишется);
  • Номер пользователя;
  • Номер основной группы пользователя;
  • Описание;
  • Домашняя директория (домашний каталог);
  • Путь к shell, используемому пользователем.

Использование пользователей

Важный пользователь — root (рут), с номером 0. Это суперпользователь, ему всё можно.

Есть пользователи, которые связаны с реальными людьми.

Запускать какую-то долго работающую программу с доступом в сеть от рута — плохо: если её взломают, то получат доступ ко всему. Хотя бы по этой причине создаётся много пользователей-болванок, от имени которых запущены сервисы и которым нельзя почти ничего.

Домашний каталог

Каждому пользователю присвоен домашний каталог (и обычно ему же принадлежит). Там обычно хранятся его личные файлы, а используемые программы ищут/сохраняют свою конфигурацию где-то относительно домашнего каталога.

cd без аргументов:

cd

переходит в домашний каталог.

Рабочая директория программы, запускаемой при входе в систему, будь то shell или графическая оболочка, — домашний каталог.

Домашний каталог обозначается символом ~.

Группы

Каждый пользователь относится к набору групп. Созданные пользователем файлы будут принадлежать его основной группе.

id

выводит имя и список групп данного пользователя, например:

uid=1000(p01) gid=1000(p01) groups=1000(p01),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),135(lxd),136(sambashare)

Важно

Частая проблема: добавление пользователя в группу будет иметь эффект только при следующем входе в систему. Запомните это!

Права

В выводе команды ls -l есть следующие колонки: права на файл, число ссылок на него, владелец файла, группа-владелец файла, размер файла, дата последнего редактирования, имя.

В колонце с правами в начале указывается тип файла. Например -, если это обычный, регулярный файл.

Если это директория или устройство, то там будет d или b/c соответственно.

Подробнее (как читать) см. info:

info '(coreutils)What information is listed'` 

Дальше в колонке с правами идут три триады — это права на этот файл для:

  • владельца файла
  • группы-владельцы файла
  • и всех остальных пользователей систем

Смысл прав

Допустим, у нас есть файл a,

ls -l a 
## вывод
---xrw-r-- 1 p01 p01 0 дек 01 12:16 a

файл регулярный, права на файл такие: --xrw-r--

Разобьём множество всех пользователей системы на подмножества:

  • владелец файла a
  • группа-владелец файла a
  • все остальные пользователи системы
  • root, потому что он особенный

и подпишем какие у них права.

По этой картинке можно понять что нам можно делать:

  • если мы пользователь из множества владелец, то нам можно делать только то, что указано: исполнять файл; читать и писать его нельзя;
  • если мы пользователь из множества группа-владелец, то мы можем только читать и писать в этот файл

Права при этом не объединяются: если мы и владелец и находимся в группе-владельце (так чаще всего и бывает), то права, которые указаны у владельца важнее и перетирают права, которые получаем засчёт нахождения в группе-владельце.

Для обычных файлов

  • Чтение (r):

    • read (Чтение)
    • Действия: Чтение файла.
  • Запись (w):

    • write (Запись)
    • Действия: Запись в файл.
  • Исполнение (x):

    • execute (Исполнение)
    • Действия: Исполнение файла как программы.

Для директорий

  • Чтение (r):

    • read (Чтение)
    • Действия: Получение списка имён содержимого директории.
  • Запись (w):

    • write (Запись)
    • Действия: Изменение содержимого директории: добавление, удаление, переименование файлов.
  • Исполнение (x):

    • execute (Исполнение)
    • Действия: Использование директории как текущей.

Как установить права

Символьное представление прав

В Linux для изменения прав файлов используется команда chmod с символьным представлением. Этот метод использует буквы и символы для обозначения категорий пользователей и разрешений.

Вот разбивка:

  • u, g, o, a обозначают Пользователя, Группу, Остальных и Всех соответственно.
  • +, -, = используются для добавления, удаления или установки разрешений.
  • r, w, x, - обозначают Чтение, Запись, Исполнение и Отсутствие разрешения.

Примеры:

  1. chmod u+x файл: Эта команда добавляет (+) разрешение на исполнение (x) пользователю (u) для файла с именем файл.
  2. chmod a=rw файл: Устанавливает (=) разрешения на чтение (r) и запись (w) для всех пользователей (a) файла файл.
  3. chmod g-w файл: Удаляет (-) разрешение на запись (w) у группы (g) для файла файл.
  4. chmod o+r файл: Добавляет (+) разрешение на чтение (r) для остальных пользователей (o) файла файл.

Числовое представление прав

Права также могут быть представлены численно, с использованием восьмеричного числа.

Каждый разряд представляет разные наборы пользователей:

  • разряд сотен для разрешений владельца.
  • разряд десятков для разрешений группы.
  • разряд единниц для разрешений остальных.

Каждая цифра является суммой:

  • 4 для чтения (r),
  • 2 для записи (w),
  • 1 для исполнения (x).

Примеры:

  • chmod 644 файл: Устанавливает разрешения на чтение (4) и запись (2) для владельца (всего 6), и разрешение на чтение (4) для группы и остальных.
  • chmod 750 файл: Устанавливает разрешения на чтение (4), запись (2) и исполнение (1) для владельца (всего 7), чтение и исполнение (5) для группы и никаких разрешений (0) для остальных.
  • chmod 777 файл: Устанавливает разрешения на чтение, запись и исполнение для всех.
  • chmod 400 файл: Устанавливает разрешение на чтение только для владельца и никаких разрешений для группы и остальных.

Для получения дополнительной информации обратитесь к странице руководства chmod (man chmod или chmod(1p)).

SUID, SGID, sticky bit

В третьем поле каждой триады может быть не только - и x.

  • s в первой триаде: SUID (set-user-id) — программа будет исполняться так, будто её запустил её владелец.
  • S во второй триаде: SGID (set-group-id) — программа будет исполняться так, будто нынешний пользователь состоит в группе, которой она принадлежит.
  • t в третьей триаде: sticky bit — на файлах не имеет смысла, а на директории означает, что удалить файл из неё сможет только владелец файла или самой директории.

Примеры SUID

SUID нужен, когда хочется пользователям дать ограниченный объём власти. Несколько SUID-приложений, принадлежащих руту:

  • su (super user) запускает shell от имени другого пользователя (обычно — рута).
  • sudo (super user do) от имени другого пользователя (обычно — рута) выполняет поданную в аргументах команду. Пример: $ sudo rm -rf /*.

Временная директория

/tmp — директория, в которой хранятся временные файлы. Обычно очищается при перезапуске компьютера, а её содержимое находится в оперативной памяти.

На /tmp стоит sticky bit: директория публичная, каждый должен иметь право в неё писать, но мы не хотим каждому позволять что угодно из неё удалить.

См. mktemp(1) или документацию к своему языку программирования, чтобы узнать, как создавать временные файлы и директории, и никому этим не мешать.

Числовое представление SUID, SGID, sticky bit

Для установки этих флагов можно указать старший, четвёртый разряд chmod:

  • 4000 — SUID,
  • 2000 — SGID,
  • 1000 — sticky bit.

Примеры:

  • chmod 4755 означает “установлен SUID; владелец имеет право на чтение, запись и исполнение (4 + 2 + 1 = 7), а все остальные — только на чтение и исполнение (4 + 1 = 5)“.

см chmod(1p)