Основные подходы к обеспечению качества программного обеспечения

Введение

      В соответствии с Доктриной информационной безопасности Российской Федерации, утвержденной Президентом Российской Федерации 9 сентября 2000 года № Пр-1895, одна из составляющих национальных интересов Российской Федерации в информационной сфере  включает в себя «развитие современных  информационных технологий, отечественной  индустрии информации, в том числе  индустрии средств информатизации, телекоммуникации и связи, обеспечение  потребностей внутреннего рынка  ее продукцией и выход этой продукции  на мировой рынок, а также обеспечение накопления, сохранности и эффективного использования отечественных информационных ресурсов». При этом отмечается, что к основным направлениям обеспечения информационной безопасности Российской Федерации в общегосударственных информационных и телекоммуникационных системах относится «создание и применение информационных и автоматизированных систем управления в защищенном исполнении».

      Как следствие указанных положений  Доктрины информационной безопасности, Президентом Российской Федерации 21 мая 2006 года № Пр-843 утверждены Приоритетные направления развития науки, технологий и техники в Российской Федерации, в которые включены информационно-телекоммуникационные системы.

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

      Особое  место среди программных средств, использующихся во всех без исключения автоматизированных системах государственного, военного, коммерческого и иного  назначения, занимают операционные системы (ОС), под которыми, в общем случае понимают комплекс программ, которые обеспечивают управление аппаратурой ЭВМ, планирование эффективного использования её ресурсов и решение задач по заданиям пользователей.

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

  1. Интенсивное развитие аппаратной составляющей современных ЭВМ требует постоянного совершенствования программного обеспечения, включая ОС. При этом выпускаемые обновления должны быть не только совместимы с существующим программно-аппаратным обеспечением, но и не ухудшать характеристики по безопасности всего комплекса.
  2. Использование ОС иностранного производства требует проведения их проверки на соответствие требованиям по информационной безопасности и, как правило, соответствующей доработки. В условиях постоянного выпуска новых ОС или их версий длительность разработки сравнима с длительностью процедуры доработки и сертификации, что заведомо ставит страны, использующие данную стратегию, в ряды технологически отсталых стран.
  3. Современные ОС представляют собой сложные программные комплексы со значительным объемом кода. Как следствие, сертификация по требованиям информационной безопасности, при условии производства ОС сторонними разработчиками, носит вероятностный характер.

     Осознавая ключевую роль операционных систем, ведущие  промышленно развитые государства  организуют их собственную разработку. В качестве примера можно отметить, что в начале сентября 2010 года о создании собственной операционной системы на базе ПО с открытым кодом заявила Украина. Ранее об аналогичных проектах, по имеющимся сведениям, заявили Германия, Франция, Китай и др. страны.

         Российская Федерация  также имеет опыт по разработке собственных  операционных систем, как оригинальных, так и на базе ПО с открытым кодом. Наиболее известным проектом является ОС МСВС, внедряемая в настоящее время в Вооруженных силах. Также можно отметить «Феникс» - разработку СПбГТУ, распространяемую под коммерческим названием «Фебос» и другие системы. В целом указанные ОС не получили достаточно широкого распространения, что обусловлено не только необходимостью разработки для них соответствующего совместимого программного обеспечения.

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

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

      Таким образом, разработка методов создания безопасных операционных систем является актуальной научной и перспективной практической задачей.

