Проблемы доверия. Как разделить ключ между людьми и застраховаться от его потери

Содержание статьи

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

Секреты бывают разными

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

  • Никому не нужные. Поднял виртуальную машину, что-то потестировал и забыл. Максимум, что можно утащить, — расписание полива растений в офисе из скрипта одного админа.
  • Потенциально значимые. Тестовая БД, какой-то второстепенный сервер или что-то подобное. Несанкционированный доступ сам по себе не принесет убытков, но может быть «трамплином» для более глубокого проникновения в инфраструктуру компании.
  • Значимые. Боевая БД, важный сервер логов и другие ключевые системы. Если злоумышленник проникнет сюда, то сможет либо выкрасть ценную информацию, либо значительно нарушить работу компании.
  • Офигенно критичные. Что может быть более неприятным, чем скомпрометировать важный пароль? Правильно — продолбать всю связку паролей целиком. Например, базу Keepass вместе с ключом для доступа. Если злоумышленник до нее доберется, то финансовый ущерб компании может быть невосполнимым.

Мы поговорим о последней категории, которую нужно защищать не только от атак извне, но и от внутренних угроз.

У всех есть своя цена

К сожалению, не все люди честные и правильные. Видел новости про утекшие базы данных, которые сливали сотрудники? А это, между прочим, вполне себе статья УК. Давай заглянем в голову к таким сотрудникам.

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

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

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

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

Красная кнопка для генерала

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

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

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

Оптимальная защита

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

Сейф и бумажки

Допустим, мы защищаем условный суперпривилегированный секрет, который может использоваться только в исключительных случаях. Например, мобильные телефоны, имеющие доступ к корпоративной почте и ресурсам, управляются с помощью системы MDM (Mobile device management). Мы не хотим, чтобы кто-то один из подразделения ИБ мог получить доступ к данным с телефона сотрудника. При этом нам нужно иметь возможность дистанционно уничтожить содержимое телефона или узнать его текущие координаты GPS, если устройство украдут. Соответственно, нам нужно решение, которое позволит разделить ответственность между несколькими людьми.

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

Матрешка с паролями

К черту бумажки и картонные папочки. Будем современными. Давай пойдем самым простым путем и сделаем архив 7-Zip, зашифрованный криптостойким AES-256. Мы не хотим, чтобы один сотрудник мог единолично получить доступ к секрету, поэтому мы будем конструировать матрешку из вложенных архивов, где каждый слой закрывает своим паролем новый человек. Например, руководитель ИБ и технический директор.

На первый взгляд, все работает отлично. Надежность защиты от компрометации быстро растет пропорционально числу людей. Например, если вероятность утечки пароля от одного человека — 0,05, то для шести человек уже 0,056 = 1,5625 × 10–8.

Считаем по формуле
Считаем по формуле

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

Разбиваем на фрагменты

На самом деле есть хорошее решение.

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

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

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

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Читать новость в источнике Xakep

0