Безопасность файлов и файловых систем

Обзор

Безопасное удаление файлов

Списки контроля доступа (ACL)

Системные файлы

Обзор

Надежная операционная система нуждается в надежной файловой системе. В случае Linux это файловая система ext2 (EXTended, version 2). Фактически, она аналогична файловым системам всех UNIX-подобных ОС. Она поддерживает права доступа (read, write, execute, sticky bit, suid, sgid и так далее), принадлежность (user, group, other) и другие стандартные функции. Некоторые из недостатков: никакого журналирования и никаких списков контроля доступа (Access Control Lists) здесь нет. По слухам, они появятся в ext3. Из плюсов надо отметить, что Linux имеет превосходный программный RAID, поддерживая уровни 0, 1 и 5 очень хорошо (RAID не связан с защитой, но связан со стабильностью). Имеется превосходный HOWTO по файловым системам в Linux на http://www.penguin.cz/~mhi/fs/Filesystems-HOWTO/Filesystems-HOWTO.html.

Основные утилиты для работы с файлами: “ls”, “chown”, “chmod” и “find”. Впрочем, есть еще много других, в том числе ln (создает связи), stat (выдает сведения о файле). Для создания и управления файловыми системами есть “fdisk” (старый добрый fdisk), “mkfs” (MaKe FileSystem, форматирует разделы) и “fsck” (FileSystem ChecK, исправляет ошибки на дисках). Linux может быть легко поставлена под угрозу, если получен доступ к некоторым файлам, например зашифрованным паролям, чтобы использовать против них подбор паролей по словарю. Это общая цель нападающих, приходящих по сети (плохо написанные CGI-скрипты, кажется, любимый способ). Еще хуже, если пользователь получит доступ на запись к системным файлам. Тут можно ждать чего угодно: от захвата управления до случайного стирания половины системы. Одной из дыр является "tmp races", когда setuid-программа (работает с правами root) создает временный файл, обычно в /tmp, и не проверяет существование ссылок. Хакер может создать жесткую ссылку на данный файл, и когда исходный файл будет стерт, добраться по ссылке до нужного файла, например, файла паролей (замечание переводчика: придумано здорово, надо будет попробовать). Как предотвратить такие нападения?

Просто: правильно настроить систему. Есть два каталога, в которые пользователи должны иметь право записи: /tmp и /home, размещение которых на отдельных разделах позволяет избежать заполнения пользователями критичных файловых систем (переполненная система / приводит к очень плохим последствиям). Переполненная система /home приведет к тому, что никто из пользователей в систему зайти не сможет (кроме root: его каталог /root). Разместите на отдельном разделе /tmp и /home, если пользователям предоставлен shell-доступ к серверу, размещение на отдельном разделе /etc, /var и /usr тоже хорошая идея.

