CIS benchmarks and baselines
CIS Benchmarks дают проверенную базу укрепления, чтобы её не изобретать. Зрелая работа — это цикл после: зафиксировать базу как код, а затем находить и закрывать дрейф конфигурации, пока атакующий не нашёл брешь.
Пост-мортем на три страницы, а корневая причина — одна строка: PermitRootLogin yes. Полгода назад кто-то разбирал зависший деплой, зашёл по SSH под root, переключил этот флаг и не вернул обратно. В образе, который вы выкатили, стояло no. На работающем хосте — нет. Ни CVE, ни цепочки эксплойтов — просто настройка, уехавшая от базы, которую вы считали действующей, на машине, которую никто не перепроверял. Атакующий не взломал вход. Он вошёл. Вот почему укрепление — не разовая задача: база, которую вы задали и ни разу не сверяли, — это база, которую вы уже потеряли.
К концу урока вы поймёте, почему стартовать укрепление надо с CIS Benchmark, как зафиксировать эту базу так, чтобы она пережила столкновение с продакшеном, и как обнаруживать дрейф, который тихо открывает обратно закрытые вами дыры.
Что такое CIS Benchmark на самом деле
Вам не нужно с нуля изобретать ответ на вопрос «как выглядит укреплённый хост Ubuntu» — это месяцы исследований на каждую платформу, и вы что-нибудь упустите. CIS Benchmark — это уже готовый ответ: разработанное по консенсусу, предписывающее руководство по конфигурации для конкретной платформы — дистрибутива Linux, Windows Server, Kubernetes, PostgreSQL, nginx, аккаунта AWS, демона Docker. Их больше сотни, каждый поддерживается сообществом практиков и пересматривается под новые версии платформ и новые техники атак. Там, где общее руководство вроде NIST SP 800-123 описывает принципы укрепления сервера (минимизировать поверхность атаки, работать с наименьшими привилегиями, патчить, логировать), CIS Benchmark даёт точные настройки, которые реализуют эти принципы на стоящей перед вами машине — вплоть до файла, строки и ожидаемого значения.
Две структурные черты важны для того, как им пользоваться. Во-первых, рекомендации делятся на Level 1 (практичное укрепление, которое не должно ломать нормальную работу — здравый дефолт для большинства парков) и Level 2 (глубокая эшелонированная защита для сред высокой безопасности, где жертвуют частью функциональности или удобства). Во-вторых, каждая рекомендация помечена Automated или Manual: у Automated есть машинно-проверяемая процедура аудита и исправления, Manual требует человеческого суждения. Это разделение — самое важное, что зрелый инженер считывает с benchmark, потому что оно прямо говорит, какие контроли можно обеспечивать непрерывно, а какие требуют процесса.
| Понятие benchmark | Что означает | Зрелое прочтение |
|---|---|---|
| Level 1 | Практичное укрепление, не должно ломать работу | База для всего парка; обеспечивать по умолчанию |
| Level 2 | Эшелонированная защита, может жертвовать функцией | Только для ценных хостов; сначала проверить на поломки |
| Automated | Машинно-проверяемый аудит + исправление | Кодировать; проверять каждый хост, каждый день |
| Manual | Требует человеческого суждения для оценки | За ним стоит процесс/ревью, а не правило сканера |
| Profile | Набор рекомендаций, под которым вы подписались | Ваша база = benchmark минус задокументированные исключения |
От benchmark к вашей базе
Benchmark — это не база. Benchmark — это меню; ваша конфигурационная база — это блюдо, под которым вы реально подписались: конкретный набор рекомендаций выбранного вами уровня, минус исключения, которые ваша среда законно требует, причём каждое исключение записано с причиной и владельцем. Именно на этом различии тихо ломается большинство программ укрепления. Команда, для которой целью становится «100% соответствие CIS», натыкается на рекомендацию, ломающую их приложение — скажем, отключение модуля ядра, нужного их агенту мониторинга, — и вместо того, чтобы записать обоснованное исключение, либо выкатывает сломанный хост, либо молча отключает всю проверку. Теперь база лжёт.
Зрелый ход — вывести базу один раз, осознанно. Начните с подходящего уровня (Level 1 для парка), пройдите по рекомендациям и по каждой примите явное решение: применить или исключить-с-причиной. На выходе — документ базы, в идеале машиночитаемый, где отклонение никогда не сюрприз. Почему это важно для обнаружения дрейфа — причинно: если вы не можете сказать, что такое «правильно», вы не сможете обнаружить «неправильно». Чистая база с аннотированными исключениями — это эталон, с которым сверяется каждый работающий хост. Нет эталона — нет обнаружения дрейфа, только надежда.
▸Почему это работает
Почему не целиться просто в 100%? Потому что процент соответствия — это среднее, а среднее прячет именно те контроли, что важны. Хост может набрать 96%, при этом недостающие 4% — это «вход root по SSH включён» и «аудит-логирование отключено», две настройки, которых атакующий хочет больше всего. Скоринг CIS взвешивает каждую Automated-проверку примерно одинаково, поэтому число поощряет закрытие множества мелочей вместо одной критичной. Используйте балл как грубый тренд, никогда как цель. Цель — этот конкретный набор контролей обеспечен, и каждое отклонение — записанное решение, чего один процент выразить не может.
Дрейф: как укреплённый хост сам себя раз-укрепляет
Вы укрепляете золотой образ, выкатываете его, идёте дальше. Потом приходит энтропия. Конфигурационный дрейф — это зазор, открывающийся со временем между базой, с которой хост был развёрнут, и его реальным работающим состоянием. Обычно это не злой умысел — это эксплуатация: инженер отключает контроль, чтобы разобрать инцидент в 2 часа ночи, и забывает включить обратно; обновление пакета сбрасывает конфиг к вендорскому дефолту; ручной hotfix чинит одну машину, но не остальные сорок; две команды владеют пересекающимся конфигом и каждая «исправляет» другую. Каждое изменение по отдельности разумно. В сумме — парк, где нет двух одинаковых хостов, и спроектированная вами защита существует только в образе, а не в продакшене.
Дрейф опасен именно потому, что по умолчанию невидим. Хост всё ещё работает. Приложение всё ещё обслуживает трафик. Ничто не алертит. Уехавшая настройка заявляет о себе лишь тогда, когда её найдёт атакующий — или аудитор. Поэтому работа защитника — сделать дрейф видимым: непрерывно переаудировать каждый работающий хост против базы и поднимать каждое отклонение, чтобы контроль, переключившийся с no на yes, выдал находку на следующий день, а не в пост-мортеме.
Compliance as code: замыкаем цикл
Обнаруживать дрейф вручную не масштабируется дальше горстки хостов. Устойчивый паттерн — compliance as code: выразить базу как машиночитаемые, версионируемые правила и запускать их автоматически против каждого хоста по расписанию и в деплой-конвейере. CIS поставляет свои базы в структурированном формате и даёт инструмент (CIS-CAT), а открытая экосистема кодирует benchmarks как OpenSCAP/SCAP-контент или как политику в инструментах вроде Chef InSpec, Ansible или OPA. Форма одинакова независимо от инструмента: контроль — это правило с аудитом (как прочитать текущее значение) и часто исправлением (как выставить правильное), закоммиченное в репозиторий и запускаемое CI.
Кодирование базы как кода даёт вам четыре вещи разом. База становится ревьюируемой (изменение контроля проходит через pull request, а не через SSH-сессию в 2 ночи), версионируемой (вы можете доказать, что было «правильным» на любую дату — это любят аудиторы и требуют инциденты), единообразно обеспеченной (одни и те же правила бегут на хосте 1 и хосте 41, так что дрейф между хостами ловится) и быстро обнаруживаемой (плановый скан превращает полугодовую тихую регрессию в утреннюю находку). Оставшееся зрелое решение — что делать при отклонении: только алерт для контролей, где авто-починка могла бы сломать рабочую нагрузку (пусть согласует человек), против авто-исправления для контролей, где правильное значение однозначно и безопасно для обеспечения — сводя хост обратно к эталону, не дожидаясь тикета.
Плановый скан compliance-as-code сообщает, что `PermitRootLogin` уехал с `no` на `yes` на 1 из 40 продакшен-хостов. Какой правильный дизайн ответа?
В чём разница между CIS Benchmark и вашей конфигурационной базой?
Хост набирает 96% на CIS-скане. Почему зрелый инженер всё равно может счесть это серьёзной проблемой?
Упорядочь жизненный цикл укрепления-и-дрейфа от старта к устойчивому состоянию:
- 1 Выбрать CIS Benchmark + уровень для платформы
- 2 Вывести базу: по каждому контролю применить или исключить-с-причиной
- 3 Закодировать базу как версионируемый compliance-as-code
- 4 Непрерывно аудировать каждый работающий хост против базы
- 5 Исправить (или алерт + запись) на каждом обнаруженном отклонении
- 01Объясните разницу между CIS Benchmark, конфигурационной базой и конфигурационным дрейфом — и почему все три нужны, чтобы реально оставаться укреплённым.
- 02Что такое «compliance as code» и как решать между алертом и авто-исправлением, когда скан обнаружил дрейф?
CIS Benchmarks — консенсусные, предписывающие руководства по укреплению, их больше сотни, по одному на платформу, дающие точные настройки для старта, вместо того чтобы изобретать «укреплённое» самостоятельно, тогда как NIST SP 800-123 даёт лишь принципы. С каждого benchmark считывайте две вещи: Level 1 против Level 2 (дефолт парка против эшелонированной защиты для высокой безопасности) и Automated против Manual (что можно обеспечивать непрерывно против того, что требует процесса). Но benchmark — не база: ваша конфигурационная база — это конкретный набор, под которым вы подписались, минус исключения, записанные с причиной и владельцем, и этот аннотированный исключениями эталон — единственное, против чего можно мерить дрейф; нет эталона — нет обнаружения дрейфа. Конфигурационный дрейф — тихий, обыденный зазор, открывающийся между этой базой и работающим состоянием хоста, невидимый, пока его не найдёт атакующий или аудитор. Фикс — это цикл, а не разовый проход укрепления: закодируйте базу как compliance-as-code (ревьюируемую, версионируемую, единообразную, быструю), непрерывно аудируйте каждый работающий хост и на каждом отклонении либо авто-исправляйте однозначные контроли, либо алертите человека для тех, что могут сломать нагрузку. Теперь, видя, как выкатывают укреплённый образ, ваш следующий вопрос: что перепроверит работающий хост завтра — или мы просто укрепили образ и сочли дело сделанным?
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.