SkillGridИзучай computer science на практике

Когда что-то уже пошло не так

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

17 мин · 55 XP

Всё до сих пор было про предотвращение. Этот урок про вторую половину, которая и отличает интерес к безопасности от работы в безопасности: что происходит между моментом, когда что-то пошло не так, и моментом, когда всё закончилось. Это урок скорее про процесс, чем про технику, и именно процесс чаще всего отказывает под давлением, потому что правильное действие часто ощущается наименее решительным. Разбор — та часть процесса, которая делает следующий инцидент дешевле, и работает он только если люди говорят правду. Поиск виноватых и правда прямо конкурируют: первый вопрос расследования, ищущего виновного, — станет ли кто-нибудь после этого делиться информацией. Замена поиску виноватых — не размытость формулировок, а другой вопрос. Вместо «кто выполнил неверную команду» спроси, что сделало неверную команду похожей на верную и что сделало бы неверный исход невозможным, а не просто нежелательным. Пункт «быть внимательнее» — не пункт плана. Пункт «скрипт деплоя теперь отказывается работать с продом без явного флага подтверждения» — пункт, потому что он не зависит от того, вспомнит ли кто-нибудь что-нибудь. Один и тот же инцидент, описанный дважды. Только вторая версия даёт пункты плана, переживающие встречу с занятой неделей. Честное резюме: предотвращение и реагирование отказывают по-разному. Предотвращение отказывает потому, что мера, в которую ты верил, не удержала, и обычно отказывает тихо. Реагирование отказывает из-за того, что люди делают под давлением, и отказывает громко: перезагружают машину с уликами, стирают узел, потому что симптомы прекратились, восстанавливают копию, снятую после начала вторжения, или пишут отчёт, после которого следующий инцидент никто не станет докладывать. Неудобный вывод: исход инцидента определяется не столько изощрённостью атакующего, сколько тем, было ли в организации записано и отработано, что она будет делать.

EventLogs and alertsResponderSystemsunusual login at 03:14 from a new countrydetection only happens if someone is watchingalert, qualifies as an incidentcontain first, do not rebootpreserve memory and disk before cleanuproot cause: a valid credential, no exploiteradicate, then restore from a known-good statewhat to watch for next time

Первая и самая трудная стадия — заметить. Событие — это всё наблюдаемое; оповещение — событие, которое кто-то решил считать достойным внимания; инцидент — оповещение, которое кто-то решил считать настоящим. Каждое из этих превращений может не состояться. Логи, которые никто не смотрит, — украшение. Оповещения, срабатывающие четыре тысячи раз в день, приучают всех их игнорировать, и это хуже, чем не иметь оповещений вообще, потому что заодно исчезает предположение, что кто-то следит. Практический вывод: способность к обнаружению — это не количество инструментов, а количество сигналов, на которые человек действительно посмотрит. Всё, что идёт дальше в этом уроке, недоступно организации, не решившей эту стадию, потому что нельзя локализовать то, чего не заметил. Приблизительная отраслевая картина того, сколько утечки остаются незамеченными. Разброс между организациями куда больше разброса между годами. Оповещение полезно, когда в нём есть три вещи: описание того, что наблюдалось, достаточно контекста, чтобы это оценить, и определённое действие. Оповещение, говорящее лишь, что произошло что-то аномальное, хуже молчания: оно тратит внимание и ничего не возвращает. Именно базовое поведение делает контекст возможным. Нельзя сказать, что вход в 03:14 необычен, если не знаешь, как выглядит обычный час для этого аккаунта, а значит полезная работа начинается задолго до инцидента, когда кто-то решает, что записывать.

$ sudo dd if=/dev/sda1 of=/mnt/evidence/disk.img bs=4M conv=noerror,sync
$ sha256sum /mnt/evidence/disk.img | tee /mnt/evidence/disk.img.sha256

$ date -u +"%Y-%m-%dT%H:%M:%SZ" | tee -a /mnt/evidence/chain-of-custody.txt

# every later look works on a copy, never on the original
$ cp /mnt/evidence/disk.img /tmp/work.imgСнятие образа диска и начало цепочки сохранности. Хеш здесь и есть суть: именно он позволяет потом утверждать, что копию не изменяли.

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

