Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает. |
Аутентификация и права доступа в UNIX
Иерархия прав доступа
Выдача команды ls -l содержит, помимо прочего, информацию о правах доступа к файлу:
alt$ ls -l /bin/sh /etc/anacrontab -rwxr-xr-x 1 root root 375276 Окт 9 19:22 /bin/sh -rw-r----- 1 root adm 363 Дек 29 1999 /etc/anacrontab
В приведенном примере файл /etc/anacrontab принадлежит пользователю root и группе adm, а файл /bin/sh - пользователю root и группе root (совпадение имени пользователя и группы не случайно, но это все же разные ярлыки - UID и GID).
Начало строки содержит знакомые нам символы r, w и x. Самый первый символ - тип файла (для каталогов вместо " - " будет d, для символьных ссылок - l и т. п.). Следующие девять символов надо рассматривать по три: первая тройка - права доступа к файлу его хозяина (субъекта, UID которого совпадает с UID файла); обозначим эту тройку буквой u (user). Вторая тройка - это права доступа члена группы (субъекта, GID одной из групп которого совпадает с GID файла); обозначим эту тройку буквой g (group). Наконец, последняя тройка описывает права доступа постороннего (не хозяина и не члена группы ); эта тройка обозначается буквой o (other). Все три группы принято обозначать буквой a (all).
Если доступ определенного вида разрешен, в выдаче ls будет стоять соответствующая буква в соответствующей тройке, а если нет - вместо нее появится прочерк (знак " - ").
Когда некий процесс желает сделать что-нибудь с некоторым файлом, система для начала проверяет, не является ли он хозяином этого файла. Если UID процесса и файла совпадают, права доступа определяются по первой тройке. Если UID не совпадает, но субъект с этим UID входит в группу, GID которой совпадает с GID файла, права доступа определяются по второй тройке. Наконец, если ни UID, ни GID файла не имеют отношения к номинальному субъекту, система воспользуется третьей тройкой. В приведенном выше примере право на запись в оба файла имеет только пользователь root, право читать из файла /etc/anacrontab имеют root и члены группы adm, а читать (например, копировать) и запускать файл /bin/sh могут и хозяин, и члены группы root, и все остальные.
Изменить хозяина или группу файла можно командами соответственно chown и chgrp. Правда, первую из них обычному пользователю запускать незачем: если хозяин файла не он, система не даст выполнить chown. Да и группу файла субъект может сменить только при наличии прав на запись и только на такую, в которой он состоит.
Изменить права доступа к файлу можно командой chmod. Формат команды в общем виде таков: "chmod аудитория способ_изменения права список_файлов". Здесь аудитория - строчка из символов u, g, o и a (означающих, как уже говорилось, права для хозяина, группы, остальных или всех сразу); способ_изменения - один из символов +, - или =, означающих соответственно разрешение, запрет, или точную установку прав доступа ; права - это строчка из символов r, w и x. Конструкций вида аудитория способ_изменения права в команде может быть несколько, тогда они разделяются запятой.
$ chmod a=r,u=rw file # установить права rw-r--r-- $ ls -al file -rw-r--r-- 1 george staff 0 Dec 4 11:22 file $ chmod o-rwx file # запретить посторонним все $ ls -al file -rw-r----- 1 george staff 0 Dec 4 11:22 file
Принимая во внимание то, что атрибут - это один бит (есть доступ или нет), весь список атрибутов может быть представлен двоичным числом, в котором на месте " - " стоит 0, а на месте буквы - 1. В нашем примере последнее значение атрибутов файла было -rw-r-----, т. е. 0110100000. На самом деле именно так атрибуты представлены в системе, поэтому вместо длинного слова "атрибут" часто говорят просто "бит": "x-бит" - право на выполнение и т. п. Вместо двоичной записи удобно использовать восьмеричную: восьмеричная цифра занимает ровно три бита, поэтому каждая rwx-тройка попадет в отдельную цифру. Восьмеричное представление поддерживает и chmod ; этот способ менее нагляден, но более лаконичен: например, чтобы сразу установить права -rw-r----- файлу file, достаточно команды chmod 640 file. Восьмеричная система счисления вообще удобна: среди цифр нет букв, таблица умножения проще, чем в десятичной системе (не говоря уже о шестнадцатеричной), цифра занимает ровно три бита... когда-то она была очень популярна; но шестнадцатеричная вытеснила ее за счет краткости и того, что байт в ней занимает ровно две цифры, а не 2+2/3, как в восьмеричной.
Разделяемые каталоги
Как уже говорилось, права записи в каталог организованы так, что из своего каталога пользователь может удалить чей угодно файл. Хуже того: если в каталог разрешено писать целой группе или вообще всем, то любой из имеющих право записи может удалить или переименовать чужой файл. Значит, улучив момент, можно этот файл подменить: процесс файл закрыл, потом открыл, да уже другой. Что делать? На такой случай придуман еще один атрибут: так называемый t-бит:
freebsd$ ls -ald /tmp drwxrwxrwt 5 root wheel 512 Dec 4 10:12 /tmp
Несмотря на то что ls ставит t вместо x, t-бит - еще один, десятый (формально - девятый, так как биты принято нумеровать с нуля) бит атрибутов каталога; в восьмеричной записи права на /tmp выглядели бы как 1777.
В свое время t-бит придумали для исполняемых файлов. Процесс, запущенный из файла с этим атрибутом, нельзя было выгружать из памяти в область подкачки (swap), отсюда и его официальное название: бит навязчивости (sticky bit). Годы идут, политика распределения оперативной памяти меняется, и это свойство t-бита давно не используется (в некоторых системах нынче выгружаются даже ненужные страницы памяти ядра). Навязчивость каталогу ни к чему, поэтому для каталога t-бит имеет другой смысл: пользователь, которому разрешена запись в каталог, имеющий атрибут t, может изменять только названия собственных файлов (проверяется совпадение UID).