Брандмауэры и специальное программное обеспечение 8 Часть 4

Вид материалаРеферат

Содержание


Точки монтирования
Подобный материал:
1   ...   18   19   20   21   22   23   24   25   ...   101

Заключение


В этой главе был рассмотрено много тем начиная с атрибутов SUID/SGID и их значения для бинарных исполняемых файлов и каталогов и заканчивая некоторыми малоизвестными атрибутами файловой системы ext2. Кроме того, мы рассмотрели атрибут «sticky bit» (липкий бит) и его значение для каталогов. Мы узнали, как управлять этими битами и когда их следует или не следует устанавливать.

После этого мы перешли к рассмотрению команд chattr и lsattr, коснулись темы номеров версий файлов и закончили советом, как с помощью одного из ext2-атрибутов, а именно атрибута «i», уберечь файлы системы от случайного их удаления суперпользователем.

5Структура файловой системы


В данной главе рассматриваются следующие вопросы:

- точки монтирования и файловые системы;

- параметры монтирования, поддерживаемые файловой системой ext2;

- параметры монтирования различных файловых систем.

В этой главе рассматривается структура файловой системы с точки зрения безопасности. Организуя структуру файловой системы, следует принимать во внимание множество соображений, таких как объем дискового пространства и прочее, однако помимо этого не следует забывать также и о безопасности. В этой главе мы рассмотрим некоторые аспекты защиты файловой системы.

Точки монтирования


Точкой монтирования (mount point) называется каталог, расположенный в некотором разделе, через который делается доступным содержимое другого раздела. Тем самым разрозненные физические разделы объединяются в единое логическое дерево каталогов. Иначе говоря, при монтировании раздела его содержимое добавляется к этому дереву в виде новой ветви, берущей начало в точке монтирования. Тип и физическое расположение монтируемого раздела могут быть самыми разными: монтируемый раздел может обладать форматом ext2 и располагаться на локальном жестком диске, однако это может быть также раздел NFS (Network File System), расположенный на удаленном компьютере, доступ к которому осуществляется через сеть. Чтобы выполнить монтирование, необходимо, чтобы монтируемый раздел был доступен (если связь с удаленным узлом отсутствует, раздел NFS смонтировать не удастся) и чтобы его формат поддерживался операционной системой Linux.

На момент написания этой книги наиболее часто используемой файловой системой в OpenLinux является система ext2. Это основной стандартный тип файловой системы Linux. Об особенностях этой файловой системы рассказывалась в главах 3 и 4, где, в частности, говорилось, что, в отличие от DOS, в ext2 используются индексные дескрипторы, в которых хранится вся информация о файле. На самом деле в разных операционных системах используются разные типы файловых систем, а в разных файловых системах используются разные подходы к хранению файлов. В настоящее время существует огромное количество разнообразных файловых систем, их даже больше, чем операционных систем. Система Linux позволяет работать с очень многими файловыми системами.

Точка монтирования обязательно должна быть каталогом, однако не требуется, чтобы этот каталог был пустым. На самом деле получить полностью пустой каталог обычными средствами вам не удастся, поскольку любой каталог всегда содержит файлы «.» и «..», но речь здесь не об этом. Монтирование раздела приводит к тому, что содержимое каталога, являющегося точкой монтирования, заменяется содержимым раздела. В результате изначальное содержимое каталога становится недоступным до тех пор, пока монтированный раздел не будет размонтирован. Таким образом, если у кого-то получится смонтировать гибкий диск поверх каталогов /bin или /sbin, то вместо оригинальных файлов будут использоваться файлы с гибкого диска со всеми вытекающими из этого последствиями.

Однако всякий, кто пытался монтировать раздел, не будучи суперпользователем, знает, что любые операции монтирования строго контролируются операционной системой. Информация о том, какие разделы и в какие каталоги дозволено монтировать обычным пользователям, содержится в файле /etc/fstab. Вот как может выглядеть содержимое этого файла:

/dev/hdal / ext2 defaults 1 1

/dev/hda /home ext2 defaults 1 2

/dev/hda4 swap swap defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

/proc /proc proc defaults 0 0

/dev/fdO /mnt/floppy msdos defaults,users,noauto 0 0

/dev/hdc /mnt/cdrom iso9660 ro.user,noauto 0 0

