СЕРГЕЙ ЯРЕМЧУК, фрилансер. Автор более 800 статей и шести книг. С «СА» с первого номера. Интересы: сетевые технологии, защита информации, свободные ОС
Файловые системы пространства пользователя
Сегодня администраторы и пользователи сталкиваются со многими новыми технологиями, на изучение которых требуется время. При этом полученные ранее навыки работы и привычные инструменты могут не пригодиться или показаться неудобными. «Синтетические» файловые системы, работающие в пространстве пользователя, позволяют скрыть разницу в работе конкретных протоколов и применять для всех задач одни и те же инструменты.
Все является файлами – ключевая концепция UNIX-систем. Файлами является даже периферийное оборудование компьютера, разделы жесткого диска. При этом для приложений доступ к файлу устройства или отправка данных другому процессу практически не отличима от доступа к обычному текстовому файлу, что позволяет пользователю применять одни и те же команды для вывода текстового файла на консоль, печати файла, вывода звука через /dev/dsp и пр. Синтетические файловые системы, работающие в пространстве пользователя, реализуют аналогичный подход к самым разнообразным источникам информации. Файлами является все, с чем приходится иметь дело пользователю такой файловой системы – почтовые ящики, веб-страницы и ftp-серверы, защищенные SSH-соединения, архивы и другие локальные данные…
Работа вне ядра:
- Упрощает установку и использование приложений.
- Позволяет минимизировать последствия краха.
- Позволяет использовать для программирования языки, отличные от С.
- Отлаживать такие приложения легче.
- Появляется возможность вынести часть кода во внешние библиотеки.
- Нет необходимости в переписывании кода для новых ядер.
- Исходя из всего перечисленого, появляется возможность создавать инструменты для самых разнообразных задач.
Например, в настоящее время существуют проекты SULF – Stackable User-Level Filesystem (http://pobox.com/~vgough/fuse-csharp.html) и FUSE-J (http://www.cl.cam.ac.uk/~Etdm25/fuse-j). Первый позволяет написать свою файловую систему на C, второй на Java.
Интерфейс спроектирован так, чтобы обеспечить простую, эффективную и прозрачную работу с поддержкой привычной семантики.
Первоначально разработанный для поддержки AVFS (http://www.inf.bme.hu/~mszeredi/avfs), FUSE (http://fuse.sourceforge.net) вскоре стал отдельным проектом и на сегодня имеет приличный список файловых систем, использующих его наработки. Совсем недавно код FUSE включен в дерево ядра -mm Эндрю Мортона (Andrew Morton). К сожалению, второй подобный проект, LUFS – Linux Userland FileSystem (http://lufs.sourceforge.net/lufs) несмотря на надпись на сайте «Actively maintained» обновлялся в последний раз в конце 2003 года, поэтому уже можно говорить о прекращении работ. Принцип работы такой системы ясен из рис. 1.
Рисунок 1. Модуль ядра перехватывает запросы к VFS и создает для пользователя иллюзию работы с обычной файловой системой
Модуль ядра перехватывает запросы к VFS и создает для пользователя иллюзию работы с обычной файловой системой, на которой эмулируется специальное дерево каталогов, отвечающее семантике хранимых в ней данных. Теперь для работы с этими файлами можно применять привычные утилиты, например, для копирования файлов через защищенное ssh-соединение достаточно воспользоваться cp. Модуль ядра и библиотека связываются через дескриптор специального файла /proc/fs/fuse/dev, через который и происходит взаимодействие.
Реализации файловых систем для защиты информации
На сайте проекта FUSE можно найти только небольшую программу – пример, демонстрирующую возможности, основной же интерес представляют собой сторонние разработки, список которых можно найти на http://fuse.sourceforge.net/filesystems.html.
На момент написания статьи список насчитывал 22 проекта, большая часть из которых еще не достигла состояния релиза и стабильная работа не гарантируется в том числе и самими разработчиками, к тому же их не всегда возможно откомпилировать без проблем. Поэтому весь список перечислять не буду, остановлюсь только на некоторых самых интересных.
EncFS – Encrypted Filesystem (http://pobox.com/~vgough/encfs.html) реализует зашифрованную файловую систему. Как и другие подобные файловые системы, основное назначение EncFs – защита персональных данных, резервных копий. Работа отличается от «loopback» систем, работающих в режиме ядра. При этом в EncFs размер файловой системы может динамично изменяться. Некоторые метаданные остаются видимыми, что позволяет программе резервирования определить количество файлов, их размер, приблизительно количество знаков в имени (само имя шифруется) , т.е. узнать изменившиеся файлы. Но програма резервирования не может их расшифровать, таким образом, резервные копии можно сделать без расшифровки.
Работать с такой файловой системой можно как с локального, так и удаленного узла, а также сменных носителей вроде CD-ROM. Проверим ее в работе. Первым делом требуется установить fuse. Здесь ничего сложного.
# tar -xzvf fuse-2.2.1.tar.gz
# cd fuse-2.2.1
# ./configure && make
# make install
# /sbin/modprobe fuse
Проверяем загружен ли соответствующий модуль:
# /sbin/lsmod | grep fuse
Новая файловая система должна быть в списке известных ФС.
# cat /proc/filesystems | grep fuse
Все работает. Для примера работы можно зайти в подкаталог fuse-2.2.1/example/ и запустить тестовую программу.
#./fusexmp /mnt/fuse/ -d
unique: 2, opcode: INIT (26), nodeid: 0, insize: 44
INIT: 5.1
unique: 2, error: 0 (Success), outsize: 24
|
Теперь, глядя на содержимое каталога /mnt/fuse/, можно обнаружить дерево основной файловой системы.
Настала очередь EncfFS. Для работы, кроме архива с самой файловой системой, требуется наличие библиотек OpenSSL и Rlog (http://rlog.sourceforge.net). Устанавливается EncfFS обычным образом, после компиляции будут доступны два исполняемых файла – еncfs и encfsctl. При помощи первой можно создать или примонтировать зашифрованную файловую систему.
# encfs ~/.crypt ~/crypt
Директория "/home/sergej/.crypt" не существует. Создать ее? (y,n) y
Директория "/home/sergej/crypt" не существует. Создать ее? (y,n) y
Создание нового зашифрованного раздела.
Выберите одну из следующих букв:
введите "x" для режима эксперта,
введите "p" для режима максимальной секретности,
любой другая буква для выбора стандартного режима.
?> x
Выбрана ручная конфигурация.
Доступны следующие алгоритма шифрования:
1. blowfish-compat : алгоритм совместим с EncFS 0.2-0.6
-- длина ключа 160 бит
-- размер блока 64 байт
Введите номер соответствующий Вашему выбору: 1
Выбранный алгоритм "blowfish-compat"
Using key size of 160 bits
Using filesystem block size of 64 bytes
Доступны следующие алгоритмы зашифровки:
1. Block : Block encoding, hides file name size somewhat
2. Stream : Шифрование потока, сохраняет имена файлов как только возможно
Введите номер соответствующий Вашему выбору: 2
Выбранный алгоритм "Stream""
Enable filename initialization vector chaining? This makes filename encoding dependent on the complete path,
rather then encoding each path element individually. This is normally desireable, therefor the default is Yes.
Any response that does not begin with "n" will mean Yes: Yes
Enable per-file initialization vectors? This adds about 8 bytes per file to the storage requirements. It should not affect
performance except possibly with applications which rely on block-aligned file io for performance. The default here is Yes.
Any response that does not begin with "n" will mean Yes:
Включить имя файла в IV цепочку заголовков? Эта опция позволит сделать данные файла зависимыми от полного файлового пути.
Если файл переименовать, то нельзя будет его расшифровать. Если включить эту опцию, то жесткие ссылки на файлы не будут
поддерживаться файловой системой. Значение по умолчанию No.
Любой ввод не начинающийся на "y" будет воспринят как No:
Enable block authentication code headers on every block in a file? This adds about 12 bytes per block to the storage requirements
for a file, and significantly affects performance but it also means [almost] any modifications or errors within a block will be caught
and will cause a read error. The default here is No.
Any response that does not begin with "y" will mean No: Yes
Add random bytes to each block header? This adds a performance penalty, but ensures that blocks have different authentication codes.
Note that you can have the same benefits by enabling per-file initialization vectors, which does not come with as great of performance penalty.
Select a number of bytes, from 0 (no random bytes) to 8: 4
Конфигурация завершена. Создана файловая система с следующими свойствами:
Шифр файловой системы: "ssl/blowfish-v0.2", версия 2:0:1
Шифр файла: "nameio/stream", версия 2:1:2
Размер ключа: 160 бит
Размер блока: 64 байт, включая 12 байт MAC заголовок
Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными.
Файловые имена зашифрованы с использованием IV цепочек.
Введите пароль для доступа к файловой системе. Запомните пароль, так как в случае утери его, будет невозможно восстановить данные.
Тем не менее этот пароль можно изменить с помощью утилиты encfsctl.
Новый пароль EncFS:
Повторите пароль EncFS:
|
Как видите, при создании новой файловой системы доступно два предустановленных режима standard и paranoia (шифр AES, размер ключа 256, размер блока – 512), а также режим expert, при использовании которого можно выбрать все параметры самому (половина вопросов при этом будет задана по-русски).
Теперь можно проверить работу вновь созданной ФС:
# cd crypt/
# echo «Это зашифрованное сообщение» > testfile
# cat testfile
Это зашифрованное сообщение
Размонтируем и смотрим, что в каталоге:
# fusermount -u ~/crypt
# ls ./.crypt/
Также невозможно прочитать содержимое файлов. Кроме того, можно задать дополнительные параметры, которые позволяют автоматически размонтировать файловую систему в случае неактивности в течение какого-то промежутка времени, организовать доступ нескольким пользователям и некоторые другие. При помощи утилиты encfsctl можно проверить параметры файловой системы или сменить пароль. Например:
# encfsctl ./.crypt
Версия 5; создана EncFS 1.2.1 (ревизия 20040813)
Шифр файловой системы: "ssl/blowfish-v0.2", версия 2:0:1
Шифр файла: "nameio/stream", версия 2:1:2
Размер ключа: 160 бит
Размер блока: 64 байт, включая 12 байт MAC заголовок
Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными.
Файловые имена зашифрованы с использованием IV цепочек.
|
Для использования в военных, правительственных и других организациях, в которых уделяется особое внимание режиму секретности, разработана файловая система Phonebook (http://www.freenet.org.nz/phonebook), использующая технологию, получившую название «Deniable Encryption technology».
Её разработчики пытаются учесть «человеческий фактор», являющейся основной причиной многих проблем, возникающих при защите информации. Суть этой технологии заключается в использовании нескольких слоев кодирования, каждый со своим паролем, поэтому чтобы получить доступ, необходимо знать уже два параметра: название слоя и пароль. В случае ошибки набора будет создан новый слой, никакого сообщения об ошибке выведено не будет. При этом есть возможность создать несколько слоев с одним именем, но разными паролями, в случае взлома будет раскрыта информация только в одном из них.
Все файлы шифруются индивидуально (256-Blowfish, CFB-режим, плюс SHA1 хеш), в случайном порядке изменяется и время доступа к файлу. Файлы могут быть записаны на CD-ROM или доступ к ним можно получить через сеть (например, NFS).
SSH через файловый менеджер
Следующая интересная файловая система shfs – (Secure) SHell FileSystem (http://shfs.sourceforge.net), использующая FUSE, позволяет монтировать удаленные системы, используя ssh-соединения и работать с ними как с обычной локальной системой. После стандартной установки пользователю будут доступны две утилиты shfsmount и shfsumount. В общем случае строка запуска выглядит так:
shfsmount[user@]host:[dir]] mountpoint [options]
Далее:
# mount -t shfs sergej@somewhere.com: /mnt/local
The authenticity of host " somewhere.com (192.168.0.20)" can"t be established.
RSA key fingerprint is 1a:49:b0:db:df:19:69:af:45:16:da:4b:3a:36:ab:fe.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added " somewhere.com,192.168.0.20" (RSA) to the list of known hosts.
sergej@somewhere.com "s password:
|
Если теперь посмотреть в /mnt/local, то в нем обнаружатся файлы, расположенные на удаленном компьютере. По умолчанию монтируется домашний каталог пользователя, при необходимости можно указать на конкретный каталог, порт отличный от принятого по умолчанию и прочие параметры соединения. Для удобства можно создать символическую ссылку и вызывать команду привычным образом.
# ln-s /sbin/mount.shfs /sbin/shfsmount
# mount -t shfs sergej@somewhere.com: /mnt/local
Практически такими же возможностями обладает пакет sshfs-fuse, доступный для закачки с сайта проекта fuse (http://prdownloads.sourceforge.net/fuse/sshfs-fuse-1.1.tar.gz?download). Работа с ним отличается только используемой командой.
# sshfs sergej@somewhere.com:/tmp /mnt/local
# mount | grep shfs
sergej@somewhere.com: on /mnt/local type shfs (version=2,mnt=/mnt/local,fd=5) |
Сетевые ресурсы в окне МС
Подобным образом можно смонтировать и SMB-ресурсы Windows машин. Проект SMB for Fuse (http://hannibal.lr-s.tudelft.nl/~vincent/fusesmb) позволяет монтировать не только отдельные ресурсы, как это делается обычным способом при помощи smbclient и smbmount, но и полностью всю рабочую группу или компьютер. Затем к ресурсам можно обращаться из любого приложения, как к локальным файлам. Кэширование при помощи скрипта fusesmbcache ускоряет просмотр доступных ресурсов. Этот скрипт необходимо запускать при помощи cron.
# crontab –e
*/30 * * * * fusesmbcache &> /dev/null |
И теперь мониторим ресурсы.
# mkdir ~/net
# fusermount ~/net fusesmb &
В указанном каталоге появится дерево каталогов, соответствующих рабочим группам, входящим в них компьютерам и доступным ресурсам.
Не менее интересной является разработка еще одного Open Source проекта FunFS – Fast User Network FileSystem (http://www.luminal.org/wiki/index.php/FunFS/FunFS), цель которого – полноценная замена NFS. Особое внимание было уделено повышению надежности и безопасности соединений. К сожалению, на данный момент FunFS находится в состоянии альфа-версии, поэтому о сколько-нибудь серьезном его применении пока говорить еще рано. Практически аналогична ситуация с проектом fusedav (http://0pointer.de/lennart/projects/fusedav), позволяющим монтировать WebDAV (http://www.webdav.org) ресурсы. Разработки идут вяло, хотя версия 0.1, доступная в настоящее время на сайте, в принципе функциональна. Впрочем, и AVFS (http://sourceforge.net/projects/avf) позволяет также просматривать удаленные ресурсы (ftp, http, dav), и кроме того монтирует архивы (tar, tar.gz, zip) в дерево файловой системы.
Контроль версий файлов
Wayback (User-level Versioning File System for Linux, http://wayback.sourceforge.net) позволяет сохранять старые версии текстовых файлов, независимо от их количества, и каталогов, в которых они располагаются. Работает wayback на любом блочном устройстве с любой файловой системой. Для отката такая система ведет файл журнала, в котором описываются все изменения. Монтируется новая файловая система при помощи скрипта mount.wayback.
# ./mount.wayback ~/wayback/ /mnt/disk
fusermount: unable to open fuse device /proc/fs/fuse/dev: No such file or directory |
Скрипт пытается загрузить модуль fuse. Если он раннее был загружен, то появится такое сообщение. Поэтому для работы его необходимо первоначально выгрузить.
# /sbin/rmmod fuse
# ./mount.wayback ~/wayback/ /mnt/disk
# mount | grep fuse
/proc/fs/fuse/dev on /mnt/disk type fuse (rw,nosuid,nodev) |
# echo «test» > /mnt/disk/test
# ls /mnt/disk/
Смотрим содержимое:
# ls ~/wayback/
test test~. versionfs! version test. versionfs! version |
# echo «test2» >> /mnt/disk/test
# echo «test3» >> /mnt/disk/test
# ls ~/wayback/
test ~test ~test. versionfs! version test~. versionfs! version test. versionfs! version |
Отмечается более быстрая работа с файлами по сравнению с CVS. Но если все таки необходим доступ именно к системе CVS, то некоторые, возможно, предпочтут использовать довольно удобную cvsfs (http://sourceforge.net/projects/cvsfs), позволяющую смонтировать CVS и работать с ней как с локальной файловой системой. При этом пользователю будут доступны изменения, без необходимости закачки всего дерева каталогов. В данный момент пользователь ограничен только самым последним релизом, использовав знаки ‘@@’ в имени файла (например filename@@1.1) можно получить доступ к любой версии файла.
Второй вариант lufs_unionfs (http://alumnus.caltech.edu/~muresan/projects/lufs_unionfs.html), которая основана на LUFS. Такая система имеет два каталога, основной работает в режиме «только для чтения» (некий образ, содержимое которого остается постоянным), а в дополнительный будут занесены все изменения и новые файлы (идея взята с проекта unionfs (http://www.fsl.cs.sunysb.edu/project-unionfs.html). В точке монтирования это будет выглядеть, как обычная файловая система, но всегда можно будет вернуться в исходное состояние.
Работа с e-mail, bluetooth и устройствами
Для пользователей почтового сервиса Gmail доступна файловая система GmailFS – Gmail Filesystem (http://richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html). Это написанное на Python приложение, использующее библиотеку libgmail (http://libgmail.sourceforge.net) для связи с Gmail. Позволяет монтировать почтовый аккаунт как обычную файловую систему и пользоваться в дальнейшем обычными командами вроде ls, rm, cp, grep и другими утилитами, позволяющими быстро разобраться с 1 Гб информации.
Не менее интересны файловые системы, позволяющие получить доступ к различным устройствам. Среди них btfs – Bluetooth FileSystemMapping (http://www.mulliner.org/bluetooth/btfs.php), при помощи которой можно узнать обо всех доступных bluetooth-устройствах просто использовав команду ls.
# ls -la /OPUSH
/OPUSH/SE_T630
/OPUSH/myPalm
Для пересылки файлов – ср.
# cp file.txt /OPUSH/myPalm
К сожалению, в данный момент получить файлы от устройств таким образом невозможно. Аналогично, если вы считаете, что специализированные утилиты, предназначенные для работы с цифровыми фотокамерами вроде gtkam, не удобны и предпочитаете использовать для этого стандартные инструменты, попробуйте gphoto2-fuse-fs (http://www.hep.phy.cam.ac.uk/~lester/gphoto2-fuse-fs). Используя эту файловую систему, можно смонтировать в режиме «только для чтения» фотокамеру и просматривать изображения. Для доступа к памяти в мобильных телефонах Siemens разработана файловая система SieFS (http://chaos.allsiemens.com/siefs), которая в настоящее время работает с телефонами 45, 55 и 65 серий.
Проблему доступа к данным и настройкам во время выполнения программы (что особенно актуально для встроенных устройств) пытаются решить разработчики проекта RTA – Run Time Access (http://www.runtimeaccess.com), представляющего специализированный постоянно загруженный интерфейс к внутренним данным работающего приложения. Используя его, можно получить доступ ко всем структурам выполняющейся программы через Postgres-интерфейс, информация которого теперь будет видна пользователю как таблицы базы данных или как дерево файловой системы. И теперь к ним можно получить доступ любым удобным способом (консоль, веб-интерфейс, SNMP и др.).
Это не все разработки, использующие FUSE. Остальную информацию можно найти на сайте проекта. Но как видите, подобные файловые системы заметно упрощают работу пользователя. К сожалению, большинство разработок находятся еще в состоянии альфа-версии, так что окончательное решение придется принимать на свой страх и риск.