вторник, 11 января 2011 г.

Об абсолютно безопасной информации



"Да, я преступник. Моё преступление — любопытство. Моё преступление в том, что я сужу людей не по тому, как они выглядят, а по тому, что они говорят и думают. Моё преступление в том, что я намного умнее вас. Это то, что вы мне никогда не простите. Я хакер. И это мой манифест..."
(C) Наставник, "Манифест Хакера", каноническая версия

"Информация должна быть свободной во всех ее аспектах - как товар, как поток и как вектор..."
(С) Вак МакКензи, "Манифест Хакера", 4-ая версия

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

Чтобы понять, почему, предлагаю вспомнить определение безопасности информации. Безопасность - это состояние информации, при котором обеспечивается ее конфиденциальность, целостность и доступность. И, если с первыми двумя свойствами у нас тут все в порядке, то вот с доступностью... наблюдается полное отсутствие этого свойства у информации, описанной в шутке. У небезопасной информации, описанной в шутке, ч.т.д. :)

Но как тогда можно описать абсолютно безопасную информацию? Какой она должна быть? Какие условия должны быть созданы? Давайте пофантазируем... Начнем пожалуй, со свойства, отсутствие которого не позволило нам считать безопасной информацию, рассмотренную выше. В реальном мире, все, что мы можем сделать для обеспечения доступности информации - это обеспечить устойчивое резервирование мест хранения информации и каналов по которым она передается. Следовательно, чтобы получить абсолютную доступность, мы должны:
  1. довести до максимума количество копий нашей информации. В идеале, мы должны достичь того, чтобы копия информации хранилась у каждого субъекта, имеющего право доступа к ней;
  2. довести до максимума количество каналов по которым возможно получение рассматриваемой информации. В идеале, мы должны достичь того, чтобы каждый субъект, имеющий право доступа к ней, имел возможность получить информацию у любого другого такого субъекта.
Иными словами, идеальной с точки зрения доступности информации, будет являться сеть, представляющая собой полный граф, узлы которого являются одновременно и местами хранения и местами обработки информации, а ребра - каналами ее передачи в обе стороны... Ничего не напоминает? Peer-to-peer в чистом виде.

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

Но все это выглядит радужным лишь до тех пор, пока информация, обрабатываемая и хранящаяся на узлах остается в неизменном виде. Если же информация по своей сути подвержена изменениям, то вопрос об обеспечении ее актуальности на всех узлах кажется, на первый взгляд, и вопросом обеспечения ее целостности, как ни крути, ведь в соответствии с постулатом, принятом на предыдущем этапе, любой узел, в любой момент времени должен иметь возможность забрать с любого узла нашу информацию, но в этом случае, возможна ситуация, когда на отдающем узле будет находится неактуальная на тот момент времени версия. Что же делать? Собственно, ключевое слово уже прозвучало, для обеспечения целостности нам также необходимо ввести понятие "версии" нашей информации, ее "мгновенного снимка" перед каждым изменением. Таким образом, мы получим возможность контроля актуальности нашей информации на каждом из узлов, а в качестве бонуса - еще и возможность отката информации к предыдущей версии в случае, если эта версия еще имеется хотя бы на одном из узлов. Более того, нам даже не нужно выдумывать механизмы синхронизации версий между узлами, они попросту не нужны. В самом деле, ведь если на узле А хранилась информация версии N, которая по каким-то причинам оказалась потеряна, а на узле B (с которого узел А пытается теперь получить информацию, чтобы продолжить ее обработку) хранятся все версии, до N+M включительно, то узел B просто обязан отдать информацию версии N, т.к. именно ее ожидает получить узел А и именно она необходима ему для корректного возобновления обработки. А вот когда узел А будет готов принять обновленную версию от узла В (а возможно даже осуществить слияние двух версий для полного экстаза всей системы), вот тогда он сам и спросит узел В, какие версии на нем есть и сам договорится с ним о способе их слияния в единое целое, если это необходимо... И таки-это вам тоже ничего не напоминает? Ведь это - системы контроля версий в чистом виде. А с учетом предыдущих допущений - децентрализованные системы контроля версий ;)

Уже интересно, что получится у нас в итоге? :) Ну тогда давайте по-быстрому разберемся с конфиденциальностью и плавно перейдем к итогам наших фантазий. В реальном мире труъ-конфиденциальность обеспечивается посредством обратимого преобразования информации в весьма энтропийный вид, с возможностью обратного преобразования на основе обладания дополнительной, ключевой информацией. Криптографией, короче :) Но мы ведь говорим об абсолютной безопасности? А коль скоро мы отдали нашу абсолютную безопасность на откуп криптографии, то теперь мы обязаны обеспечить абсолютную безопасность для ее ключей, которые, на минуточку, тоже являются информацией. В итоге, мы попадаем в рекурсию, выйти из которой мы можем лишь забыв об абсолютной безопасности и остановившись на некотором ее пороге. Но нас подобный вариант не устраивает, мы хотим достичь абсолютной безопасности и никакой другой. Что же делать? Выход есть, мы можем признать свойство конфиденциальности нашей информации ничтожным, не значимым для нас. Нет, мы не будем переписывать теорию информации, мы просто объявим нашу информацию общедоступной для всех желающих. Совсем для всех. Без ограничений и оговорок. Мы сделаем нашу информацию свободной. Как можно создать угрозу конфиденциальности информации, если она доступа любому желающему? Никак. Угроза побеждена :)

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

И, напоследок, еще пара мыслей. Во-первых, плюньте в глаз не верьте тому, кто скажет, что выше мной описывался opensource-подход, где в качестве узлов графа выступают машины разработчиков с клонами git и mercurial репозиториев, а в качестве информации - исходники свободного ПО. Не-не-не, ничего общего у opensource с абсолютно безопасной информацией нет и быть не может. Вам показалось. На суде я буду все отрицать, если что :) Во-вторых, забавный факт: хакеры (те самые олдскульные хакеры, выдержки из манифестов которых приведены в эпиграфе, а не та школота, о которой сейчас пишут все, кому не лень) боролись именно за свободное распространение информации. Именно с их подачи и легкой руки сформировались принципы P2P, выросшие из Gnutella и KaZaA, именно благодаря им мы сегодня имеем файлообменные сети, удалить контент из которых не в состоянии даже сильнейшие мира сего (вспоминаем викиликс, к примеру) и именно хакером, олдскульным по самые гланды, была разработана DVCS Git, которая работает в точности по описанным мной принципам (но к opensource абсолютно безопасная информация не имеет ни малейшего отношения, нет-нет :)). Получается, что те хакеры боролись (и продолжают бороться) ни за что иное, как за абсолютную безопасность информации, а не за то, что вы думали вплоть до этого момента...

До новых встреч ;)

P.S: Обсуждение данной заметки проходит на RSDN, усе туда (если есть что сказать, конечно).