Файл fstab состоит из шести столбцов, разделенных символами пробелов. В первом столбце указывается устройство, обычно дисковое, то есть sd*, fd* или hd*. Одно из возможных исключений показано выше: это устройство devpts, соответствующее псевдотерминалу (pty). Ядро, устанавливаемое при установке системы, скомпилировано с поддержкой 256 таких терминалов, за что отвечают параметры конфигурации ядра CONFIG_UNIX98_PTYS и CONFIG_UNIX98_PTY_COUNT. Во втором столбце указываются точки монтирования, куда будут монтироваться устройства из первого столбца. Если понаблюдать за содержимым каталога /dev/ pts, то можно заметить, что оно меняется в зависимости от запущенных программ. Файлы из этого каталога соответствуют задействованным на данный момент псевдотерминалам. Открывают их, например, такие программы, как telnet или xterm. Устройства pty не используются виртуальными консолями, вместо этого виртуальные консоли используют tty.

Для псевдотерминалов приняты специальные меры безопасности: обратите внимание на режим 620 в четвертом столбце, означающий права на чтение-запись для владельца, на запись для группы и отсутствие прав для остальных пользователей. Теперь посмотрим на содержимое /dev/pts:

drwxr-xr-x 2 root root 0 Sep 13 07:06 .

drwxr-xr-x 4 root root 11264 Sep 13 08:52 ..

crw--w---- 1 david tty 136, 0 Sep 13 09:18 0

cpw--w---- 1 david tty 136, 1 Sep 13 09:11 1

crw------- 1 david tty 136. 2 Sep 13 09:13 2

Как видите, владельцем любого псевдотерминала является открывший его пользователь, кроме того, все они принадлежат группе tty. Владелец имеет право на чтение-запись во все открытые им псевдотерминалы, группа же имеет право только на запись и только в отношении устройств pty0 и pty1. Устройство pty2 доступно только для чтения. Теперь посмотрим на режимы команд write и wall:

-rwxr-sr-x I root tty 8356 Jul 27 20:27 /usr/bin/write

-rwxr-sr-x 1 root tty 6748 Jul 27 19:22 /usr/bin/wall

Для этих команд установлен атрибут SGID и потому они выполняются от имени группы tty — той самой группы, которая обладает всеми псевдотерминалами. Таким образом, при помощи этих команд можно будет вывести сообщение на первые два псевдотерминала, но не на последний. Важно, чтобы только владелец имел право на чтение псевдотерминалов, иначе появляется возможность «прослушивания» их с целью перехвата пароля.

Помните команду mesg? Если выполнить ее на всех псевдотерминалах, открытых пользователем david, то для двух из них будут выведено у, а для одного — п. Это означает, что на первые два псевдотерминала сообщения выводиться будут, а на последний — нет. Для включения возможности вывода сообщений на данный псевдотерминал нужно выполнить на нем команду mesg у. При этом группе tty будет предоставлено разрешение на запись в этот псевдотерминал. И наоборот, выполнение команды mesg n отнимает это право, тем самым отключая возможность вывода сообщений на данный псевдотерминал.

Продолжим рассмотрение файлов из /dev/pts. За именем группы, которую имеет файл терминала, следуют старший (major) и младший (minor) номера устройства. В данном случае старший номер для всех файлов одинаков и равен 136, а младший принимает значения 0, 1 и 2. Дата последнего доступа к файлу, следующая за ними, в данном контексте означает дату, когда пользователь последний раз записывал данные в псевдотерминал. Соответственно, после каждого вывода команды через псевдотерминал эта дата меняется.


ПРИМЕЧАНИЕ

Содержимое /dev/pts периодически следует проверять. Команда ps aux | grep pts позволит вам узнать, какие процессы связаны с открытыми на данный момент псевдотерминалами, а команда w или who — кем были открыты эти псевдотерминалы. Подозрительными можно считать псевдотерминалы со старой датой последнего доступа, псевдотерминалы, с которыми не связан ни один активный процесс, и псевдотерминалы, используемые процессами, о которых вы не имеете ни малейшего представления. Возникновение любой из этих ситуаций может означать, что защита вашей системы была нарушена.

В третьем столбце файла /etc/fstab указывается тип файловой системы, монтируемой по умолчанию. Это может быть любой тип из числа тех, что известны ядру, например, nfs, vfat или одно из значений swap, devpts или ignore.

Четвертый столбец содержит параметры. Имеются в виду параметры файла fstab, а не параметры командой строки. Параметров командой строки чуть больше и они несколько отличаются от параметров, указываемых после ключа -о. Например, параметр «только для чтения» в fstab обозначается как rо, в командной же строке это свойство назначается при помощи ключа -о rо или просто -r. В этом тексте рассматриваются только те параметры командной строки, для которых существует эквивалент в файле fstab.