Локализация останавливает ущерб. Устранение убирает причину. Восстановление возвращает сервис. Это три разные цели, и их часто выполняют как одну, с чего и начинаются неприятности. Инстинкт под давлением — перезагрузить, переустановить и восстановить, потому что так симптомы исчезают. Пересборка, начатая до того, как ты понял, как атакующий вошёл, даёт чистую машину и вечную загадку, а если путь входа не закрыт, следующая сборка будет скомпрометирована тем же способом. Порядок важен, и важна готовность подержать скомпрометированную машину изолированной и работающей, вместо того чтобы немедленно её стирать. Три стадии и действие, которое каждой разрешено. Обрати внимание: сохранение улик происходит внутри локализации, до того как устранение сотрёт машину. Восстановление из резервной копии — прекрасный ответ на отказ железа и опасный ответ на вторжение. Решает вопрос не качество копии, а то, когда пришёл атакующий относительно момента снятия копии. Если копия сделана после начала вторжения, механизм закрепления, который он установил, может остаться внутри, и ты восстановишь компрометацию вместе с данными. Именно поэтому локализация идёт до восстановления: нужно достаточно понимать хронологию, чтобы выбрать точку восстановления раньше первого признака входа, и нужно закрыть путь входа, прежде чем что-либо возвращать в работу. У улик есть срок жизни, и он истекает в порядке, обратном тому, что обычно ожидают. Всё, что в памяти, в работающем процессе, в сетевом соединении или во временном файле, исчезает в момент потери питания или перезагрузки. Всё, что на диске, перезагрузку переживает, но не переживает переустановку. Всё, что уже отправлено в центральное хранилище логов, переживает и то и другое, поэтому централизованное логирование — это форензическая мера, а не просто эксплуатационное удобство. Первые действия реагирования поэтому почти механические: зафиксировать текущее время, снять то, что летуче, пока оно не исчезло, и только потом решать, что делать с машиной. Правило, которое отсюда следует, короткое, и именно его чаще всего нарушают в первые пять минут: не перезагружай. Перезагрузка очищает память, рвёт сетевые соединения, останавливает работающие процессы и затирает часть нужного тебе состояния, а атакующий мог оставить запись в автозапуске, которую перезагрузка и активирует. Если машину нужно изолировать, выдёргивай сеть, а не питание. Это неинтуитивно ровно потому, что выключить и включить — правильный ответ почти на любую другую проблему с компьютером.

Практика

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

    Подсказки
    • Спроси, что каждое действие делает с уликами. Всё, что очищает память или затирает состояние, уничтожает единственную запись о том, как атакующий вошёл.
    • Переустановка выглядит решительно, но отвечает не на тот вопрос. Ты уже знаешь, что сервис сломан; ты не знаешь почему.
  2. Расставь стадии реагирования на инцидент по порядку.

    1. 1устранение: закрыть путь входа и убрать всё, что оставил после себя атакующий
    2. 2обнаружение: что-то наблюдается, и кто-то решает, что это настоящий инцидент
    3. 3локализация: изолировать затронутые системы и отозвать использованные учётные данные
    4. 4сохранение: снять память и текущее состояние до того, как что-либо его изменит
    5. 5разбор: записать, что произошло и что поймало бы это раньше
    6. 6восстановление: вернуть сервис из точки, которая заведомо предшествует вторжению
    Подсказки
    • Самый первый шаг вообще не технический: кто-то должен заметить, и кому-то должны сообщить.
    • Остановка распространения идёт до устранения причины, а обе — до любой пересборки, потому что слишком рано начатая пересборка выбрасывает ответ.
  3. Сопоставь каждый вид улик с тем, сколько он живёт и что его уничтожает.

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

Вопросы по этому уроку

Это бесплатно?

Да. Первый уровень каждого предмета бесплатный и не требует аккаунта. Дальше уровни и старшие грейды платные — именно это позволяет проекту существовать.

На какой возраст рассчитано?

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

Нужно ли уже уметь программировать?

Нет. Логика, физика и сети начинаются с нуля. Код ты пишешь в разделе языков — и он тоже начинается с самого начала.

Нужно что-то устанавливать?

Нет. Всё работает в браузере: теория, практика и интерактивные симуляции. Скачивать нечего и настраивать нечего.

Сколько времени занимает один предмет?

Урок — от 10 до 15 минут. Грейд «джун» это примерно 12–20 уроков, то есть несколько недель регулярных занятий, а не один вечер.

Обязательно идти по порядку?

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