Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Управление секретами в Avito при помощи Hashico...

Управление секретами в Avito при помощи Hashicorp Vault

Митап на тему "Безопасность", 22-08-2018
Сергей Носков, Авито

Сергей рассказал, как они управляют секретами с помощью Hashicorp Vault и используют c Puppet/Ansible и Kubernetes. Также он поделился тем, какие шишки они набили за полтора года использования, и мыслями, как это можно исправить.

Avatar for DevOps Moscow

DevOps Moscow

August 22, 2018
Tweet

More Decks by DevOps Moscow

Other Decks in Education

Transcript

  1. План 1. Введение (напомню общие вопросы - что такое, какие

    преимущества и т.п.) 2. Краткая сводка нововведений за последний год 3. Варианты использования c Puppet и другими SCM 4. Что сейчас в Kubernetes в Avito 5. Основные боли для безопасников 6. Основные боли для разработчиков 7. Идеи как сделать лучше 2
  2. Секрет Практически любая конфиденциальная информация • логин + пароль (например,

    к БД) • API-ключ • ключ сертификата сервера (*.google.com) • ключ клиентского сертификата (партнёры, Yandex money, QIWI, ...) • ключ для подписи мобильных приложений 3
  3. Проблема курицы и яйца • чтобы получить секрет вам нужен

    другой секрет (аутентификация) • секрет для получения секрета - тоже секрет. • важность секрета для хранения секрета >= важности самого секрета? Решение: Авторизация • доверенная третья сторона решает, кому что можно и нельзя • ей не нужен доступ к секрету, но она всегда может его получить 4
  4. Hashicorp Vault • безопасное хранение и управление ключами • аутентификация

    и авторизация доступа к секретам (acl, принцип минимальных привилегий) • REST, JSON • плагины для logical и auth бекендов (+ фреймворк!) • CORS-заголовки (для GUI без посредников) • открыт встроенный GUI • нативная интеграция с Kubernetes 5
  5. Hashicorp Vault в Avito • единый Vault на всю сеть

    ◦ persistence на базе сonsul - для отказоустойчивости из коробки ◦ unseal - 3/7, безопасники и админы • тестовый vault(sandbox) для разработчиков ◦ также доступен как контейнер ◦ unseal+bootstrap при помощи “скрипта” на go 6
  6. Какие секреты сейчас храним • секреты для микросервисов Kubernetes •

    секреты для выкладки на “железные” серверы и LXC • секреты для билдов в CI/CD (Teamcity) • ключи всех сертификатов - внутренний PKI, внешние CA(GeoTrust и т.п.) • общие секреты для команд 7
  7. Puppet + Hiera: Workflow 1. Положить секрет в Vault (иерархия

    - как в hiera: /puppet/role/www/site.ssl.key) 2. Прописать префикс в манифест 3. Прописать в yaml для Hiera router 4. PR в репозиторий манифестов 5. Прогнать или дождаться прогона puppet agent (30 мин) Всё руками + секретов на самом деле немного + мощь hiera по подстановке фактов (warning: факты собираются client-side, большинству нельзя доверять) 10
  8. Как быть с SCM без мастера? Предложение: агент • при

    bootstrap-е сервера генерируется токен/approle и политика • агент по крону забирает секреты по доступному пути - каждый новый сервер требует действий в Vault - надо как-то ротировать/обновлять токен - группировка серверов(по роли, назначению, фактам) - затруднена: её надо синхронизировать с Vault 11
  9. Большой Недостаток №1 • write на любую политику автоматически означает

    полные права • политиками нельзя ограничить изменение содержимого секрета или другой политики 12
  10. Kubernetes • в Vault 0.9+ нативная поддержка Kubernetes • граница

    безопасности в kubernetes - namespace • в каждом неймспейсе своя роль • пользователь получает vault токен используя serviceaccount token (почти JWT) • свой доверенный авторитет (vault-controller) не нужен - авторизует сам kubernetes ◦ больше нет проблем с аннотациями ◦ всё равно доверяем разработчикам, когда они сообщают имя неймспейса и сервиса 13
  11. Kubernetes: правила • один сервис - один namespace • в

    каждом кластере свои секреты • в каждом неймспейсе свои секреты • у каждого сервиса свои секреты 14
  12. Kubernetes: workflow Разработчик: • разработчик узнаёт от security champion про

    Vault • подаёт заявку в security на заведение префикса • ждёт • добавляет volume и init-container в depoyment.yaml (helm chart) • commit -> deploy -> fix -> repeat 16
  13. Kubernetes: workflow Безопасник: • получает заявку • выясняет недостающие вопросы

    • создаёт политики и роли в Vault • прописывает нужные политики нужным группам • ищет, где ошибся разработчик • иногда кладёт секреты за разработчика, чтобы у того не заболело ещё больше 17
  14. Kubernetes: проблемы • очень сложный workflow для разработчика (многие не

    знают даже имя кластера) • блокировка на безопаснике: больше никто не может заводить политики из-за БН №1 • много равнозначных копий одного секрета ◦ сложно менять/ротировать ◦ нигде не учитываются 18
  15. KMS: плюсы и минусы - децентрализация хранения - вынос из

    Vault в Kubernetes (etcd) - kubernetes-only решение - сложно делить секреты между кластерами + нативная поддержка в kubernetes, включая защиту env + авторизация в Kubernetes + практически не надо поддерживать Vault + ротация ключей из коробки 20
  16. СI/CD: Teamcity • некоторые секреты нужны при деплое (миграции БД,

    оповещения в Slack, ...) • плагин от JetBrains • AppRole на каждый проект (настройки - write-only) • секрет(или его часть) попадает в параметры билда и автоматически “прячется в логах” 21
  17. СI/CD: Не Teamcity? • продумать изоляцию: ограничить область видимости секрета

    проектом/командой/... • продумать, кто авторизует доступ к секрету • исключить возможность просматривать секрет авторизующей стороны • отдельным этапом билда импортировать секрет в файлы • почистить за собой 22
  18. Сертификаты • удобно проверять сроки истечения • через Vault PKI

    backend удобно создавать CA и (пере)выпускать на нём Intermediate Level 3 сертификаты для небольших групп • сертификаты для ноды k8s - 2 минуты работы скрипта /certs/<тип>/<cn> хост /puppet/role/www/site.ssl.key k8s-pod /k8s/some-cluster/some-ns/some-service/site.ssl.key вручную 23
  19. Резюме • слишком много делается руками безопасника • слишком большой

    порог вхождения для разработчика (~4 длинных статей в wiki) • хочется делегировать, но встроенных средств нет 24
  20. Идея для доставки: master-slave секреты • это не симлинки! •

    у секрета есть source of truth - мастер секрет • менять можно только его • при доставке секрета прописываются параметры доставки ◦ куда доставлять (k8s, сервер, CI-CD, …) ◦ как доставлять (файл, JSON, …) • автоматика синхронизирует slave c мастером • все slave недоступны на изменение руками 25
  21. Идея для авторизации: Ownership-based подход • у каждого секрета есть

    владелец (тот кто его создал или его группа) • владелец может делать с ним что хочет ◦ выкладывать в k8s (генерируется политика, создаётся slave-копия) ◦ выкладывать на сервер (генерируется политика, создаётся slave-копия) ◦ выкладывать в CI/CD (нутыпонел...) ◦ передавать другому владельцу ◦ показывать кому-то ещё ◦ генерировать новые ACL для доступа к секрету 26
  22. Идея для делегирования: шаблон ACL 27 • администратору Vault управляет

    шаблонами ACL • при записи в шаблон можно менять только параметры ACL • у каждого шаблона есть имя => есть префикс в Vault • имея префикс, можно давать на него доступ другими ACL • адресаты ACL, созданных по шаблону, тоже параметризованы
  23. Идея для делегирования: шаблон ACL path “policy-mgr/create/k8s-microservice“ { capabilities =

    [“read”, “update”, “delete”] } ACL на создание ACL: даёт права создавать новые ACL по шаблону (назначается делегату) 28 path “/k8s/{{ .Cluster }}/{{ .Namespace }}/{{ .Service }}” { capabilities = [“read”, “update”, ...] } шаблон ACL
  24. Идея: генератор policy по шаблону 29 создаётся политика k8s/some-srv path

    “/k8s/prod/some-ns/some-srv” { capabilities = [“read”, “update”, ...] } $ vault write policy-mgr/create/k8s-microservice \ cluster=prod \ namespace=some-ns \ service=some-srv
  25. Идея: генератор policy по шаблону $ vault write policy-mgr/assign/k8s/some-srv-rw group=some-group

    когда политика создана, разрешает создателю привязать её к чему угодно или как-то ограничить его Этот шаг уже необязательный! Права на запись в /k8s/prod/some-namespace/some-service автоматически выдаются владельцу, т.к. он сгенерировал политику 30
  26. Полезные ссылки 32 • https://www.vaultproject.io/ • https://github.com/jovandeginste/hiera-router • https://github.com/jsok/hiera-vault •

    https://www.owasp.org/index.php/Security_Champions • https://blog.jetbrains.com/teamcity/2017/09/vault/ • https://github.com/oracle/kubernetes-vault-kms-plugin/