Любой пользователь с нулевым идентификатором UID может монтировать любую файловую систему в любой каталог. Как упоминалось ранее, монтируемая файловая система замещает прежнее содержимое каталога, что в некоторых случаях может оказаться полезным. Например, представьте, что при установке пакета обслуживающая этот пакет библиотека была помещена в каталог /usr/lib. Однако в этом случае данный пакет можно использовать только тогда, когда раздел /usr монтирован в каталоге /usr. Однако в процессе начальной загрузки монтирование раздела /usr происходит не сразу — система вначале выполняет множество инициализационных процедур и лишь после этого осуществляет монтирование дополнительных разделов. Таким образом, во время начальной загрузки ОС до того момента, пока не будет смонтирован раздел /usr, ни одна программа не сможет воспользоваться рассматриваемым пакетом. Проблему можно решить двумя способами. Во-первых, можно переместить библиотеку в другой каталог. Во-вторых, можно создать в корневом разделе каталог /usr/lib и поместить в него копию необходимой библиотеки. Оба решения вполне приемлемы. Однако для выполнения стандартной процедуры обновления пакета с использованием RPM будет лучше, если все содержащиеся в этом пакете файлы останутся на предназначенных им местах, поэтому правильней будет пойти по второму пути. К сожалению, дисковое пространство, занимаемое библиотекой на корневом разделе, после монтирования раздела /usr будет пропадать зря, однако файлы библиотек, как правило, не занимают много места (несколько десятков килобайтов по сегодняшним меркам совсем немного), поэтому с этим неудобством вполне можно смириться.

С точки зрения безопасности, монтировать файловые системы, не упомянутые в файле /etc/fstab, может только суперпользователь. Обычному же пользователю дозволено монтировать только их, да и то не все, а лишь те системы, для которых указан параметр user или users.

Здесь будут обсуждаться лишь те параметры монтирования, которые имеют отношение к безопасности. Итак, суперпользователь может монтировать все что угодно. На то он и суперпользователь. Однако остальные пользователи являются посторонними для системы, и потому весьма опасно давать им такую возможность. Стало быть, чтобы грамотно ограничивать возможности пользователей по монтированию файловых систем, нужно знать, как именно работает механизм монтирования.


ВНИМАНИЕ

Если вы предоставляете пользователем возможность монтирования файловых систем, вы подвергаете вашу систему определенному риску. Следует ясно представлять себе, с чем связан этот риск, и исходя из этого использовать соответствующие параметры в файле /etc/fstab.

В рассматриваемом нами случае пользователям предоставлена возможность монтирования компакт-диска и гибкого диска. Вернитесь еще раз к примеру файла /etc/fstab, который был приведен чуть ранее в этой главе, и посмотрите на строчки, соответствующие этим двум устройствам. Обратите внимание на то, что в одном случае использован параметр user, а в другом — users. Монтирование файловых систем осуществляется командой mount. Будучи вызвана без параметров, эта команда читает файл mtab и выводит список смонтированных в системе разделов. Вот как может выглядеть ее вывод:

/dev/hdal on / type ext2 (rw)

