Защита систем. Чему «Звездные войны» учат инженера ПО — страница 29 из 68

Управление метаданными

Метаданные, включая имена каталогов и файлов, могут быть защищены с помощью определенного уровня папок. Создайте каталог private, содержащий каталог Junelayoffs, и убедитесь, что только авторизованные участники могут читать содержимое private, а затем примените рекурсию. Это работает для локальных компьютеров, облачных хранилищ, таких как Dropbox, или веб-сайтов, показывающих структуру каталогов.

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

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

Если вам подходит образ мышления «сбитый с толку представитель», то ваши поисковые сервисы можно легко запутать. Если нет, то это может быть хорошим примером, который поможет вам понять идею. По мере усложнения файловых систем и добавления функций журналирования защита метаданных становится практически невозможной. Предположительно, сложности защиты файлов в NTFS (и WinFS) были одним из оснований для создания Microsoft BitLocker в качестве продукта для полного шифрования диска. (Я повторяю это утверждение не потому, что у меня есть доказательства, а потому, что нахожу его правдоподобным.)

Защищая ваш процесс

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

Хорошо устроенные журналы и обработка ошибок

Секреты часто попадают в сообщения об ошибках и журналы. Это лучше, чем показывать их конечному пользователю, и когда вы помещаете секреты в журналы, вы должны учитывать, кто какие журналы может видеть и кто какой инструмент анализа журналов использует. В дополнение к секретам в журналы часто попадают личные данные, и, таким образом, эти журналы нуждаются в защите в соответствии с законами о конфиденциальности. Эти личные данные могут находиться в неожиданных местах, например, имя машины может оказаться «iPhone Тима Кука» или «Wi-Fi Тима Кука».

Чтобы избежать размещения конфиденциальных данных в слишком большом количестве мест, существует подход, называемый токенизацией: замена личных или конфиденциальных данных токеном. Например, вы можете определить GUID или другую длинную строку для пользователя, а затем включить этот GUID в каноническое сообщение журнала, чтобы ваш обслуживающий персонал мог найти его. Это подход к токенизации с ключом поиска. Вы также можете использовать подход шифрования. Если вы шифруете данные, то раскрытие информации о ключе может задним числом сделать данные доступными для любого, у кого есть копия журналов. Кроме того, если шифруемые данные невелики по размеру (скажем, SSN – номер социального страхования), то злоумышленник со списком SSN может зашифровать их все и посмотреть, совпадет ли какой-либо из них.

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

Тщательное обращение с секретами

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

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

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

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

Как правило, рекомендуется избавиться от секретов, которые вам больше не нужны, и вы не удивитесь, узнав, что надежно удалить секрет сложно. Компиляторы и среды выполнения часто оптимизируют код следующим образом:

for char in array[0..sizeof(secret)]

{ array[char]=0;

char++;}

free (array);

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

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

Криптография

Шифрование – лучший способ защиты конфиденциальности. В современной криптографии доступ к открытому тексту обусловлен наличием как шифротекста, так и ключа. Шифротекст на диске? Безопасно. Шифротекст (криптограмма) в линии передачи? Безопасно. Шифротекст, установленный как произведение искусства в штаб-квартире ЦРУ? Безопасно. (Правда! Скульптура «Криптос» простояла нерасшифрованной более 30 лет.)

Зашифрованный текст является результатом функции шифрования, e, которой передается ключ и сообщение в виде открытого текста, m. Обычно это записывается как c = ek(p), потому что криптографы – математики, а не программисты, а я только что нажил себе тысячу врагов. Когда функция шифрования симметрична, то существует функция d (расшифровка), которая принимает зашифрованный текст, тот же ключ k, и выдает сообщение: p = dk(c). Существуют и другие криптографические системы, в которых получатели имеют разные ключи, что очень круто с математической точки зрения и невероятно полезно, когда у вас более чем несколько участников, потому что каждый участник может иметь небольшой набор ключей и общаться так, что никто другой не может подслушать. (Если у нас есть 100 человек, использующих симметричную систему, и у каждого из них есть k, каждый из них может расшифровать сообщения друг друга.)

Часто мы анализируем систему, притворяясь, что цель атакующего состоит в том, чтобы определить k. (Обычно это не цель атакующего, но это отличная ступенька к реальным целям.) Кроме того, в этом разделе давайте сосредоточимся на самом ключе, а не на том, как Алиса и Боб согласовывают его. Смотрите главу 7 для получения дополнительной информации об угадывании ключей.

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

Существует несколько удивительно интересных сценариев использования, которые могут быть реализованы с помощью криптографических инструментов. Есть схемы, называемые прямой секретностью (forward secrecy), которые позволяют шифровать данные таким образом, что даже если кто-то украдет долгосрочный ключ, который вы используете, он не сможет расшифровать сообщения. Некоторые оптимисты настолько оптимистичны, что называют это совершенной прямой секретностью (perfect forward secrecy). Существуют и другие схемы, такие как совместное использование секретов, которые позволяют разделить секрет на m долей, из которых требуется любое n для восстановления секрета. Например, 3 из 5. В этом случае n будет равно 3, m будет равно 5, и их часто называют n-из-m.

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

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