Unix-подобные ОС изначально проектировались как многопользовательские системы, а значит, нужно защитить данные и процессы пользователей от нежелательных посягательств других пользователей. Чуть выше мы уже упомянули права процесса и отметили, что, например, нельзя послать сигнал процессу другого пользователя (если нет особых прав на это). Подобный принцип применяется и для разделения прав на прочие объекты в ОС.
Базовый механизм разделения прав в UNIX-подобных системах основан на понятиях UID, или User ID (идентификатор пользователя) и GID, или Group ID (идентификатор группы, которой принадлежит пользователь). UID и GID – числа, но обычно с ними связывают текстовые имена. Каждый процесс имеет «реальные» UID и GID (ruid/rgid), которые не меняются со временем, а также список дополнительных групп, в которые он входит. Кроме реальных, процесс имеет «эффективные» UID и GID (euid/egid), которые определяют его текущие возможности (т. е. именно по ним определяются его права), а также «сохранённые» UID и GID (suid/sgid) – в них копируются эффективные UID/GID при смене UID/GID. Смена UID/GID может происходить, если у процесса есть такое разрешение (capability) или его EUID либо SUID равен 0.
Пользователь с UID = 0 обычно имеет текстовое имя 'root
' и имеет почти неограниченные права, поэтому часто его называют «суперпользователь».
Чаще всего, наверное, приходится сталкиваться с правами на файловой системе. Здесь каждый объект (файл, ссылка, каталог, устройство, сокет, канал, далее будем для краткости писать «файл») имеет владельца и группу, а также связанные с ними права – чтение, запись и исполнение. Часто для их записи используют восьмеричную запись или формат команды ls
. Например, права с восьмеричным кодом 750
(в выдаче ls rwxr-x–
) обозначают, что владельцу разрешено чтение, запись и исполнение (rwx / 7
), группе – чтение и исполнение (r-x / 5
), остальным – ничего (-– / 0
).
Проверка прав производится в таком порядке – если владелец файла совпадает с EUID, берутся права владельца. Иначе, если группа или одна из дополнительных групп совпадают с группой файла, то берутся права группы, и в противном случае – права «остальные».
Для каталога право на «исполнение» означает возможность войти в каталог. При этом посмотреть список файлов в нём не гарантируется – для этого нужно право на чтение. Право на запись означает возможность создавать и удалять файлы в каталоге. Сменить права на файл (или другой объект) может только его владелец. Если нужно сменить права для группы, то владелец должен в неё входить. Ну и конечно, суперпользователь может менять любые права, а также владельца и группу любого файла.
Как уже было сказано, право записи в каталог позволяет создавать и удалять в нём файлы. В том числе чужие. Чтобы обеспечить комфорт работы с общими каталогами, например /tmp
, и не позволять удаление чужих файлов, был придуман дополнительный «липкий» флаг (sticky
). Если каталог обладает им, то удаление файлов разрешается только тем, кто владеет файлом и имеет право записи в каталог (и root
-у, конечно).
Раз уж мы коснулись файловой системы, то стоит отметить ещё два флага – suid
и sgid
. Если файл имеет флаг suid
, то при его запуске EUID процесса сменится на владельца файла. Для sgid
– аналогично, но для группы. Чаще всего он ставится на файлы, исполнение которых необходимо с правами суперпользователя, например passwd
. Для скриптов они не работают. Если флаг sgid
устанавливается на каталог, то созданные в нём файлы и каталоги автоматически наследуют группу. Флаг suid
на каталогах игнорируется.
Как уже упоминалось выше, посмотреть права можно командой ls
. В строке прав первым символом показывается тип файла ('-
' = файл, 'd
' = каталог, 'l
' = ссылка, 's
' = сокет и т. п.), далее три группы прав владельца, группы и остальных по три символа 'r/-
', 'w/-
' 'x/-
' для чтения, записи и исполнения соответственно ('-
' означает отсутствие прав). Флаг sticky
обозначается символом 't
' вместо 'x
' в группе «остальные». флаги suid/sgid – символом 's
' вместо 'x
' в группе «владелец» или «группа» соответственно. Если за этой строчкой идёт символ '+
', это значит, что на этот файл установлены acl (см. ниже).
Менять права на файл можно командой chmod
. Сменить владельца файла – командой chown
, группу – chgrp
. Для того, чтобы сменить права на файл, команде chmod нужно указать новые в восьмеричном виде или в символьном. Последний вариант позволяет добавить или удалить отдельные права для владельца, группы или остальных, например:
В символьном виде для chmod
указывается один или более символов 'u/g/o/a
' (владелец, группа, остальные, все три группы вместе), затем символ '+
' или '-
' для установки или сброса прав, и затем один или более символов 'r/w/x
' – какие права затрагиваются. Например, chmod go+rx myfile
добавит права на чтение и исполнение для группы и остальных файлу myfile
.
Описанная выше система покрывает множество потребностей, но не все. В попытках улучшить её были созданы различные расширения, реализованные в файловых системах Linux. Одно из них – расширенные атрибуты файлов. Они включены по умолчанию, и их можно смотреть и изменять командами lsattr
и chattr
. Самые важные для нас:
Таблица 4: некоторые расширенные атрибуты
Если расширенный атрибут запрещает какое-то действие (например удаление), то это распространяется даже на суперпользователя (в отличие от обычных атрибутов). Но суперпользователь может легко снять или установить любой из них.
Другое расширение, как правило требующее активации на файловой системе, – ACL (Access Control List), списки контроля доступа. Посмотреть и изменить их можно командами getfacl
и setfacl
. Они работают аналогично традиционным правам доступа, рассмотренным выше, однако права на чтение/запись/исполнение теперь можно устанавливать отдельным пользователям и/или группам, а также ограничивать эти права маской. Маска – набор «максимальных» прав из правил acl (традиционные к ним не относятся), которые будут работать. Например, разрешим пользователю vasya
чтение файла и запись в файл test.txt
:
Здесь ключ '-m
' указывает модифицировать правила acl. Указав ключ '--set
', можно заменить правила, т. е. удалить старые и заменить новыми (в setfacl
можно указать несколько правил одновременно). Ключом '-x
' правила можно удалять. Строка 'u:vasya;rw
' указывает на то, что правило относится к пользователю (u = user, g = group, o = others), его и<я vasya,
и устанавливаются права на чтение и запись. Теперь установим маску – разрешим пользователю vasya
(и другим, имеющим доступ через правила acl) «не более чем» чтение:
Как видим, правило осталось, но права на запись ограничены маской.
Ещё одно полезное свойство acl – наследование правил. На каталог можно установить acl «по умолчанию», они могут не совпадать с acl на сам каталог, и они будут автоматически применяться ко всем создаваемым файлам и каталогам.
Советуем подробнее прочесть о правах в Linux и опциях вышеупомянутых команд, тут мы их коснулись совсем немного.
Выше мы уже не раз использовали термины «сервис», «демон», «служба». Все они обозначают одно и то же: процесс или группу процессов, которые работают постоянно или автоматически запускаются по запросу. Их задача – обслуживать определённые запросы от пользователей, других процессов, других компьютеров в сети. Например, web-сервер apache
– сервис, обслуживающий запросы по http-протоколу. SMTP-сервер отвечает за запросы на передачу почтовых сообщений и т. д. Рассмотрим сервисы, часто используемые в суперкомпьютерах. О некоторых из них мы уже говорили выше и здесь только перечислим их.
Некоторые сервисы запускаются через «супердемон» inetd
или более новую его реализацию – xinetd
. В этом случае в конфигурационном файле inetd/xinetd
описываются необходимые сервисы: команда запуска, на каком порту слушать, от имени какого пользователя запускать и т. п. После запуска inetd/xinetd
начинает слушать на указанных портах и при получении запроса запускает соответствующую команду, которой на стандартный поток ввода направляется установленное сетевое соединение. Такой принцип облегчает написание сервиса, а также позволяет более гибко настраивать политику доступа к нему. Например, xinetd
позволяет задать диапазон адресов, с которых разрешён доступ, максимальное число одновременных запросов к сервису и т. п.
Чтобы узнать, работает ли конкретный сервис, можно проверить, запущен ли соответствующий процесс (за исключением сервисов, запускаемых через inetd/xinetd
), слушает ли какой-либо процесс нужный порт (если сервис привязан к порту) командой netstat -lpn
.
Основные (но не все) сервисы для кластера:
Таблица 5: некоторые стандартные сервисы и их порты
Более полный список можно найти в файле /etc/services
– он содержит соответствие номера порта традиционно используемому сервису. Некоторые сервисы в нём не представлены ввиду не очень широкого распространения, и, конечно, ничто не мешает запустить какой-либо сервис на нестандартном порту, не забывайте об этом. Через супердемон inetd/xinetd
часто запускаются такие сервисы, как tftp, echo, ftp
.
В системе UNIX несколько тысяч команд, однако в обычной работе пользователю достаточно хорошо знать несколько десятков команд. В этом пособии мы кратко рассмотрим небольшой набор наиболее употребительных команд. В первую очередь потребуются команды для работы с каталогами и файлами. Как и ранее, в квадратных скобках будем указывать необязательные параметры.
Самая главная команда, которая вам потребуется, – man
. Её имя происходит совсем не от английского «человек» (man), а от «руководство, учебник» (manual). Это – основной источник справочной информации по командам, пакетам и многому другому в UNIX и Linux. Вся информация в man
разделена по разделам, исторически им присвоены номера. Как правило, для получения справки по какой-то команде достаточно набрать man имя_команды
. Man найдёт первую страницу с заданным именем и отобразит её.
Таблица 6: разделы справки man
Так как в разных разделах могут быть страницы с одинаковыми именами, то иногда надо явно указать номер раздела. Например, по команде man crontab
отобразится информация по команде crontab
из раздела 1. Чтобы показать справку по формату файла crontab
, надо набрать man 5 crontab
, отобразить список файлов, в которых упомянуто нужное слово – man -k слово
. И конечно, не забудьте выполнить man man
.
Кроме man,
есть ещё команда info
, которая была призвана заменить man
, но, несмотря на массу новых возможностей, так и не стала популярной. Но многие аспекты стандартных программ и сервисов описаны в info
намного подробнее, чем в man
.
В именах файлов и каталогов можно использовать любые символы, кроме '/' и '\0
О проекте
О подписке