Секреты должны оставаться секретами: как работает Secret Scanner в Yandex Cloud
Привет! Меня зовут Лиза Шеленговская, я разработчик в подразделении Yandex Cloud Security. Задача нашей команды — создавать сервисы безопасности в облаке, а также следить за безопасностью самого облака. Конечно, мы занимаемся и вопросами управления уязвимостями. Одна из самых частых угроз в облаке и в on-premise — утёкшие статические секреты. В этой статье я расскажу о проблеме утечек чувствительных данных в публичные репозитории кода и о сервисе Secret Scanner, который мы создали, чтобы обезопасить пользователей. С его помощью мы ищем секреты, оказавшиеся в открытом доступе.
Каков масштаб проблемы
Один из стандартных для разработчиков инструментов — платформы, которые используются для публикации исходного кода. Но работать из кода с секретной информацией непросто, ведь публиковать её в открытом виде рядом с кодом нельзя.
Статистика говорит нам, что более 61% утечек происходят из-за попадания в публичный доступ учётных данных (секретов).
В недавнем отчёте Google Cloud по Security утечка статических учётных данных тоже в топе списка проблем пользователей облака: «Не соответствующие требованиям безопасности идентификация, управление правами доступа и ключами, скомпрометированные учётные данные — проблемы безопасности № 1, с которыми сталкиваются клиенты облачных сервисов». При этом часто, узнав об утечке секретов, пользователи ничего не предпринимают, и проекты остаются уязвимыми.
Как утекают секреты
На скрине ниже вы видите код, который был найден в одном из публичных репозиториев на GitHub. Здесь разработчик создаёт телеграм-бота, который взаимодействует с API Yandex Translate, и использует авторизацию через IAM-токен, находящийся в этом же файле в открытом доступе.
К счастью, IAM-токен — короткоживущий секрет, и окно возможностей злоумышленника ограничено несколькими часами с момента публикации. Гораздо более серьёзные последствия ждут пользователей, которые публикуют секретную информацию в файлах конфигурации и в файлах состояния Terraform (terraform.tfstate), содержащих, как правило, долгоживущие статические секреты.
Пример кода с секретами из GitHub-репозитория
Риски для пользователей в этом случае понятны: нарушение конфиденциальности, целостности данных, а также репутационные риски. Поэтому такие данные необходимо держать в секрете. Однако их всё-таки оставляют в публичных репозиториях, что и приводит к утечкам.
Подключение к программе от GitHub
Если в коде имеются API-ключи, ключи шифрования, пароли к базам данных, их можно обнаружить, воспользовавшись инструментами для поиска ключевых слов вроде grep.
Искать, например, можно по словам key, secret, password или aws. При таком подходе поиск идёт по идентификаторам вроде имён переменных, которые используются для хранения интересующих нас данных. Аналогично — можно пользоваться поиском по текстам для нахождения связанных с секретными данными имён файлов и служебных данных, характерных для файлов определённого формата. Например, можно поискать по строке -----BEGIN RSA PRIVATE KEY-----.
Сканирование кода с использованием поиска по шаблону и энтропийного анализа данных — хорошая стратегия для сведения к минимуму рисков утечек секретных данных. Делается это до попадания кода в репозиторий.
В 2022 году GitHub сделал общедоступной программу сканирования секретов, до этого она была доступна только корпоративным пользователям с платной подпиской GitHub Advanced Security. Использование этого сервиса помогает разработчикам повысить безопасность проектов. GitHub проверяет репозитории на наличие конфиденциальных данных и сообщает пользователю об утечке. Сейчас GitHub сканирует репозитории на наличие более 200 форматов токенов (включая API-ключи, токены аутентификации, токены доступа, сертификаты управления, учётные данные, закрытые и секретные ключи и многое другое).
Одной из первых задач, которую мне поручили в Yandex Cloud ещё во время стажировки, стало создание сервиса валидации секретов Secret Scanner и его подключение к программе сканирования секретов от GitHub. Сервис нужен, чтобы в общей программе GitHub можно было автоматически обнаруживать секреты, специфичные для Yandex Cloud. Архитектура Secret Scanner полностью cloud-native. Для работы используются собственные сервисы облака: API Gateway, Cloud Functions (Serverless), YMQ, YDB.
Как работает сканирование секретов
GitHub сканирует репозитории с помощью регулярных выражений и дополнительной кодовой валидации на наличие известных форматов секретов. Такое сканирование выполняется по умолчанию в публичных репозиториях, но может быть включено и в приватных, если вы беспокоитесь о сохранности данных. Включить его должен администратор репозитория или владелец организации.
Когда в публичном репозитории находится совпадение с подключённым форматом секрета, запрос о дальнейшей проверке на принадлежность секрета облаку отправляется в наш сервис дополнительной проверки Secret Scanner. Если в приватном репозитории, настроенном для сканирования секретов, обнаруживается такое совпадение, администраторы репозитория и коммиттер получают предупреждение и могут просматривать результаты сканирования секретов и управлять ими на GitHub.
Процесс сканирования секретов в GitHub
К возможным вариантам действий, которые предлагает GitHub после того, как найдёт секрет, относятся отзыв секрета и уведомление на почту. Сервис Secret Scanner также уведомляет пользователей, если секреты утекли. Мы это делаем с помощью события в Audit Trails и email-уведомления. Инвалидацию секрета мы оставляем за пользователем, чтобы не нарушить работу сервисов клиента.
Пример события в Audit Trails
Тело сообщения, отправленного GitHub — это массив JSON, содержащий один или несколько объектов со следующей информацией:
значение секрета;
тип секрета;
общедоступный URL-адрес, по которому было найдено совпадение.
Пример email-уведомления
В email-уведомлении мы дублируем информацию и советуем, что можно сделать, чтобы защитить аккаунт. Кроме того, мы написали подробную инструкцию по обработке секретов, попавших в открытый доступ. Из неё можно узнать о том, как отозвать и перевыпустить секреты, а также, как создать безопасную облачную инфраструктуру.
Подключение к поисковому индексу Яндекса и GitLab Secret Detection
Также мы подключили Secret Scanner к поисковому индексу Яндекса. Это была важная интеграция, потому что поисковый индекс Яндекса — один из самых больших в мире. Такая интеграция помогла нам понять, что большая часть пользователей публикует секретную информацию в блоках, которые описывают работу их приложений.
Мы подключились и к программе GitLab Secret Detection, теперь пользователи могут искать наши секреты в своих репозиториях. Ниже описываем, как это сделать в GitLab.
Включить Secret Detection:
Menu → Projects, выбрать проект
Security & Compliance → Configuration
В разделе Secret Detection выбрать Configure with a merge request
Результаты работы Secret Scanner в Yandex Cloud
К нашему сервису уже подключены следующие типы секретов: API Key, IAM Cookie, IAM Token, Access Secret, OAuth-token и SmartCaptcha Server Key.
За 9 месяцев работы удалось найти 8285 валидных секретов.
Статистика сервиса Secret Scanner с сентября 2022
Более подробно о сервисе Secret Scanner я рассказывала в докладе на Yandex Scale.
Что будет дальше
Сейчас я вместе с командой продолжаю развивать сервис Secret Scanner, с работы над которым начинала стажировку. Мы собираемся добавить в сервис валидацию всех типов секретов Yandex Cloud.
Кроме того, планируем подключить другие платформы и сервисы облака. Также рассматриваем расширение поиска, которое даст возможность искать другие чувствительные данные. Планируем интеграцию сервиса с инструментами open source.
Где хранить секреты
Для того, чтобы создавать и безопасно хранить секреты в инфраструктуре Yandex Cloud, мы создали сервис Yandex Lockbox. Все секреты в Lockbox хранятся в зашифрованном виде и реплицируются в трёх зонах доступности. Также сервис позволяет управлять уровнями доступа с помощью ролей.