Первичные инструментальные средства для получения информации относительно файлов и файловых систем все относительно простые и легки в использовании. “df” (показывает использование дисков) также покажет использование inode: “df –i” (inodes хранит данные о файлах, их расположение на диске, и Вы можете исчерпать их прежде, чем Вы исчерпаете дисковое пространство, если Вы имеете много маленьких файлов. Это кончается сообщением об ошибке "disk full" когда “df” сообщает, что имеется свободное пространство (“df –i” покажет, что все inodes используются). Это подобно записям о файлах в Windows с vfat, которая реально хранит имена в формате 8.3, используя несколько записей для длинных имен с максимумом в 512 записей на каталог. Утилита “du” сообщит Вам размер относительно каталогов, который является очень полезным для выяснения, какой сколько занимает, и куда же делось все место на диске. Команда “du ” отобразит текущий каталог и все его подкаталоги, к которым Вы имеет доступ. Команда “du /dir/name” отобразит то же самое для заданного каталога. Есть опция “-s” для резюме, которое является полезным для каталогов подобных /usr/src/linux. Чтобы получить информацию относительно файлов, первый инструмент ls (аналог DOS-команды “dir”), “ls” показывает только имена файлов/каталогов, “ls –l ” показывает также размер файлов, их принадлежность, права доступа и еще ряд технических сведений. Команда 'ls -la' также отобразит сведения о каталогах и файлах, имена которых начинаются с точки (“.”), что нормально для файлов настройки (.bash_history, .bash_logout). Утилита “ ls” имеет несколько дюжин параметров для разной сортировки результатов. Подробности можно получить командой “man ls”. Команда “stat ” сообщает всю жизненную статистику относительно данного файла (дата создание, последнее обращение, inode и проччее).

Для управления файлами и каталогами есть утилиты cp, mv, rm (CoPy, MoVe и ReMove), для настройки прав доступа есть chown (задает владельца и группу файла (группа "прочие" значит "прочие", как в Novell или группа 'everyone' в NT), chmod (меняет права доступа к файлу). Основные права: read (чтение), write (заись) и execute (выолнение), дополнительно есть setuid (наследование идентификатора владельца), setguid (наследование группы владельца, бывает нужно для запуска некоторых программ, которые хотят, чтобы их запускал определенный пользователь, обычно root), sticky bit и другие. Используя присоединение пользователей к группам и команды chmod и chown можно имитировать ACL, но гораздо менее гибко, чем рава доступа в Sun/AIX/NT (по слухам, в ext3 появятся полноценные списки доступа). Пожалуйста, будьте особенно осторожны с setuid/setguid-программами, так как любые проблемы в такой программе сильно вырастут по сравнению с обычной!

Очень хороша команда “find”. Она ищет файлы и может фильтровать их на основании прав доступа, владельца, размера, даты, имени и множества других критериев. Вот примеры поиска setuid/guid-программ:

чтобы найти все setuid-программы:

find / -perm +4000

чтобы найти все setgid-программы:

find / -perm +2000

Основой защиты файлов являются права доступа. В Linux файл принадлежит ('owned') пользователю и имеет 3 набора прав доступа для самого пользователя (User), его группы (Group) и все остальных (Other). Вы можете установить кому принадлежит файл (и к какой группе относится) командой:

chown user:group object

здесь object является файлом, каталогом или чем-то еще. Чтобы закрыть выполнение файла кем-либо, надо написать:

chmod x="" object

здесь x принимает значения a|g|u|o (All/User/Group/Other), и устанавливает права доступа в "" (никакого доступа вообще), а object может быть каталогом или файлом. Помните, что root ВСЕГДА может менять права доступа к файлу, и читать/записывать/выполнять его, Linux не обеспечивает защиту root. Также, кто бы ни обладает каталогом, в котором находится объект, он также может менять права доступа к объекту в данном каталоге (даже если сам объект ему и не принадлежит). Так как root владеет каталогом /, он может менять права доступа к любому объекту в файловой системе.

Безопасное удаление файлов

Одна из вещей, которые обычно забывают, в том, что если файл удаляется, то реально-то он никуда не денется, и если его не уничтожить каким-то способом, то восстановить данные из него в принципе возможно. Есть программы, которые переписывают файл при удалении, что делает гарантированно невозможным восстановление его содержимого.

wipe (durakb@crit2.univ-montp2.fr)

wipe надежно удаляет данные, перезаписывая файл многократно разными образцами. Вы можете использовать wipe для файлов или устройств. В первом случае помните, что имя файла и техническая информация о нем удалена не будет, будет уничтожено только его содержимое, после чего файл будет бесполезен для какого-либо восстановления. Скачать wipe можно с http://gsu.linux.org.tr/wipe.

wipe (thomassr@erols.com)

Еще один удалитель для файлов, но он не поддерживает чистку устройств. Доступен на http://users.erols.com/thomassr/zero/download/wipe.

Списки контроля доступа (ACL)

Один главный компонент файловой системы, которого пока нет в Linux, это поддержка Access Control Lists (списков контроля доступа) вместо обычных User, Group и Other. ACL позволяет более гибко управлять доступом, предоставляя права доступа к каждому объекту конкретному пользователю. Например, можно предоставить полный доступ к файлу пользователю “bob ”, доступ на чтение пользователю “mary”, доступ для изменения группе “sales” и закрыть доступ всем остальным. В настоящее время в Linux обычными методами сделать такое нельзя или крайне трудно. Значит, нужна ACL. Сейчас поддержка ACL для Linux есть в виде патча для ядра. Справедливости ради надо отметить, что поддержка ACL реализована в NT (для файловой системы NTFS), и является одним из самых уязвимых мест защиты NT (если применительно к NT вообще корректно говорить о какой-либо защите).

RSBAC

Информация доступна здесь.

Проект Linux trustees (ACL) project

Информация доступна здесь.

Системные файлы

/etc/passwd

Файл паролей, возможно, наиболее критический системный файл в Linux (и большинстве других UNIX'ов). Он хранит сисок пользователей, соответствие их логинов, user ID и group ID. Он также может хранить зашифрованные пароли, но кудабезопасней хранить их отдельно в файле /etc/shadow (затенение паролей). Этот файл ДОЛЖЕН БЫТЬ открыт на чтение всем, иначе даже такая простая команда, как ls правильно работать не сможет. Поле GECOS (иногда пишут GCOS) может хранить реальное имя пользователя и его телефон. В данном файле также хранится информация о домашнем каталоге пользователя (в него он попадает при входе в систему) и его оболочке (shell, например, bash или программе menu), упомянутой в файле /etc/shells. Формат записей такой:

username:encrypted_password:UID:GID:GECOS_field:home_directory:login_shell

Пароли зашифрованы одним способом (обычно crypt, новые дистрибутивы поддерживают MD5, который является знаменательно более сильным). Пароли нельзя восстановить из зашрифованного вида, но можно попробовать шифровать слова из словаря (или просто перебором) и сравнивать результат с зашифрованным паролем. Как только совпал, пароль найден. Само по себе такое не очень плохо, хуже когда пользователи выбирают легко предполагаемые пароли. Самые современные результаты исследований показали, что 25% паролей можно найти за час или около того, и что намного хуже, 4% пользователей, выбирают их собственное имя как пароль. Пустые поля в поле пароля значат отсутствие пароля вообще. Так появляются записи вида “::”, которые критичны для первых четырех полей в записи пользователя (имя, пароль, uid и gid).

/etc/shadow

Файл shadow хранит пары "username:password" и дополнительные сведения о логине, например, время окончания его действия. Он должен быть доступен на чтение и запись только для root.

/etc/groups

Файл groups хранит данные о принадлежности пользователей к группам и опциональные поля, вроде групповых паролей (сейчас обычно хранятся в файле gshadow), данный файл должен быть доступен на чтение всем пользователям для корректной работы системы. Его формат:

groupname:encrypted_password:GID:member1,member2,member3...

Группа может не содержать членов (не используется), одного члена или многих членов, а также опционально иметь пароль доступа (обычно не используется).

/etc/gshadow

Аналогично файлу shadow, данный файл хранит группы и пароли для них. Данный файл должен быть доступен на чтение и запись только для root.

/etc/login.defs

Этот файл (/etc/login.defs) позволяет Вам определять некоторые полезные значения по умолчанию для различных программ типа useradd или окончания времени действия пароля. Он имеет тенденцию немного изменяться в разных дистрибутивах, но обычно хорошо прокомментирован и имеет тенденцию содержать нормальные значения по умолчанию.

/etc/shells

Файл shells хранит список доступных оболочек (shells), если оболочка пользователя в нем не упомянута, зайти в систему он не сможет. Подробности в разделе про telnetd.

/etc/securetty

Данный файл хранит список терминалов с которых может зайти root. Консоли обычно обозначены с /dev/tty1 по /dev/tty6. Последовательные порты (если root может заходить по модему) обозначены обычно начиная с /dev/ttyS0 и выше. Если допускается вход root по сети (плохая идея, пользуйтесь лучше sudo), то добавьте /dev/ttyp1 и выше (если зашли 30 пользователей, а потом попытался зайти root, то он зайдет с /dev/ttyp31). Лучше всего ограничьте доступ root устройством /dev/tty1 и поставьте программу sudo: так оно безопасней.

Back

Security Portal

Written by Kurt Seifried