Работа с содержимым файлов. Правила разграничения доступа в Linux
При работе с Linux немаловажную роль играет умение чтения файлов, получение информации об операционной системе, а также разграничение прав доступа
Команды и аргументы
В Linux используется механизм раскрытия команд командной оболочки (shell expansion). Понимание принципа работы механизма раскрытия команд командной оболочки является важным ввиду того, что многие команды в вашей системе Linux подвергаются обработке и с высокой вероятностью последующей модификации средствами командной оболочки перед исполнением.
Интерфейс командной строки системы или командная оболочка, используемая в большинстве систем Linux, носит имя bash, которое расшифровывается как Bourne again shell (название "Born again shell" - "возрожденная командная оболочка" было изменено с целью упоминания автора оригинальной командной оболочки sh Стивена Борна).
Одной из важнейших возможностей командной оболочки является возможность обработки строк команд. При вводе команды после приглашения командной оболочки и нажатии клавиши Enter командная оболочка приступает к обработке строки команды, разделяя ее на аргументы. При обработке строки команды командная оболочка может внести множество изменений в переданные вами аргументы. Данный процесс называется раскрытием команд командной оболочки. После того, как командная оболочка заканчивает обработку и модификацию переданной строки команды, будет осуществляться непосредственное исполнение результирующей команды.
- Команда echo является достаточно простой командой: она всего лишь осуществляет вывод переданных ей данных.
paul@laika:~$ echo Burtonville
Burtonville
paul@laika:~$ echo Smurfs are blue
Smurfs are blue
- Части строки команды, которые разделены с помощью одного или нескольких последовательно расположенных символов пробелов (или табуляции), рассматриваются как отдельные аргументы, причем все пробелы удаляются. Первым аргументом является сама команда, которая должна быть исполнена, остальные аргументы передаются этой команде. Фактически командная оболочка производит разделение вашей строки команды на один или несколько аргументов.
[paul@RHELv4u3 ~]$ echo Hello World
Hello World
[paul@RHELv4u3 ~]$ echo Hello World
Hello World
[paul@RHELv4u3 ~]$ echo Hello World
Hello World
- Можно предотвратить удаление пробелов из строки команды, поместив ее в одинарные кавычки. Содержимое экранированной таким образом строки рассматривается как единый аргумент. Аналогично и с двойными кавычками
[paul@RHEL4b ~]$ echo 'Строка с одинарными кавычками'
Строка с одинарными кавычками
[paul@RHEL4b ~]$
- Знак решетки (#). Все написанное после символа '#' игнорируется командной оболочкой. Это обстоятельство оказывается полезным при возникновении необходимости в написании комментариев в сценариях командной оболочки, причем комментарии не будут влиять на процессы раскрытия и исполнения команд.
paul@debian4:~$ mkdir test # создаем директорию
paul@debian4:~$ cd test # переходим в эту директорию
paul@debian4:~/test$ ls # пуста ли она ?
paul@debian4:~/test$
Команды для работы с файлами и окружением
Для того, чтобы быстро и эффективно искать и выводить файлы в терминале помогут следующие команды
Команды для работы с файлами
- cat - печатает содержимое файла, переданного в параметре, в стандартный вывод. Если передать несколько файлов, команда склеит их. Также можно перенаправить вывод в ещё один файл с помощью символа '>'. Если нужно вывести только определенное количество строк, используйте опцию -n (Number).
- find - поиск в файловой системе, файлах и папках.
- more / less - это две команды для просмотра длинных текстов, которые не помещаются на одном экране. Если ваш терминал не поддерживает прокрутки, вы можете сделать это с помощью команды less, которая поддерживает больше опций.
- Утилита head - для вывода первых n строк файла
paul@laika:~$ head -4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
- Утилита tail - может использоваться для вывода последних n строк файла.
$ tail -3 count.txt
шесть
семь
восемь
- Утилита cat - можно использовать для вывода содержимого файла на экран. В том случае, если данные из файла не умещаются на экране, будет осуществлена прокрутка до конца файла.
paul@laika:~$ cat /etc/resolv.conf
nameserver 194.7.1.4
paul@laika:~$
Полезные утилиты
- Утилита date может использоваться для вывода информации о дате, времени, часовом поясе, а также дополнительной информации. Форматирование строки с информацией о дате может быть изменено в соответствии с вашими предпочтениями.
paul@rhel55 ~$ date
Sat Apr 17 12:44:30 CEST 2010
- Утилита cal выводит календарь для текущего месяца, в котором выделен текущий день. Вы также можете выбрать любой месяц из прошлого или будущего.
Апрель 2010
Пн Вт Ср Чт Пт Сб Вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
- Утилита sleep иногда используется в сценариях для перехода в режим ожидания на заданный промежуток времени в секундах. В данном примере показана методика реализации пятисекундного периода ожидания с использованием утилиты sleep.
paul@rhel55 ~$ sleep 5
paul@rhel55 ~$
- Утилита grep - Вывод строк, совпадающих с шаблоном У утилиты grep. как и у любой другой утилиты в Linux, есть параметры. Иногда оказывается проще скомбинировать простое регулярное выражение с параметрами утилиты grep, нежели создать более сложное регулярное выражение.
grep -i
grep -v
grep -w
grep -A5
grep -B5
grep -C5
paul@rhel65:~$ cat names
Tania
Laura
Valentina
paul@rhel65:~$ grep u names # При поиске отдельного символа будут выводиться
Laura # только те строки, которые содержат заданный
paul@rhel65:~$ grep i names # символ. Если заданный символ встречается в
Tania # строке, утилита grep выведет эту строку.
Valentina
paul@rhel65:~$ grep ia names # Аналогично и с объединеним символов
Tania
paul@rhel65:~$ grep in names
Valentina
paul@rhel65:~$ grep a$ names # В данном примере показана методика
Tania # использования символа доллара $ для поиска
Laura # совпадения в конце строки
Valentina
paul@rhel65:~$ grep ^Val names # Символ вставки (^) позволяет осуществлять
Valentina # поиск совпадения в начале строки
Команды окружения пользователя
- su / sudo su и sudo - это два способа выполнить одну и ту же задачу: запустить программу от имени "root". В зависимости от дистрибутива используется su или sudo. Разница в том, что su переключает на пользователя "root", а sudo только выполняет команду от его имени. Поэтому использование sudo будет наиболее безопасным вариантом работы.
- uname - выводит основную информацию о системе. Если задать параметр -a (All), то можно получить информацию о ядре, имени хоста и узнать архитектуру процессора.
- uptime - сообщает время работы системы.
- users - информация о том, кто вошел в систему
- who - выводит только имя пользователя, название консоли, время и дату входа и IPадрес.
Пользователи и группы
Linux является многопользовательской системой. Несколько пользователей могут работать с ней одновременно. Один пользователь может быть зарегистрирован в системе локально, другой – по сети, например через SSH. Среди учетных записей нужно выделить пользователя "root" (для использования этой учетной записи необходимо ввести команду sudo su в Debian). Он обладает максимальными правами в системе, поэтому при работе следует соблюдать осторожность. При работе с использованием обычных пользовательских учетных записей (без прав "root”) максимальный вред может быть нанесен только файлам самих пользователей. Системные файлы останутся неизменными, т.к. система не позволит с ними ничего сделать. Для более эффективного управления пользователей объединяют в группы. По умолчанию один пользователь не имеет права доступа к домашнему каталогу другого пользователя, т.к. они находятся в разных группах. При объединении их в одну группу такая возможность появляется.
Разграничение прав доступа
У каждого объекта (файла) есть уникальное имя, по которому к нему можно обращаться, и конечный набор операций, которые процессы могут выполнять в отношении этого объекта. Файлу свойственны операции Read, Write и eXecute.
Также существует механизм управления доступом определенного процесса к этим файлам.
Права доступа это разрешение на выполнение той или иной операции (чтение, записи, исполнения).
Когда пользователь входит в систему, его оболочка получает UID и GID (UID – идентификатор пользователя, GID - идентификатор группы), которые содержатся в его записи в файле паролей, и они наследуются всеми его дочерними процессами. Представляя любую комбинацию (UID, GID), можно составить полный список всех объектов (файлов, включая устройства ввода-вывода, которые представлены в виде специальных файлов и т.д.), к которым процесс может обратиться с указанием возможного типа доступа (чтение, запись, исполнение).
Два процесса с одинаковой комбинацией (UID, GID) будут иметь абсолютно одинаковый доступ к одинаковому набору объектов. Процессы с различающимися значениями (UID, GID) будут иметь доступ к разным наборам файлов, хотя, может быть, и со значительным перекрытием этих наборов.
SUID (Set User ID) Атрибут исполняемого файла, позволяющий запустить его с правами владельца. В операционных системах Linux приложение запускается с правами пользователя, запустившего указанное приложение. Это обеспечивает дополнительную безопасность т.к. процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю root. Если на исполняемый файл установлен бит suid, то при выполнении эта программа автоматически меняет «эффективный userID» на идентификатор того пользователя, который является владельцем этого файла. То есть, не зависимо от того - кто запускает эту программу, она при выполнении имеет права хозяина этого файла.
SGID (Set Group ID) Аналогичен SUID, но относиться к группе. При этом, если для каталога установлен бит SGID, то создаваемые в нем объекты будут получать группу владельца каталога, а не пользователя.
Практические примеры
Узнать права на файл/директорию:
sit@ubuntu:~$ ls -l /bin/ls
-rwxr-xr-x 1 root root 129280 Feb 18 2016 /bin/ls
Права доступа состоят из трех троек символов. Первая тройка представляет права владельца файла, вторая представляет права группы файла и третья права всех остальных пользователей.
В нашем случае это :
- «rwx» - Права владельца файла
- «r-x» - Права группы файла
- «r-x» - Права всех остальных на файл.
Символ «r» означает, что чтение (просмотр данных содержащихся в файле) разрешено, «w» означает запись (изменение, а также удаление данных) разрешено и «x» означает исполнение (запуск программы разрешен).
Таким образом, если в целом посмотреть на права мы увидим, что кому угодно разрешено читать содержимое и исполнять этот файл, но только владельцу (root) разрешено как либо модифицировать этот файл. Иными словами, нормальным пользователям разрешено копировать содержимое этого файла, то только root может изменять или удалять его.
Определение текущего пользователя и групп в которых он состоит Перед тем, как изменять владельца или группу которой принадлежит файл, необходимо уметь определять текущего пользователя и группу к которой он принадлежит. Чтобы узнать под каким пользователем вы работаете, наберите whoami:
sit@ubuntu:~$ whoami
sit
Для определения в каких группах состоит пользователь sit, необходимо воспользоваться командой groups:
sit@ubuntu:~$ groups
sit adm cdrom sudo dip plugdev lxd lpadmin sambashare
Из этого примера видно, что пользователь sit состоит в группах sit, adm, cdrom, sudo, dip, plugdev, lxd, lpadmin, sambashare. Если вы хотите посмотреть, в каких группах состоит другой пользователь, то передайте его имя в качестве аргумента.
sit@ubuntu:~$ groups root
root : root
Изменение пользователя и группы владельца Чтобы изменить владельца или группу файла (или другого объекта) используется команды chown или chgrp соответственно. Сначала нужно передать имя группы или владельца, а потом список файлов.
chown sit /home/sit/itmo.txt
chgrp sit /home/sit/itmo.txt
Можно также изменять пользователя и группу одновременно используя команду chown в другой форме:
chown sit:sit /home/sit/itmo.txt
Внимание: Вы не можете использовать команду chown без прав суперпользователя, но chgrp может быть использована всеми, чтобы изменить группу-владельца файла на ту группу, к которой они принадлежат.
Знакомство с chmod chown и chgrp используются для изменения владельца и группы объекта файловой системы, но кроме них существует и другая программа, называемая chmod, которая используется для изменения прав доступа на чтение, запись и исполнение, которые мы видим в выводе команды ls -l. Команда chmod использует два и более аргументов: метод, описывающий как именно необходимо изменить права доступа с последующим именем файла или списком файлов, к которым необходимо применить эти изменения:
chmod +x /home/sit/itmo.sh
В примере выше в качестве метода указано +x. Как можно догадаться, метод +x указывает chmod, что файл необходимо сделать исполняемым для пользователя, группы и для всех остальных. Если мы решим отнять все права на исполнение файла, то сделаем вот так:
chmod +x /home/sit/itmo.sh
Разделение между пользователем, группой и всеми остальными Часто бывает удобно изменить только один или два набора прав доступа за раз. Чтобы сделать это, просто необходимо использовать специальный символ для обозначения набора прав доступа, который необходимо изменить, со знаком «+»» или «—» перед ним. Символ «u» для пользователя, «g» для группы и «o» для остальных пользователей.
chmod go-w /home/sit/itmo.sh
Данный пример удаляет право на запись для группы и всех остальных пользователей, но оставляет права владельца нетронутыми.
Числовые режимы Существует еще один достаточно распространенный способ указания прав: использование четырехзначных восьмеричных чисел. Этот синтаксис, называется числовым синтаксисом прав доступа, где каждая цифра представляет тройку разрешений. Например, в 0777, 777 устанавливают флаги для владельца, группы, и остальных пользователей. Ниже таблица показывающая как транслируются права доступа на числовые значения.
| Режим | Число |
|---|---|
| rwx | 7 |
| rw- | 6 |
| r-x | 5 |
| r-- | 4 |
| -wx | 3 |
| -w- | 2 |
| --x | 1 |
| --- | 0 |
umask Когда процесс создает новый файл, он указывает, какие права доступа нужно задать для данного файла. Зачастую запрашиваются права 0666 (чтение и запись всеми), что дает больше разрешений, чем необходимо в большинстве случаев. К счастью, каждый раз, когда в Linux создается новый файл, система обращается к параметру, называемому umask. Система использует значение umask чтобы понизить изначально задаваемые разрешения на что-то более разумное и безопасное. Вы можете просмотреть текущие настройки umask набрав umask в командной строке:
sit@ubuntu:~$ umask
0002
В Linux-системах значением по умолчанию для umask является 0022, что позволяет другим читать ваши новые файлы (если они могут до них добраться), но не изменять их. Чтобы автоматически обеспечивать больший уровень защищенности для создаваемых файлов, можно изменить настройки umask:
sit@ubuntu:~$ umask 0077
Такое значение umask приведет к тому, что группа и прочие не будут иметь совершенно никаких прав доступа для всех, вновь созданных файлов.
В отличие от «обычного» назначения прав доступа к файлу, umask задает какие права доступа должны быть отключены. Снова посмотрим на таблицу соответствия значений чисел и методов:
| Режим | Число |
|---|---|
| rwx | 7 |
| rw- | 6 |
| r-x | 5 |
| r-- | 4 |
| -wx | 3 |
| -w- | 2 |
| --x | 1 |
| --- | 0 |
Воспользовавшись этой таблицей мы видим, что последние три знака в 0077 обозначают —rwxrwx. umask показывает системе, какие права доступа отключить. Совместив первое и второе становится видно, что все права для группы и остальных пользователей будут отключены, в то время как права владельца останутся нетронутыми.
Изменение suid и sgid Способ установки и удаления битов suid и sgid чрезвычайно прост. Чтобы задать бит suid:
chmod u+s /home/sit/itmo.sh
Чтобы задать бит sgid:
chmod g+s /home/sit/itmo/
Определение первого знака прав доступа Он используется для задания битов sticky, suid и sgid совместно с правами доступа:
| suid | sgid | sticky | режим |
|---|---|---|---|
| on | on | on | 7 |
| on | on | off | 6 |
| on | off | on | 5 |
| on | off | off | 4 |
| off | on | on | 3 |
| off | on | off | 2 |
| off | off | on | 1 |
| off | off | off | 0 |
Ниже приведен пример того, как использовать четырехзначный режим для установки прав доступа на директорию.
sit@ubuntu:~$ chmod 4775 /home/sit/itmo
sit@ubuntu:~$ ls -l /home/sit/itmo
-rwsrwxr-x 1 sit sit 0 Sep 9 12:42 /home/sit/itmo
Консольные команды:
- id <печать идентификатора пользователя>
- chgrp <изменить группу файла>
- chown <изменить владельца и группу файлов>
- chmod <изменить права доступа к файлу>
- usermod <изменение параметров учетной записи пользователя>
- useradd <создание нового пользователя>
- userdel <удаление пользователя>
- whoami <определение текущего пользователя>
- umask <определение или установление маски прав доступа для вновь создаваемых файлов>
- sudo su <получение прав суперпользователя>
- groups <определение к каким группам принадлежит пользователь>
Задания к лабораторной работе
- Откройте терминал и попробуйте вывести на экран любые введённые данные с помощью echo
- Выведите на экран различную информацию (дата, время, состояние системы и пр.)
- Создайте в корневой папке пользователя файл и запишите в него информацию с помощью редактора nano (nano <название_файла>, чтобы сохранить CTRL+O, выйти из редактора CTRL+X)
- Выведите информации из этого файла на экран>
- Откройте два терминала. В одном из них получите права суперпользователя используя команду sudo su:
- Изучите как создать пользователя с домашним каталогом с помощью команды useradd из справочной документации man
- Используя useradd создайте пользователя «sit2» c домашним каталогом «sit2».
- Установите пароль для нового пользователя «sit2» с помощью команды passwd sit2
- Выйдите из суперпользователя командой exit
- Войдите под первым терминалом в пользователя «sit», во втором в пользователя «sit2».
- Посмотрите какой идентификатор получил пользователь «sit» и пользователь «sit2» используя команду id
- Посмотрите права доступа на домашний каталог пользователей «sit» и «sit2», используя команду ls
- Создайте файл под пользователем «sit2» с маской 0077 используя umask
- Попробуйте прочитать его содержимое под пользователем «sit» используя команду cat
- Измените права доступа на файл так, чтобы пользователь «sit» мог записывать в файл, но не читать его.
- Запишите текстовую информацию в файл из под пользователя «sit» используя консольный текстовый редактор nano
- Проверьте права на файл, и прочитайте его содержимое из под пользователя «sit2»
- Создайте каталог из под пользователя «sit2»
- Установите права записи для группы пользователей на данный каталог
- Добавьте пользователя «sit» в группу «sit2» с помощью команды usermod
- Проверьте в какие группы входит пользователь «sit»
- Создайте несколько файлов в каталоге, который был создан пользователем «sit2» из под пользователя «sit».
- Ознакомьтесь как удалить пользователя вместе с содержимым его домашнего каталога из справочной документации
- Удалите пользователя «sit2» вместе с его домашним каталогом.