Содержание статьи
Ищем критичное в коде
В докладе летней Offzone я рассказывал, как мы используем движок и правила semgrep для парсинга кода сервисов и извлечения оттуда важных для нас объектов. Оставлю технические подробности парсинга в стороне, напомню только основную идею.
Если коротко, данные клиентов мы бережем как зеницу ока и хотели бы следить за тем, в каких микросервисах нашего продукта живут имена, адреса, телефоны, паспортные данные, финансовая информация, логины, пароли и другие авторизационные данные. Это позволит сфокусировать именно на них наши ИБ‑процессы, то есть выбрать те двадцать процентов сервисов, повышенное внимание к которым принесет нам восемьдесят процентов пользы.
Представим типичную ситуацию: с интернетом наш продукт связан через некоторый API gateway, все, что туда отдается по определенным роутам, мы можем найти в Swagger-файле, лежащем в коде этого гейтвея. Внутри между собой сервисы общаются по GRPC, и все их внешние методы лежат в proto-файлах. Сервисы, которые что‑то пишут в базу Postgres, хранят SQL-схемы в папке миграций. И чтобы знать, что где содержится, нам нужно уметь парсить Swagger, proto и схемы таблиц в каком‑то единообразном виде.
Если, предположим, у нас добавилось новое поле «СНИЛС» в объекте пользователя, оно добавится в Swagger на гейтвее, и в proto-контракте, и в схеме базы сервиса владельца пользовательских данных. Мы, сравнив два состояния на сегодня и на вчера, увидим на дифе это новое поле.
Итак, теперь мы умеем вынимать из кода сервисов Swagger и Protobuf, а сравнив состояния сервисов за вчера и за сегодня, знаем, какие поля поменялись.
Скоринг на минималках
Опытный аппсек‑инженер может сразу заметить, что в большом продукте ежедневно происходит огромное количество изменений в сервисах. Даже если мы будем следить только за изменениями во внешних контрактах (proto, QraphQL, сваггеры и схемы БД), нас все равно может завалить десятками сообщений об этих изменениях. Нужно как‑то фильтровать поток.
Мы представляем себе архитектуру нашего продукта и знаем хотя бы на интуитивном уровне, какие данные внутри него нам нужно беречь. Попробуем составить базовый набор ключевых слов, чтобы все поля в наших контрактах и сами содержащие их контракты окрашивались как критичные, а остальные — нет. Создадим базовый набор правил, которые разметят поля в контрактах по критичным категориям.
Теперь некоторые поля наших объектов обрели уровень критичности и тег, определяющий тип данных.
Прекрасно, теперь мы можем по уже собранным схемам данных понять, где у нас много критичной информации и с какими сервисами нужно познакомиться поближе, а какие можно пока оставить в покое.
Также в потоке изменений мы можем реагировать только там, где в схемах добавились или поменялись критичные поля. Зачем нам знать, что у пользователя появилось поле «Любимый фильм»? А вот если у него добавилось поле для ввода ИНН или номера паспорта — неплохо бы обратить на это внимание.
Подключаем железные мозги
С базовыми правилами мы разобрались, но остается ощущение, что мы не уследим, если где‑нибудь в нашем продукте появится новый тип данных, для которого мы не придумали правила заранее. Уже сейчас в примерах правил мы видим, что неплохо бы было разметить и СНИЛС, и email, а в базовых правилах их нет.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее