Азы работы в командной строке Linux (часть 6)
Предыдущие части:
- Азы работы в командной строке Linux (часть 1)
- Азы работы в командной строке Linux (часть 2)
- Азы работы в командной строке Linux (часть 3)
- Азы работы в командной строке Linux (часть 4)
- Азы работы в командной строке Linux (часть 5)
Эта часть посвящена правам доступа к файлам и программам для их изменения.
Операционные системы Unix/Linux изначально являются не только многозадачными, но и многопользовательскими системами.
Что именно это означает? Это означает, что использовать компьютер одновременно может более чем один человек. Хотя типичный компьютер, скорее всего, будет иметь только одну клавиатуру и монитор, он все равно может использоваться более чем одним пользователем. Например, если компьютер подключён к сети или Интернету, удалённые пользователи могут войти в систему через ssh (смотрите Полное руководство по SSH в Linux и Windows) и управлять компьютером. Фактически, удалённые пользователи могут выполнять графические приложения и отображать графический вывод на удалённом дисплее. Система X Window поддерживает это как часть своего базового дизайна.
Многопользовательские возможности Linux — это не недавнее «новшество», а скорее функция, которая глубоко встроена в дизайн операционной системы. Учитывая среду, в которой был создан Unix, это имеет смысл. В прошлом, до того, как компьютеры стали «персональными», они были большими, дорогими и централизованными. Например, типичная университетская компьютерная система состояла из большого центрального компьютера, расположенного в одном здании, и терминалов, расположенных по всему кампусу, каждый из которых был подключён к большому центральному компьютеру. Эти компьютеры изначально поддерживали работу одновременно многих пользователей.
Чтобы сделать это практичным, необходимо было разработать метод защиты пользователей друг от друга. В результате мы имеем, что в Linux действия одного пользователя не могут вызвать сбой компьютера, а также один пользователь не может вмешиваться в файлы, принадлежащие другому пользователю. В этом разделе Азов командной строки Linux мы рассмотрим эту базовую часть безопасности системы.
В настоящее время разграничение прав доступа не утратило своего значения — по-прежнему, настольный компьютер может использоваться более чем одним пользователем и они не смогут получить доступ к файлам друг друга. Ещё один очень распространённый пример: хостинги, где на одном сервере сотни и даже тысячи пользователей размещают свои сайты, при этом, если права настроены правильно, один пользователь не имеет доступа к файлам другого пользователя.
Наконец, при правильном выставлении прав доступа возможности злоумышленника получить доступ к файлам значительно уменьшаются. Например, если на сайте была найдена уязвимость удалённое выполнение кода, то такие команды будут выполняться от пользователя веб-сервер (apache2 или http), если для этого пользователя разрешить доступ только к необходимым ему файлам сайтов, то в этом случае возможности злоумышленника будут ограничены.
Владельцы, участники группы и все остальные
Рассмотрим пример с файлом /etc/shadow — в этом файле размещены хеши паролей пользователей, то есть это критически важный для безопасности ОС файл.
С командой file мы ещё не знакомились — это замечательная команда, она показывает тип файла. В системах Linux довольно распространено использование файлов без файловых расширений и поэтому трудно сказать, является ли конкретный файл текстовым, Bash скриптом или исполнимым бинарным файлом. Команда file делает именно это — определяет тип файла. Итак:
file /etc/shadow /etc/shadow: regular file, no read permission
В этом сообщении на английском сказано «обычный файл, нет прав на чтение».
Попробуем командой less:
less /etc/shadow /etc/shadow: Отказано в доступе
Причина этого сообщения об ошибке заключается в том, что мы, как обычные пользователи, не имеем разрешения на чтение этого файла.
В модели безопасности Unix, пользователь может владеть файлами и каталогами. Когда пользователь владеет файлом или каталогом, он контролирует доступ к нему. Такая концепция знакома многим, поскольку нечто схожее применяется и в Windows.
Для всех файлов и директорий Linux устанавливаются следующие права доступа:
- разрешение чтение содержимого файла
- разрешение на изменение (запись) содержимого файла
- разрешение на исполнение файла
В свойствах каждого файла и директории эти три разрешения устанавливаются отдельно для:
- владельца файла
- группы владельцев файла, которой принадлежит этот файл
- всех остальных
То есть каждый файл является собственностью одного владельца, а также группы.
То есть, к примеру, для владельца файла можно установить право чтения, записи и выполнения файла; для этого же файла для группы можно установить только право чтения; а для всех остальных можно установить полный запрет доступа.
Итак, имеют значения не только права доступа к файлу, но также и его владелец и группа.
Просмотреть права доступа, а также владельца и группу, к которой относится файл, можно уже известной нам командой ls с опцией -l:
ls -l /etc/shadow
Пример вывода:
-rw------- 1 root root 1078 июн 26 2019 /etc/shadow
Строка -rw——- содержит информацию о типе файла, правах доступа и особых свойствах (битах) данного файла. Первое слово root говорит о том, что владельцем является пользователь root. Второе слово root говорит о том, что файл относиться к группе root. То есть в системе существует группа root. Чтобы посмотреть пример, в котором имя пользователя и имя группы различается, выполним следующую команду:
ls -d -l ~/
В ней мы просматриваем свойства директории (-d) обозначенной как ~/ (домашняя директория текущего пользователя).
Пример вывода:
drwx------ 67 mial users 12288 мар 4 13:26 /home/mial/
Итак, тип и права доступа закодированы в строке drwx——, владельцем данной директории является пользователь mial, и файл принадлежит группе users.
Каждый пользователь может принадлежать к одной или нескольким группам. У пользователя одна группа является основной. В рассматриваемом вопросе основная группа имеет следующее значение: создаваемый пользователем файл в качестве владельца будет иметь текущего пользователя, а в качестве группы получит главную группу текущего пользователя. Другого практического значения выделения главной группы нет — пользователь будет иметь доступ к ресурсам всех групп, в которые он входит.
Чтобы узнать информацию о вашем пользователе выполните команду:
id
Пример вывода:
uid=1000(mial) gid=985(users) группы=985(users),56(bumblebee),108(vboxusers),315(kismet),986(video),994(disk),998(wheel)
В первой строке содержится имя пользователя (mial) и название главной группы данного пользователя (users). Во второй строке перечислены все группы, в которые входит этот пользователь.
Чтобы посмотреть информацию о другом пользователе, выполните команду вида:
id ИМЯ_ПОЛЬЗОВАТЕЛЯ
Например:
id root
Ещё свои группы можно посмотреть командой:
groups
Чтобы увидеть информацию для другого пользователя:
groups ИМЯ_ПОЛЬЗОВАТЕЛЯ
Например:
groups root root
Итак, при создании пользователя ему назначается номер, называемый идентификатором пользователя или uid, для удобства, этот идентификатор сопоставляется с именем пользователя. Пользователю также назначается первичный идентификатор группы или gid, пользователь также может принадлежать к дополнительным группам.
Где хранится эта информация? Как и многие вещи в Linux, в нескольких текстовых файлах. Учётные записи пользователей определены в файле /etc/passwd, а группы определены в файле /etc/group. Когда создаются учётные записи и группы пользователей, эти файлы изменяются вместе с /etc/shadow, который содержит информацию о пароле пользователя. Для каждой учётной записи пользователя файл /etc/passwd определяет имя пользователя (логин), uid, gid, реальное имя учётной записи, домашний каталог и оболочку входа. Если вы изучите содержимое /etc/passwd и /etc/group, вы заметите, что помимо обычных учётных записей есть учётные записи для суперпользователя (uid 0) и других пользователей системы.
Хотя многие Unix-подобные системы назначают обычных пользователей в общую группу, такую как «users», современная практика Linux заключается в создании уникальной группы из одного члена с тем же именем, что и у пользователя. Это облегчает определённые типы назначения разрешений.
Чтение, запись и выполнение
Права доступа к файлам и каталогам определяются с точки зрения доступа для чтения, доступа для записи и доступ к исполнению. Если мы посмотрим на вывод команды ls, мы можем получить некоторое представление о том, как это реализовано:
> foo.txt ls -l foo.txt
Вывод:
-rw-r--r-- 1 mial users 0 мар 4 19:30 foo.txt
Первые десять символов списка являются атрибутами файла. Первый из этих символов — тип файла. Вот типы файлов, которые вы, скорее всего, увидите (есть и другие, менее распространённые типы):
Типы файлов:
Атрибут | Тип файла |
---|---|
— | Обычный файл. |
d | Каталог. |
l | Символическая ссылка. Обратите внимание, что для символических ссылок оставшиеся атрибуты файла всегда имеют значение «rwxrwxrwx» и являются фиктивными значениями. Настоящие атрибуты файла — это те атрибуты файла, на которые указывает символическая ссылка. |
c | Специальный символьный файл. Этот тип файла относится к устройству, которое обрабатывает данные как поток байтов, такой как терминал или модем. |
b | Специальный файл блока. Этот тип файла относится к устройству, которое обрабатывает данные в блоках, таких как жёсткий диск или дисковод CD-ROM. |
Оставшиеся девять символов атрибутов файла, называемые режимом файла, представляют разрешения на чтение, запись и выполнение для владельца файла, владельца группы файла и всех остальных:
Владелец | Группа | Все остальные |
---|---|---|
rwx | rwx | rwx |
Если атрибуты режима r, w и x установлены, они действуют на файлы и каталоги следующим образом:
Атрибуты разрешений
Атрибуты | Файлы | Директории |
---|---|---|
r | Позволяет открывать и читать файл. | Позволяет отображать содержимое каталога, если также установлен атрибут выполнения. |
w | Позволяет записывать, редактировать файл, однако этот атрибут не позволяет переименовывать или удалять файлы. Возможность удалять или переименовывать файлы определяется атрибутами каталога. | Позволяет создавать, удалять и переименовывать файлы в каталоге, если также установлен атрибут выполнения. |
x | Позволяет обрабатывать файл как программу и выполнять. Программные файлы, написанные на языках сценариев, также должны быть доступны для чтения. | Позволяет входить в каталог, например, выполнять команду cd ДИРЕКТОРИЯ. |
Вот несколько примеров настроек атрибута файла:
Примеры атрибутов разрешений
Атрибуты файла | Значения |
---|---|
-rwx—— | Обычный файл, доступный для чтения, записи и выполнения владельцем файла. Никто другой не имеет доступа. |
-rw——- | Обычный файл, доступный для чтения и записи владельцем файла. Никто другой не имеет доступа. |
-rw-r—r— | Обычный файл, доступный для чтения и записи владельцем файла. Члены группы владельцев файла могут читать файл. Файл доступен для чтения. |
-rwxr-xr-x | Обычный файл, доступный для чтения, записи и выполнения владельцем файла. Файл может быть прочитан и исполнен всеми остальными. |
-rw-rw—- | Обычный файл, который доступен для чтения и записи только владельцу файла и членам группы файла. |
lrwxrwxrwx | Символическая ссылка. Все символические ссылки имеют «фиктивные» разрешения. Реальные разрешения сохраняются вместе с реальным файлом, на который указывает символическая ссылка. |
drwxrwx— | Директория. Владелец и члены группы владельцев могут входить в каталог и создавать, переименовывать и удалять файлы в каталоге. |
drwxr-x— | Директория. Владелец может войти в каталог и создавать, переименовывать и удалять файлы в каталоге. Члены группы владельцев могут войти в каталог, но не могут создавать, удалять или переименовывать файлы. |
Права доступа в Linux не меняются автоматически. Это означает, что если вы скопировали из директории /root файл, принадлежащий пользователю root в папку другого пользователя, то это не означает, что файл меняет владельца и/или пользователь получает права записи в этот файл если ранее у него таких прав не было.
chmod для смены режима доступа к файлу и директориям
Синтаксис использования chmod следующий:
chmod РЕЖИМА ФАЙЛ
Начнём с ходовых примеров использования chmod, а затем рассмотрим все варианты обозначения РЕЖИМА, который может быть указан несколькими способами.
Предоставить полный доступ для владельца файла и убрать все разрешения для группы и всех остальных:
chmod 700 ФАЙЛ
Предоставить полный доступ для владельца файла, группе предоставить право чтения и выполнения, и убрать все разрешения для остальных:
chmod 750 ФАЙЛ
Предоставить полный доступ для владельца файла, группе и всем остальным предоставить право чтения и выполнения:
chmod 755 ФАЙЛ
Добавить разрешение на выполнение для владельца, группы и всех остальных:
chmod +x ФАЙЛ
Добавить разрешение на запись для владельца, группы и всех остальных:
chmod +w ФАЙЛ
Удалить разрешение на запись для владельца, группы и всех остальных:
chmod -w ФАЙЛ
Установить для владельца разрешения записи, чтения и выполнения, а для группы и остальных установить разрешения чтения и выполнения:
chmod u=wrx,go=rx ФАЙЛ
Условные обозначения прав доступа и пользователей в chmod
Чтобы изменить режим (права доступа) файла или каталога, используется команда chmod. Имейте в виду, что только владелец файла или суперпользователь может изменить режим файла или каталога. chmod поддерживает два различных способа задания изменений режима: представление в восьмеричных числах или символьное представление. Сначала мы рассмотрим представление восьмеричных чисел.
Каждую восьмеричную цифру можно представить как три двоичные цифры. Три цифры соответствуют трём параметрам режима доступа: чтение, запись, выполнение. Поэтому права доступа можно представить в виде трёх двоичных цифр, которые можно записать как одну восьмеричную цифру.
Следующая таблица поможет вам понять, что имеется ввиду.
Восьмеричное число | Двоичное число | Файловый режим |
---|---|---|
0 | 000 | — |
1 | 001 | —x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r— |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
Используя три восьмеричных цифры, мы можем установить режим файла для владельца, группы владельцев и всех остальных:
> foo.txt ls -l foo.txt -rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt chmod 600 foo.txt ls -l foo.txt -rw------- 1 me me 0 2008-03-06 14:52 foo.txt
Передав аргумент «600», мы смогли установить разрешения владельца на чтение и запись, удалив при этом все разрешения группы владельца и всех остальных. Хотя запоминание восьмеричного бинарного отображения может показаться неудобным, вам обычно нужно использовать только несколько часто используемых: 7 (rwx), 6 (rw-), 5 (r-x), 4 (r—) и 0 (—).
Либо можно запомнить значение одиночных прав доступа и складывать их значения для получения любых комбинаций: 4 (r—), 2 (-w-), 1 (—x). После того, как вы их запомнили, можно получить любую комбинацию, для прав чтения и записи это 6 (4+2) (rw-), для прав записи и выполнения это 3 (2+1) (-wx), для прав чтения и выполнения это 5 (4+1) (r-x)
chmod также поддерживает символическую запись для указания режимов файлов. Символическая запись делится на три части: на кого повлияет изменение, какая операция будет выполнена и какое разрешение будет установлено. Чтобы указать, на кого это влияет, комбинация символов «u», «g», «o» и «a» используется следующим образом:
Символ | Значение |
---|---|
u |
Сокращение от «пользователь», но означает владельца файла или каталога. |
g |
Группа владельцев. |
o |
Сокращение от «других», но означает все остальные. |
a |
Сокращено от «все». Сочетание «u», «g» и «o». |
Если символ не указан, будет принято «все». Операция может быть «+», указывающим, что разрешение должно быть добавлено, «—», указывающим, что разрешение должно быть удалено, или «=», указывающим, что должны применяться только указанные разрешения, и что все остальные должны быть удалены.
Права доступа указываются символами «r», «w» и «x». Вот несколько примеров символической записи:
Обозначение | Значение |
---|---|
u+x | Добавить разрешение на выполнение для владельца. |
u-x | Удалить разрешение на выполнение от владельца. |
+x | Добавить разрешение на выполнение для владельца, группы и всех остальных. Эквивалент a+x. |
o-rw | Удалить права на чтение и запись у любого пользователя, кроме владельца и группы владельцев. |
go=rw | Установить для группы владельцев и всех, кроме владельца, права на чтение и запись. Если владелец группы или все остальные ранее имели разрешения на выполнение, эти разрешения удаляются. |
u+x,go=rx | Добавить разрешение на выполнение для владельца и установить разрешения на чтение и выполнение для группы и других пользователей. Несколько записей могут быть разделены запятыми. |
Некоторые люди предпочитают использовать восьмеричные обозначения, некоторые люди любят символические. Символьная нотация даёт преимущество, заключающееся в том, что вы можете установить один атрибут, не мешая другим.
chown для смены владельца или группы, которой принадлежит файл или директория
Команда chown используется для изменения владельца и группы владельцев файла или директории. Для использования этой команды требуются привилегии суперпользователя.
chown может поменять владельца файла, либо группа владельцев, либо оба этих значения.
Имеется несколько вариантов синтаксиса chown:
- Поменять владельца файла, группа останется неизменной:
chown ВЛАДЕЛЕЦ ФАЙЛ
- Поменять владельца и группу файла на указанные:
chown ВЛАДЕЛЕЦ:ГРУППА ФАЙЛ
- Поменять владельца на указанного, и также меняет группу на главную группу ВЛАДЕЛЬЦА:
chown ВЛАДЕЛЕЦ: ФАЙЛ
- Поменять только группу файла, владелец останется неизменным:
chown :ГРУППА ФАЙЛ
Примеры:
Аргумент | Результат |
---|---|
bob | Меняет владельца файла с текущего на пользователя bob. |
bob:users | Меняет владельца файла с текущего владельца на пользователя bob и меняет группу владельцев на группу users. |
:admins | Меняет группу владельцев на группу admins. Владелец файла не меняется. |
bob: | Меняет владельца файла с текущего на владельца с именем пользователя bob и меняет группу владельцев на группу, с которой совершил вход пользователь bob — обычно это основная группа пользователя. |
Продолжение: «Азы работы в командной строке Linux (часть 7)».
Связанные статьи:
- Всё о монтировании: от системного администрирования до IT криминалистики (66%)
- Азы работы в командной строке Linux (часть 1) (52%)
- Азы работы в командной строке Linux (часть 2) (52%)
- Азы работы в командной строке Linux (часть 3) (52%)
- Регулярные выражения и команда grep (52%)
- VNC в Windows и Linux: настройка и аудит безопасности (RANDOM - 50%)