/dev/hda3 on /home type ext2 (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/proc on /proc type proc (rw)

/dev/hdc on /mnt/cdrom type iso9660 (ro,noexec,nosuid,nodev,user=david)

/dev/fdO on /mnt/floppy type msdos (rw.noexec.nosuid.nodev)

А вот что находилось в файле /etc/mtab на момент этого вывода:

/dev/hdal / ext2 rw 0 0

/dev/hda3 /home ext2 rw 0 0

devpts /dev/pts devpts rw,g1d=5,mode=620 0 0

/proc /proc proc rw 0 0

/dev/hdc /mnt/cdrom iso9660 ro,noexec,nosuid,nodev,user=david 0 0

/dev/fdO /mnt/floppy msdos rw.noexec.nosuid.nodev 0 0


ПРИМЕЧАНИЕ

Смонтированные файловые системы перечислены также и в файле /proc/mounts, содержимое которого в точности совпадает с содержимым /etc/mtab. Однако было бы неправильно делать /etc/mtab ссылкой на /proc/mounts, поскольку это может привести к проблемам с устройствами loopback.

Эти два листинга несколько различаются. В файле mtab перечисляются все смонтированные файловые системы (на самом деле те, при монтировании которых не был указан ключ -n), включая соответствующие столбцы из /etc/fstab, a кроме того, в нем присутствуют два столбца, которых нет в выводе команды mount Помимо этого, в выводе команды mount параметры берутся в скобки, поскольку так их легче заметить.


ПРИМЕЧАНИЕ

Если смонтировать файловую систему с ключом -п, означающим «не помещать запись о монтируемой системе в файл mtab», то ни команда df, ни команда mount не покажут эту файловую систему. Тем не менее, если используется /proc, то сведения об этой файловой системе будут присутствовать в файле /proc/mounts. Ключ -п используется в случае, если файловая система монтируется только для чтения и не предназначена для обычного использования.

В обоих листингах есть записи, соответствующие гибкому диску и компакт-диску. В записи для компакт-диска есть строчка user=david. В записи для гибкого диска такой строчки нет. Различие вызвано тем, что для гибкого диска в файле / etc/fstab используется параметр users, а для компакт-диска — параметр user. Параметр user означает, что монтировать данную файловую систему в данную точку монтирования может любой пользователь, а размонтировать — только тот, кто ранее смонтировал ее. Параметр users означает, что монтировать и размонтировать файловую систему может любой пользователь. В этом примере я намеренно отошел от рекомендуемого использования параметров user и users и переставил их местами. Как видно из листинга, компакт-диск смонтирован в режиме только для чтения (rо), тогда как гибкий диск — в режиме чтения-записи (rw). При таком режиме другой пользователь может подменить чужую дискету своею, дождаться окончания записи на нее, вставить обратно оригинальную дискету и спокойно удалиться с чужими файлами на своей дискете. Поэтому подумайте, стоит ли в вашем случае разрешать пользователям монтировать гибкие диски на запись. Для компакт-диска, смонтированного в режиме только для чтения, такой проблемы не существует, поскольку файлы на него никто записывать не будет. Что касается записываемых компакт-дисков (CD-R), то в большинстве устройств чтения и тем более записи компакт-дисков лоток для диска не выйдет до тех пор, пока диск не будет размонтирован, поэтому с компакт-дисками все гораздо проще.

В файле fstab используются следующие параметры (порядок перечисления значения не имеет):

- async/sync — обмен данными с данной файловой системой осуществляется асинхронно/синхронно;

- atime/noatime — обновлять/не обновлять дату последнего доступа (atime);

- auto/noauto — при использовании параметра -а совместно с командой mount данная файловая система будет/не будет смонтирована;

- dev/nodev — интерпретировать/не интерпретировать символьные или специальные блочные устройства;

- ехес/поехес — разрешить/запретить выполнение бинарных файлов, расположенных в данной файловой системе; •

- suid/nosuid — принимать во внимание/игнорировать атрибуты SUID/SGID для данной файловой системы;

- nouser/user(s) — разрешить/запретить пользователям монтировать данную систему;

- rw/ro — монтировать систему для чтения-записи/только для чтения;

- remount — если возможно, данную файловую систему следует монтировать заново (обычно используется для изменения режима доступа к корневой файловой системе с го (только для чтения) на rw (чтение-запись) и наоборот);

- defaults — использовать параметры по умолчанию, что означает rw, suid, dev, exec, auto, nouser и async

В отношении параметра defaults могут возникнуть некоторые вопросы. Если использован параметр user(s), а значения остальных параметров равны значениям по умолчанию, то есть suid, dev, exec, то что мешает обычному пользователю смонтировать гибкий диск, содержащий исполняемые файлы с атрибутом SUID (это могут быть программные средства для взлома системы)? Все очень просто. При наличии параметра user(s) значения параметров по умолчанию меняются на noexec, nosuid и nodev. Если по некоторым причинам требуется избавить пользователей от необходимости копировать файл с дискеты для его выполнения, можно явно указать параметр exec. Только нужно, чтобы он следовал после параметра defaults. Команда mount обрабатывает параметры слева направо, замещая ранее встреченные значения параметров значениями, указанными далее. Поэтому указание user перед defaults равносильно указанию nouser вслед за user: в итоге используется значение параметра, указанное последним.

Пятый столбец файла /etc/fstab является управляющим столбцом команды dump. Единица в этой позиции предписывает осуществлять резервное копирование данной файловой системы, ноль — не осуществлять. Шестой столбец управляет порядком проверки файловых систем командой fsck. Для корневой файловой системы следует указать 1, для всех остальных — 2, а для тех систем, которые не нужно проверять, — 0 (некоторые файловые системы просто бессмысленное проверять командой fsck, к этой категории относятся фактически все файловые системы, не являющиеся ext2). Пустое значение в этих двух столбцах интерпретируется как ноль, однако заметим, что если шестой столбец не пуст, то и пятый столбец обязан содержать непустое значение.