Основные  понятия и определения

    Основная  цель ОС, обеспечивающей работу ЭВМ  в любом из описанных режимов, - динамическое распределение ресурсов и управление ими в соответствии с требованиями вычислительных процессов (задач).

    Ресурсом  является всякий объект, который может  распределяться операционной системой между вычислительными процессами в ЭВМ. Различают аппаратные и  программные ресурсы ЭВМ. К аппаратным ресурсам относятся микропроцессор (процессорное время), оперативная память и периферийные устройства; к программным  ресурсам – доступные пользователю программные средства для управления вычислительными процессами и данными. Важнейшими программными ресурсами  являются программы, входящие в систему  программирования; средства программного управления периферийными устройствами и файлами; библиотеки системных  и прикладных программ; средства, обеспечивающие контроль и взаимодействие вычислительных процессов (задач).

    Операционная  система распределяет ресурсы в  соответствии с запросами пользователей  и возможностями ЭВМ и с  учетом взаимодействия вычислительных процессов. Функции ОС также реализуются  рядом вычислительных процессов, которые  сами потребляют ресурсы (память, процессорное время и др.) Вычислительные процессы, относящиеся к ОС, управляют вычислительными процессами, созданными по запросу пользователей.

    Считается, что ресурс работает в режиме разделения, если каждый из вычислительных процессов  занимает его в течение некоторого интервала времени. Например, два  процесса могут разделять процессорное время поровну, если каждому процессу дается возможность использовать процессор  в течение одной секунды из каждых двух секунд. Аналогично происходит разделение всех аппаратурных ресурсов, но интервалы использования ресурсов процессами могут быть неодинаковыми. Например, процесс может получить в своё распоряжение часть оперативной  памяти на весь период своего существования, но микропроцессор может быть доступен процессу только в течение одной  секунды из каждых четырёх. [3,стр.56]

    Операционные  системы (ОС) классифицируют:

  1. по особенностям алгоритмов управления ресурсами – локальные и сетевые ОС. Локальные ОС управляют ресурсами отдельного компьютера. Сетевые ОС участвуют в управлении ресурсами сети;
  2. по числу одновременно выполняемых задач – однозадачные и многозадачные. Однозадачные ОС выполняют функцию предоставления пользователю виртуальной вычислительной машины, обеспечивая его простым и удобным интерфейсом взаимодействия с компьютером, средствами управления периферийными устройствами и файлами. Многозадачные ОС, кроме вышеперечисленных функций, управляют разделением совместно используемых ресурсов, таких как процессор, оперативная память, файлы и внешние устройства;
  3. по числу одновременно работающих пользователей – однопользовательские и многопользовательские. Основным отличием многопользовательских систем от однопользовательских является наличие средств защиты информации каждого пользователя от несанкционированного доступа других пользователей;
  4. по возможности распараллеливания вычислений в рамках одной задачи – поддержка многонитевости. Многонитевая ОС разделяет процессорное время не между задачами, а между их отдельными ветвями – нитями;
  5. по способу распределения процессорного времени между несколькими одновременно существующими в системе процессами или нитями – невытесняющая многозадачность и вытесняющая многозадачность. В невытесняющей многозадачности механизм планирования процессов целиком сосредоточен в операционной системе, а в вытесняющей распределен между системой и прикладными программами. При невытесняющей многозадачности активный процесс выполняется до тех пор, пока он сам по собственной инициативе не передаст управление операционной системе для выбора из очереди другого готового к выполнению процесса. При вытесняющей многозадачности решение о переключении процессора с одного процесса на другой принимается операционной системой, а не самим активным процессом;
  6. по отсутствию или наличию в ней средств поддержки многопроцессорной обработки. Многопроцессорные ОС, в свою очередь, могут классифицироваться по способу организации вычислительного процесса в системе с многопроцессорной архитектурой: асимметричные ОС и симметричные ОС. Асимметричная ОС целиком выполняется только на одном из процессоров системы, распределяя прикладные задачи по остальным процессорам. Симметричная ОС полностью децентрализована и использует весь набор процессоров, разделяя их между системными и прикладными задачами;
  7. по ориентации на аппаратные средства – операционные системы персональных компьютеров, серверов, мейнфреймов, кластеров;
  8. по зависимости от аппаратных платформ – зависимые и мобильные. В мобильных ОС аппаратно зависимые места локализованы так, что при переносе системы на новую платформу переписываются только они. Средством, облегчающим перенос ОС на другой тип компьютера является написание ее на машиннонезависимом языке, например, на С;
  9. по особенностям областей использования – ОС пакетной обработки, разделения времени, реального времени. Системы пакетной обработки предназначены для решения задач вычислительного характера, не требующих быстрого получения результатов. Главной целью и критерием эффективности систем пакетной обработки является максимальная пропускная способность, то есть решение максимального числа задач в единицу времени. В системах с разделением времени каждому пользователю предоставляется терминал, с которого он может вести диалог со своей программой. Каждой задаче выделяется некоторый квант процессорного времени, так что ни одна задача не занимает процессор надолго. Если квант времени выбран небольшим, то у всех пользователей, одновременно работающих на одном компьютере, создается впечатление, что каждый из них единолично использует машину. Системы реального времени применяются для управления различными техническими объектами, когда существует предельно допустимое время, в течение которого должна быть выполнена та или иная программа управления объектом. Невыполнение программы в срок может привести к аварийной ситуации. Таким образом, критерием эффективности систем реального времени является их способность выдерживать заранее заданные интервалы времени между запуском программы и получением результата – управляющего воздействия;
  10. по структурной организации и концепциям, положенным в основу:
    • по способу построения ядра системы – монолитное ядро или микроядерный подход. ОС использующие монолитное ядро, компонуются как одна программа, работающая в привилегированном режиме и использующая быстрые переходы с одной процедуры на другую, не требующие переключения из привилегированного режима в пользовательский и наоборот. При построении ОС на базе микроядра, работающего в привилегированном режиме и выполняющего только минимум функций по управлению аппаратурой, функции более высокого уровня выполняют специализированные компоненты ОС – программные серверы, работающие в пользовательском режиме. При таком построении ОС работает более медленно, так как часто выполняются переходы между привилегированным режимом и пользовательским, но система получается более гибкой и ее функции можно модифицировать, добавляя или исключая серверы пользовательского режима;
    • по построению на базе объектно-ориентированного подхода;
    • по наличию нескольких прикладных сред в рамках одной ОС, позволяющих выполнять приложения, разработанные для нескольких операционных систем. Концепция множественных прикладных сред наиболее просто реализуется в ОС на базе микроядра, над которым работают различные серверы, часть которых реализуют прикладную среду той или иной операционной системы;
    • по распределению функций операционной системы среди компьютеров сети. В распределенной ОС реализованы механизмы, обеспечивающие пользователя возможностью представлять и воспринимать сеть в виде однопроцессорного компьютера. Признаками распределенной ОС является наличие единой справочной службы разделяемых ресурсов и службы времени, использование механизма вызова удаленных процедур для распределения программных процедур по машинам, многонитевой обработки, позволяющей распараллеливать вычисления в рамках одной задачи и выполнять эту задачу одновременно на нескольких компьютерах сети, а также наличие других распределенных служб

