to
Научный руководитель: |
Д.С. Бургонский |
Курсовая работа посвящена созданию возможности защиты информации в файловой системе UNIX (в данной реализации была модифицирована файловая система ext2). Получившаяся в результате работы файловая система ext2_crypt характеризуется многоуровневостью защиты и простотой использования, что говорит о большой вероятности того, что она будет использоваться обыкновенными пользователями вместо стандартных файловых систем UNIX.
to
Научный руководитель: |
Д.С. Бургонский |
Курсовая работа посвящена созданию возможности защиты информации в файловой системе UNIX (в данной реализации была модифицирована файловая система ext2). Получившаяся в результате работы файловая система ext2_crypt характеризуется многоуровневостью защиты и простотой использования, что говорит о большой вероятности того, что она будет использоваться обыкновенными пользователями вместо стандартных файловых систем UNIX.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Для начала необходимо представление об общем устройстве операционной системы UNIX(Рис. 2)
Из рисунка видно, что совокупность обращений к операционной системе разделена на те обращения, которые взаимодействуют с подсистемой управления файлами, и те, которые взаимодействуют с подсистемой управления процессами. Файловая подсистема управляет файлами, размещает записи файлов, управляет свободным пространством, доступом к файлам и поиском данных для пользователей. Данная подсистема обращается к данным, которые хранятся в файле, используя буферный механизм, управляющий потоком данных между ядром и устройствами внешней памяти. Буферный механизм, взаимодействуя с драйверами устройств ввода-вывода блоками, инициирует передачу данных к ядру и обратно.
Другие компоненты схемы не притерпели изменений в результате перестройки ext2 в ext2_crypt, поэтому их описание в рамках данной курсовой работы опускается.
Пришло время описать способы хранения информации о файлах. Внутреннее представление файла описывается в индексе (inode), который содержит описание размещения информации файла на диске и другую информацию, такую как владелец файла, права доступа к файлу и время доступа. Каждый файл имеет один индекс.
Сама файловая система состоит из последовательности логических блоков длиной
512, 1024, 2048 или другого числа байт, кратного 512, в зависимости от
реализации системы. Размер логического блока внутри одной файловой системы
постоянен, но может варьироваться в разных файловых системах в данной
конфигурации.
Файловая система имеет следующую структуру (Рис. 3):
Это небольшое введение во внутренюю структуру файловой системы UNIX, должно максимально упростить понимание принципов, которым следовали разработчики при создании новой файловой системы.
Для того, чтобы ext2_crypt можно было пользоваться, необходимо реализовать способ создания такой файловой системы, способ ее монтирования, а также необходимо внести изменения в систему ext2, благодаря которым будет осуществляться механизм распознавания пароля и шифрования содержимого файловой системы. Под реализацией способа создания файловой систем подразумевается модификация стандартной mkfs (Рис. 4)
Из рисунка видно, что в новой реализации mkfs добавлен механизм запроса пароля, генерация по этому паролю ключа, а также шифрование суперблока с помощью сгенерированного ключа. Пароль, который вводится при создании файловой системы и является тем ключевым словом, которое необходимо будет ввести при монтировании для получения доступа к содержимому файлов. Из того, что при создании системы шифруется суперблок, вытекают два момента, выгодных с точки зрения защиты данных: во-первых, из того, что суперблок хранится на диске в зашифрованном виде следует, что систему невозможно смонтировать, какой бы тип файловой системы не был бы указан; во-вторых при монтировании с помощью расшифровывания суперблока осуществляется механизм распознавания пароля на правильность. Распознавание правильности пароля происходит следующим образом: при монтировании по введенному паролю генерируется ключ, с помощью которого происходит расшифровывание суперблока. В суперблоке есть поле s_magic, которое является ничем иным, как хранилищем так называемой ``магической'' константы, которая у каждой системы оригинальна, то есть в этом поле суперблока различных файловых систем хранятся различные константы. После того, как суперблок расшифрован, s_magic расшифрованного суперблока сравнивается с раз и навсегда заданной для ext2_crypt ``магической'' константой EXT2_CRYPT_SUPER_MAGIC, которая равна 0xFA53. Если совпадение имеет место, то монтирование разрешается, иначе -- нет.
Для того чтобы шифрованная система могла быть смонтирована, были необходимы изменения в стандартном mount (Рис. 5)
Как показано на рисунке, к старой реализации mount добавлен механизм запроса пароля, при правильности которого происходит монтирование, а также способ передачи пароля файловой системе. Под способом передачи пароля файловой системе подразумевается добавление пароля к списку опций, которые, в свою очередь, передаются файловой системе на дальнейшую обработку.
Также необходимо сказать о некотором неудобстве монтирования с точки зрения пользователя: при монтировании такой системы необходимо всегда указывать тип файловой системы (-t ext2_crypt). Это вызвано тем, что в стандартном mount тип файловой системы определяется в основном по имеющемуся в суперблоке полю -- s_magic. Так как суперблок хранится в шифрованном виде,а пароль спрашивается после определения типа файловой системы, то расшифровывание данного поля не представляется возможным. В процессе разработки было предложено несколько способов распознавания типа, но все они были отвергнуты по причине, либо нарушения надежности защиты информации, либо возможности монтирования другой файловой системы ( у шифрованного суперблока может произойти совпадение содержимого s_magic с ``магической'' константой какой-нибудь другой файловой системы). В результате разработчики пришли к выводу, что в данном случае придется пожертвовать удобством, нежели надежностью файловой системы.
Все остальные изменения осуществлены в самой реализации файловой системы ext2: отделение пароля от общего списка опций, распознавание пароля на правильность (способ распознавания был описан выше), а также подмена исходных имен и содержимого файлов на шифрованные, и наоборот.
Механизм изменения содержимого файлов показан на рисунке. Способ изменения имен файлов следующий: имя файла зашифровывается только один раз -- при создании файла, и в последующем храниться в зашифрованном виде; при запросе какого-либо файла, его имя зашифровывается и ищется в списке уже зашифрованных имен. Таким образом, при отсутствии правильного ключа, найти файл по его имени не представляется возможным.
Общая схема работы файловой системы указана на рисунке.
Единственным, но очень существенным недостатком ext2_crypt, является неустойчивость этой системы к сбоям. Суть этого явления заключается в следующем: дело в том, чтобы работать с системой, необходимо расшифровать суперблок, а в файловой системе UNIX в процессе работы суперблок переодически записывается на диск. То есть, в какой-то момент времени на диске будет лежать расшифрованный суперблок. Следовательно, при отмонтировании файловой системы суперблок необходимо вновь зашифровать. Но и этого оказывается недостаточно, ведь если в момент работы с ext2_crypt перезагрузить компьютер, суперблок останется в незащищенном виде. Этого избежать не удалось, так как механизм перезаписи на диск достаточно сложен и затрагивает не только саму файловую систему ext2_crypt, но и другие модули ядра LINUX, и если производить в них изменения, то теряется модульность реализации. Однако, был воплощен в жизнь способ монтирования системы даже в случае такого сбоя: к стандартному набору полей было добавлено еще одно поле -- s_second_magic (оно находится в самом конце суперблока). При создании файловой системы зашифровывается весь суперблок, а при монтировании расшифровывается весь, за исключением последнего поля, то есть s_second_magic хранится всегда в зашифрованном виде. При распознавании пароля сначала проверяется s_magic на совпадение с EXT2_CRYPT_SUPER_MAGIC. Если имеет место совпадение, то расшифровывается s_second_magic и сравнивается с EXT2_CRYPT_SUPER_MAGIC. При совпадении происходит монтирование.
Общая схема проверки пароля указана на рисунке.
В данной реализации файловой системы ext2_crypt в стандартной программе mkfs была сделана дополнительная поддиректория e2crfsprogs-1.12, в которой реализованы все средства, необходимые для создания файловой системы такого типа.
Код, воплощающий в жизнь способ запроса пароля, находится в файле misk/mke2crfs.c 1 в функции main(...). Выглядит он следующим образом:
/* * Getting the password ... */ passwd = getpass("Enter password: "); if(!passwd) { fprintf(stderr,"Warning: your filesystem will not be crypted\n"); } /* * Putting the password into the superblock... */ while(*passwd != '\0') fs->password_key += *(passwd++);
Тот факт, что для расположения этого кода была выбрана именно функция main(...), обусловлен тем, что, в отличии от большинства подходящих для размещения кода других функций, эта функция вызывается только однажды с процессе выполнения программы, следовательно, пароль будет спрошен только один раз, что, в свою очередь, и подразумевалось в постановке исходной задачи.
Что касается шифрования суперблока, то оно осуществляется в файле lib/ext2_crypt_fs/closefs.c в функции ext2_crypt_fs_flush(...). Именно в этой функции происходит запись заполненного суперблока на диск, шифрование же происходит перед самым записыванием.
Во всем пакете программ mount изменения были произведены в файле mount.c. Функция, посредством которой пароль повторно запрашивается и приклеивается к общему списку опций называется getpassword(...) и выглядит следующим образом:
static int getpassword(char *type,char **opts) { char *passwd; if(type) { if(!strcmp(type,"ext2_crypt")) { if(!*opts) { passwd = getpass("Enter password: "); *opts = xstrdup("password"); *opts = xstrconcat3(*opts,"=",passwd); } else { if(!strstr(*opts,"password")) { passwd = getpass("Enter password: "); *opts = xstrconcat3(*opts,",","password"); *opts = xstrconcat3(*opts,"=",passwd); } } return 0; } else return 1; } return 2; }
Эта функция вызывается из mount_one(), которая, в свою очередь, вызывается при попытке монтирования, в случае, когда тип монтируемой файловой системы известен.
Файл, в котором располагается обработка списка опций, а также реализация механизма проверки пароля и повторного шифрования суперблока, называется super.c и располагается в директории linux-2.0.36/fs/ext2_crypt/. Обработка списка опций осуществляется функцией parse_options(...), а механизм проверки пароля реализован в функции ext2_crypt_read_super(...) и выглядит, как приведено ниже:
/* * Cheking the password... */ if(es->s_magic == EXT2_CRYPT_SUPER_MAGIC){ ! crypt_super = (char*) &(es->s_second_magic); ! for(k = 0; k < sizeof(__u32); k++) ! *(crypt_super++) ^= password_key; if(es->s_second_magic != EXT2_CRYPT_SUPER_MAGIC){ tty_write_message(current->tty,"\nPassword incorrect\n\r"); goto failed_mount; } } else{ crypt_super = (char*) es; for(k = 0; k < (SUPERBLOCK_SIZE-4); k++) *(crypt_super++) ^= password_key; if(es->s_magic != EXT2_CRYPT_SUPER_MAGIC){ tty_write_message(current->tty,"\nPassword incorrect\n\r"); goto failed_mount; } }
Строчки, помеченные восклицательными знаками, есть ничто иное, как алгоритм шифрования, используемый для защиты абсолютно всех защищенных в данной реализации элементов системы. Очевидно, он слишком прост, и имеет место тот факт, что алгоритмы зашифровывания и расшифровывания совпадают. Однако, данный алгоритм можно очень легко и безболезненно заменить на любой другой более сложный, и мало того, для еще большего повышения надежности, можно использовать разные алгоритмы для шифрования разных элементов системы.
Что касается повторного шифрования суперблока, то оно осуществляется в функции ext2_crypt_put_super(...), так как именно эта функция вызывается в момент отмонтирования системы.
Также, необходимо сказать о механизмах защиты информации в файлах. Данные механизмы располагаются в той же директории в файле file.c и осуществляются следующими функциями:
int ext2_crypt_file_read(struct inode * inode, struct file * filp, char * buf, int count) { int read,i; char ch; read = generic_file_read(inode, filp, buf, count); for(i = 0; i < read; i++) { ch = get_user(buf); ch ^= inode->i_sb->u.ext2_crypt_sb.password; put_user(ch,buf++); } return read; } static int ext2_crypt_file_write (struct inode * inode, struct file * filp, const char * buf, int count) { int i; char ch; for(i = 0; i < count; i++) { ch = get_user(buf); ch ^= inode->i_sb->u.ext2_crypt_sb.password; put_user(ch,buf++); } buf -= count; return ext2_file_write(inode,filp,buf,count); }
И, наконец, о шифровании имен файлов. Реализация шифрования данных элементов системы находится в той же директории в файле namei.c. Ниже приводится уже описанный, но несколько адаптированный для этого случая, алгоритм шифрования, который в такой модификации осуществляет шифрование имен файлов:
/* * Crypting the name ... */ crypt_name = name; while(*crypt_name != '\0'){ *(crypt_name++) ^= dir->i_sb->u.ext2_crypt_sb.password; }
В заключении необходимо еще раз отметить достоинства и недостатки результата данной курсовой работы. Итак, основными неоспоримыми достоинствами новой файловой системы ext2_crypt являются:
Но также система имеет один недостаток:
Вцелом система готова к эксплуатации и новым модификациям, и, несомненно, может вызвать неподдельный интерес как у обыкновенных пользователей, так и у опытных разработчиков, что говорит о большой значимости проделанной работы.
This document was generated using the LaTeX2HTML translator Version 98.1p1 release (March 2nd, 1998)
Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
The command line arguments were:
latex2html filesys.tex.
The translation was initiated by Ekaterina A. Kupcova on 1999-06-24
Еще недавно проблема конфиденциальности передачи информации и проблема защиты информации вцелом относились в основном к военным и специальным применениям, в настоящее же время все чаще появляется необходимость решения данной проблемы в сфере гражданских приложений. В связи с неотвратимым проникновением электронных хранителей информации в повседневную жизнь, решение проблемы защиты информации именно в компьютерах и компьтерных сетях -- наиболее благодарная (в плане востребования результатов работы) область деятельности для разработчиков програмных продуктов.
В данной курсовой работе была сделана попытка реализации новой файловой системы ext2_crypt, в которой пользовательские данные и некоторая служебная информация хранятся не в открытом, а в зашифрованном виде. Эта файловая система устроена по всем законам логики, а именно таким образом, что расшифровать имеющиеся данные имеет право только человек, знающий пароль.
Научиться пользоваться данной системой необыкновенно просто особенно тем, кто имеет опыт работы со стандартной для Linux файловой системой ext2, так как ext2_crypt является лишь ее модификацией. Для удобства пользования глобальное устройство файловой системы ext2 не было изменено, и по всем расчетам использующий файловую систему ext2_crypt практически не должен заметить того, что он работает с данными, которые хранятся в нечитаемом виде. Об этом ему будет напоминать лишь тот факт, что при монтировании данной системы ему необходимо будет ввести пароль, о чем вновь смоделированная система его предусмотрительно попросит.
Если речь не идет о военной стратегической информации или о важных коммерческих секретах, то защиты информации, которую предлагает ext2_crypt, вполне достаточно: взломать ее может быть под силу только человеку с огромными правами доступа к программной реализации внутреннего строения операционной системы Linux, и который к тому же в совершенстве разбирается в этой самой реализации. Итак, необходимым условием уверенности в данной файловой системе является то, чтобы среди недругов не было людей, обладающих такими способностями: в этом случае ext2_crypt можно смело пользоваться.
Организация файловой системы UNIX имеет древовидную структуру, вершина
которой называется корнем, а сама структура называется
файловым деревом. Каждая вершина в файловом дереве, за исключением листьев,
является каталогом, листья же в свою очередь являются либо обычными файлами,
либо файлами устройств (Рис. 1).
Для того, чтобы добраться до файла необходимо указать его имя, которому предшествует указание пути поиска, который описывает местоположение файла в файловом дереве. Путь поиска состоит из компонент, разделенных между собой наклонной чертой (``/''), которые представляют из себя последовательность вершин в файловом дереве, которые необходимо посетить, чтобы достигнуть требуемый файл. Путь поиска может начинаться в корне, в этом случае первая компонента пути записывается как ``/'' (например ``/usr/src/cmd/date.c''). Такой путь называется полным. Также путь может отсчитываться относительно текущей директории (например если текущей директорией является ``cmd'', то путь ``date.c'' соответствует пути ``/usr/src/cmd/date.c'').
В файловой системе UNIX также существует понятие прав доступа к файлу. Права доступа к файлу регулируются установкой специальных битов разрешения доступа, связанных с файлом. Устанавливая биты разрешения доступа, можно независимо управлять выдачей разрешений на чтение, запись и выполнение для трех категорий пользователей: владельца файла, группового пользователя и прочих. Пользователи также могут создавать файлы, если разрешен доступ к каталогу. Вновь созданные файлы становятся листьями в древовидной структуре файловой системы.
Устройства в системе UNIX трактуются так, как если бы они были файлами. Обращение программ к устройствам имеет тот же самый синтаксис, что и обращение к обычным файлам; семантика операций чтения и записи по отношению к устройствам в большой степени совпадает с семантикой операций чтения и записи обычных файлов. Способ защиты устройств совпадает со способом защиты обычных файлов: путем соответствующей установки битов разрешения доступа к ним. Поскольку имена устройств выглядят так же, как и имена обычных файлов, и поскольку над уст- ройствами и над обычными файлами выполняются одни и те же операции, большинству программ нет необходимости различать внутри себя типы обрабатываемых файлов.
Итак, файловая система UNIX характеризуется:
Как уже упоминалось выше файловая система ext2_crypt является лишь небольшой модификацией файловой системы ext2, которая в свою очередь сочетает в себе практически все черты файловой системы UNIX вцелом. Следовательно, и ext2_crypt обладает всеми возможностями и особенностями, которые были описаны пунктом выше. Единственным отличием ext2_crypt от своих предшественниц состоит в том, что в ней реализована возможность, благодаря которой не только повышается защита информации в файлах, но и появляется защита от просмотра всего содержимого файловой системы, включая имена файлов и некоторую служебную информацию, без которой файловая система со всем своим содержимым не может быть использована.Таким образом, если используется шифрованная файловая система ext2_crypt, никакой злоумышленник, не зная пароля, не сможет не только посмотреть истинные названия и содержимое файлов, но даже не сможет смонтировать эту систему, то есть ничего не сможет с нею сделать.
С точки зрения пользователя, использование файловой системы ext2_crypt отличается от использования стандартной системы ext2 только методом создания этой файловой системы и методом ее монтирования. В остальном, несмотря на сложные процессы, происходящие внутри файловой системы, снаружи никакие изменения не могут быть выявлены.
Итак, для создания файловой системы ext2_crypt, требуется выполняемый файл модифицированной программы mkfs. Если указывать путь относительно созданной в процессе разработки директории e2crfsprogs-1.12, то выполняемый файл находится в директории misk/ и называется mke2crfs.
Ниже приведен пример создания файловой системы в фале:
e2crfsprogs-1.12/misk/mke2crfs { name of file }
Для того, чтобы ext2_crypt была смонтирована, всего лишь необходимо иметь при себе пакет программ, включающий в себя модифицированный mount. При монтировании нужно помнить, что в случае с данной системой всегда необходимо указывать тип файловой системы в опциях.
Пример монтирования файловой системы, расположенной в файле:
mount { name of device} { name of file } -o loop -t ext2_crypt
Итак, как видно из приведенных примеров, манипуляции с новой файловой системой практически не отличаются от манипуляций с ее предшественницей, что, несомненно, является положительным качеством реализации.
Разработка новой защищенной файловой системы есть не что иное, как попытка создания достаточно высокой степени защиты информации, реализованной на уровне файловой системы. Постановка исходной задачи не предполагала создания системы с очень хорошей защитой информации и с очень большим спектром применения, поэтому требования к алгоритму шифрования и к устойчивости данной системы к сбоям были минимальными. Основная задача, которая была поставлена перед разработчиками -- это показать саму идею реализации подобной системы, в которой будут сочетаться одновременно и удобство использования, и защита информации, которая сама по себе состоит из нескольких уровней защиты, которые, в свою очередь, дают максимальную уверенность в надежности системы и ее устойчивости к взломам.
Многоуровневость защиты заключается в следующем:
Таким образом, обойдя предыдущий уровень защиты, злоумышленник обязательно столкнется с последующим. Единственное условие получения хранимой информации, при котором все эти уровни остануться незамеченными -- это знание пароля, который задается один раз при создании файловой системы.