Управление метаданными
Метаданные, включая имена каталогов и файлов, могут быть защищены с помощью определенного уровня папок. Создайте каталог 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.
Существуют атаки, в которых то, что вы знаете, является зашифрованным текстом, и вы хотите восстановить ключ. Есть также важные атаки, когда то, что вы знаете, является открытым текстом, и вы хотите знать, какой зашифрованный текст он породит. Существует множество вариантов атак с выбором открытого текста. Если вы имеете дело с такими терминами, как известный открытый текст и выбранный открытый текст, вам вполне может понадобиться книга по криптографии.
Вам она также понадобится, если вы когда-нибудь попытаетесь написать криптографический код самостоятельно или использовать криптографическую функцию причудливым или инновационным способом. Код неумолим, сложности реализации высоки, и нет причин не позволять кому-то другому делать эту тяжелую работу.