Основные  подходы к обеспечению  качества программного обеспечения

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

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

    Несмотря  на определенный универсализм приведенного определения, между надёжностью  аппаратных средств и программного обеспечения имеется принципиальное различие. Программа в большинстве  случаев не может отказать случайно. Ошибки в программном обеспечении, допущенные при его создании, зависят  от технологии, от организации и  квалификации исполнителей и, в принципе, не являются функцией времени. Причиной отказов, возникающих из-за этих ошибок и фиксируемых как случайный  процесс, является не время функционирования системы (как это бывает в случае аппаратных средств), а набор входных  данных и значений внутренних переменных, сложившихся к моменту отказа или сбоя.

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

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

    Существуют  два основных общепринятых подхода  к обеспечению качества программного обеспечения (ПО) от угрозы отказа функционирования, которые применимы, в том числе, и к программам, реализующим криптографические алгоритмы. Это отказоустойчивость (fault tolerance) и предотвращение неисправностей (fault avoidance).

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

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

Основные  подходы к обеспечению  отказоустойчивости

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

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

    Временная избыточность состоит в использовании  некоторой части производительности ЭВМ для контроля исполнения программ и восстановления (рестарта) вычислительного  процесса. Если рассматривать этот метод применительно к ОС, то он подразумевает запас производительности, который затем будет использоваться системами контроля и для повышения надежности и безопасности функционирования. Величина временной избыточности зависит от требований к безопасности функционирования или обработки информации и находится в пределах от 5-10% производительности до трех- четырехкратного дублирования в вычислительных комплексах, использующих мажорирование.

    Так, например, в состав ОС может быть введена процедура периодического контроля. Для борьбы с сбоями возможно применить процедуры периодического контроля, которые сводятся к выполнению предопределенных детерминированных тестовых процедур (для функций шифрования это может быть, например, прогон тестовых примеров).

    Информационная  избыточность состоит в дублировании накопленных исходных и промежуточных  данных, обрабатываемых программами. Избыточность используется для обеспечения достоверности  данных при проведении криптографических преобразований и обычно реализуется в виде вычисления имитовставок. Так, многие популярные программы, реализующие функции шифрования, как правило, в заголовке зашифрованного файла хранят два значения: контрольную сумму шифрованного текста, которая используется для проверки его целостности, и контрольную сумму открытого текста, использующуюся для проверки правильности расшифрования данных.

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

    Последовательный  характер исполнения программ центральным  процессором приводит к тому, что  средства оперативного программного контроля включаются после исполнения прикладных и сервисных программ. Поэтому  средства программного контроля обычно не могут обнаруживать возникновение  искажения вычислительного процесса или данных (первичную ошибку) и  фиксируют, как правило, только последствия  первичного искажения (вторичную ошибку). Результаты первичного искажения в  ряде случаев могут развиваться  во времени и принимать катастрофический характер отказа при увеличении времени  запаздывания в обнаружении последствий  первичной ошибки.

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

Основные  подходы к предотвращению неисправностей

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

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

  • анализ и спецификация требований,
  • проектирование,
  • исполнение.

    Рассмотрим  содержание каждой из фаз, в контексте  решения задачи предотвращения неисправностей ПО.

Фаза  анализа и спецификации требований

    Стремление  к достижению большей надёжности ПО привлекает значительное внимание к самым ранним фазам цикла создания программ. Новейшая и наименее разработанная область обеспечения программной надежности ¾ область спецификаций требований. Анализ всей совокупности требований к системе ¾ технического задания (ТЗ) выполняется на начальной фазе создания программ. ТЗ составляется на основании перечня требований, предъявленных к системе заказчиком (классы решаемых задач, их характеристики и особенности, режим работы АС, сопряжение с внешними объектами, пропускная способность, время ответа и т.п. при заданных ограничениях на стоимость, длительность разработки и др.). Цель создания ТЗ ¾ уточнить и сформулировать задачи, возлагаемые на систему, согласовать требования заказчика и возможности исполнителя, составить техническое задание на ПО. Это делается для того, чтобы удостовериться в том, что от программ требуются только те системные требования, которые могут быть достигнуты.

    Успехи  в теории программирования и вычислений обеспечили начало использования формальных методов при разработке ПО. Формальный метод разработки систем состоит из трёх основных компонент:

  • формальная запись спецификаций и описаний проектов,
  • методика получения реализаций из спецификаций,
  • составление правил вывода (или доказательство) того, что реализации отвечают этим спецификациям.

    Достоинство формальных методов заключается  в том, что системы, разработанные  с использованием подобного подхода, имеют принципиально высокое  качество. При этом повышение качества достигается двумя путями:

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

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

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

    Представляется, что разработка формальных спецификаций наиболее адекватна процессу разработки ОС.

Фаза  проектирования

    Основная  задача системного проектирования ПО заключается в том, чтобы на основании  технического задания и детализирующего  его эскизного проекта разработать  совокупность основных характеристик  проектируемого ПО, его архитектуру, т. е. состав и интерфейс модулей. Последующие шаги проектирования связаны с уточнением эскизного проекта, т. е. с разработкой формализованных описаний, представляющих в совокупности внутренние задания на проектирование компонент (отдельных процедур) ПО, и их алгоритмической реализацией.

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

Фаза  исполнения

    Фаза  исполнения включает в себя кодирование, интегрирование, а также тестирование и отладку.

    С каждой из фаз создания ПО связаны  свои специфические ошибки. С фазой  анализа и спецификацией требований связаны системные ошибки, с фазой  проектирования ¾ алгоритмические и с фазой кодирования ¾ программные.

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

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

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

    Таким образом, на основании анализа фаз  создания ПО и допускаемых на них ошибок можно сделать вывод о том, что двумя основными разновидностями ошибок являются:

  • неверное специфицирование как всего программного комплекса, так и отдельных его составляющих,
  • функциональное несоответствие программы алгоритму.

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

    Методология построения надежных ОС

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

  • иерархический метод разработки,
  • исследование корректности и верификация,
Основные подходы к обеспечению качества программного обеспечения